execweave 0.7.0__tar.gz → 0.7.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.
- execweave-0.7.1/.github/workflows/cleanup-workflow-history.yml +98 -0
- {execweave-0.7.0 → execweave-0.7.1}/PKG-INFO +3 -3
- {execweave-0.7.0 → execweave-0.7.1}/README.md +2 -2
- {execweave-0.7.0 → execweave-0.7.1}/pyproject.toml +2 -2
- {execweave-0.7.0 → execweave-0.7.1}/scripts/audit_i18n_parity.py +1 -2
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/__init__.py +1 -1
- execweave-0.7.1/src/execweave/codex_conversation.py +289 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/codex_hook_cli.py +23 -8
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/conversation_archive.py +97 -0
- execweave-0.7.1/src/execweave/conversation_preview.py +686 -0
- execweave-0.7.1/src/execweave/conversation_records.py +479 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/live.py +11 -1
- execweave-0.7.1/src/execweave/viewer_conversation_panel.py +101 -0
- execweave-0.7.1/src/execweave/viewer_conversation_tree.py +92 -0
- execweave-0.7.1/src/execweave/viewer_dashboard_clean.py +195 -0
- execweave-0.7.1/src/execweave/viewer_dashboard_focus.py +71 -0
- execweave-0.7.1/src/execweave/viewer_live_layout.py +61 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/viewer_projection.py +28 -9
- execweave-0.7.1/tests/test_codex_archive_full_fidelity.py +196 -0
- execweave-0.7.1/tests/test_conversation_provider_parity.py +487 -0
- execweave-0.7.1/tests/test_dashboard_information_architecture.py +240 -0
- execweave-0.7.1/tests/test_dashboard_simplification.py +205 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_v069_dashboard_release.py +4 -5
- execweave-0.7.0/src/execweave/conversation_records.py +0 -209
- execweave-0.7.0/src/execweave/viewer_conversation_panel.py +0 -65
- {execweave-0.7.0 → execweave-0.7.1}/.github/workflows/ci.yml +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/.github/workflows/i18n.yml +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/.github/workflows/package-benchmark.yml +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/.github/workflows/package-smoke.yml +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/.github/workflows/publish.yml +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/.github/workflows/scalability.yml +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/.github/workflows/wheel-smoke.yml +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/.github/workflows/windows-launcher.yml +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/.gitignore +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/LICENSE +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/README.de.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/README.fr.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/README.ja.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/README.ko.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/README.ru.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/README.zh-CN.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/README.zh-TW.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/benchmarks/phase1_overhead.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/antigravity-hooks.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/assets/codex.gif +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/benchmarks/README.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/benchmarks/v0.6.0-github-actions.json +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/benchmarks/v0.6.0-github-actions.svg +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/claude-code-hooks.de.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/claude-code-hooks.fr.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/claude-code-hooks.ja.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/claude-code-hooks.ko.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/claude-code-hooks.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/claude-code-hooks.ru.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/claude-code-hooks.zh-CN.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/claude-code-hooks.zh-TW.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/codex-hooks.de.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/codex-hooks.fr.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/codex-hooks.ja.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/codex-hooks.ko.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/codex-hooks.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/codex-hooks.ru.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/codex-hooks.zh-CN.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/codex-hooks.zh-TW.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/cursor-hooks.de.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/cursor-hooks.fr.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/cursor-hooks.ja.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/cursor-hooks.ko.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/cursor-hooks.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/cursor-hooks.ru.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/cursor-hooks.zh-CN.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/cursor-hooks.zh-TW.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/evidence-grades.de.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/evidence-grades.fr.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/evidence-grades.ja.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/evidence-grades.ko.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/evidence-grades.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/evidence-grades.ru.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/evidence-grades.zh-CN.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/evidence-grades.zh-TW.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/gemini-hooks.de.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/gemini-hooks.fr.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/gemini-hooks.ja.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/gemini-hooks.ko.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/gemini-hooks.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/gemini-hooks.ru.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/gemini-hooks.zh-CN.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/gemini-hooks.zh-TW.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/inference-gateway.de.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/inference-gateway.fr.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/inference-gateway.ja.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/inference-gateway.ko.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/inference-gateway.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/inference-gateway.ru.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/inference-gateway.zh-CN.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/inference-gateway.zh-TW.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/live-graph.de.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/live-graph.fr.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/live-graph.ja.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/live-graph.ko.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/live-graph.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/live-graph.ru.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/live-graph.zh-CN.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/live-graph.zh-TW.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/model-runtime.de.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/model-runtime.fr.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/model-runtime.ja.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/model-runtime.ko.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/model-runtime.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/model-runtime.ru.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/model-runtime.zh-CN.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/model-runtime.zh-TW.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/opencode-plugin.de.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/opencode-plugin.fr.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/opencode-plugin.ja.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/opencode-plugin.ko.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/opencode-plugin.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/opencode-plugin.ru.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/opencode-plugin.zh-CN.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/opencode-plugin.zh-TW.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/phase-1-runtime-collection.de.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/phase-1-runtime-collection.fr.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/phase-1-runtime-collection.ja.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/phase-1-runtime-collection.ko.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/phase-1-runtime-collection.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/phase-1-runtime-collection.ru.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/phase-1-runtime-collection.zh-CN.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/phase-1-runtime-collection.zh-TW.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/phase-2-execution-graph.de.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/phase-2-execution-graph.fr.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/phase-2-execution-graph.ja.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/phase-2-execution-graph.ko.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/phase-2-execution-graph.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/phase-2-execution-graph.ru.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/phase-2-execution-graph.zh-CN.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/phase-2-execution-graph.zh-TW.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/rule-packs.de.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/rule-packs.fr.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/rule-packs.ja.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/rule-packs.ko.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/rule-packs.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/rule-packs.ru.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/rule-packs.zh-CN.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/rule-packs.zh-TW.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/run-integrity.de.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/run-integrity.fr.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/run-integrity.ja.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/run-integrity.ko.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/run-integrity.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/run-integrity.ru.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/run-integrity.zh-CN.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/run-integrity.zh-TW.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/runtime-threat-model.de.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/runtime-threat-model.fr.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/runtime-threat-model.ja.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/runtime-threat-model.ko.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/runtime-threat-model.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/runtime-threat-model.ru.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/runtime-threat-model.zh-CN.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/runtime-threat-model.zh-TW.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/security-analysis.de.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/security-analysis.fr.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/security-analysis.ja.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/security-analysis.ko.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/security-analysis.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/security-analysis.ru.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/security-analysis.zh-CN.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/security-analysis.zh-TW.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/semantic-telemetry.de.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/semantic-telemetry.fr.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/semantic-telemetry.ja.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/semantic-telemetry.ko.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/semantic-telemetry.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/semantic-telemetry.ru.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/semantic-telemetry.zh-CN.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/semantic-telemetry.zh-TW.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/docs/v0.6.5-hardening-decisions.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/scripts/check_claude_hook.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/scripts/check_claude_record_graph.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/scripts/check_codex_hook.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/scripts/check_correlation_graph.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/scripts/check_inference_gateway_cli.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/scripts/check_model_runtime_cli.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/scripts/check_openai_compatible_cli.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/scripts/check_semantic_graph.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/scripts/check_viewer_js.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/scripts/check_wheel_install.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/scripts/check_windows_launchers.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/scripts/emit_claude_hook_smoke.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/scripts/emit_cursor_hook_smoke.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/scripts/emit_gemini_hook_smoke.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/scripts/emit_opencode_plugin_smoke.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/scripts/make_semantic_smoke.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/scripts/sync_i18n_nav.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/__main__.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/agent_bootstrap.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/agent_trace.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/analysis.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/anthropic.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/anthropic_cli.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/anthropic_full_fidelity.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/antigravity_adapter.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/antigravity_adapter_base.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/antigravity_full_fidelity.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/antigravity_full_fidelity_base.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/antigravity_full_fidelity_collaboration_base.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/antigravity_hook_cli.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/antigravity_record.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/antigravity_subagent_linkage.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/antigravity_trace_capability.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/auto_specialized.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/backends.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/benchmark.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/claude_adapter.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/claude_delegation.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/claude_full_fidelity.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/claude_hook_cli.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/claude_hook_contract.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/claude_model_observer.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/claude_record.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/cli.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/codex_adapter.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/codex_full_fidelity.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/codex_hook_lifecycle.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/codex_message_diagnostics.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/codex_message_transport_diagnostics.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/codex_record.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/codex_rollout_structures.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/codex_rollout_trace.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/codex_rollout_trace_base.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/collector.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/command.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/content_evidence.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/content_store.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/correlation.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/cursor_adapter.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/cursor_delegation.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/cursor_delegation_base.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/cursor_full_fidelity.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/cursor_hook_cli.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/cursor_hook_contract.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/cursor_record.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/entry.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/evidence_grade.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/fidelity.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/filesystem.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/focus.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/gemini_adapter.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/gemini_full_fidelity.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/gemini_hook_cli.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/gemini_hook_contract.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/gemini_record.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/graph.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/graph_ops.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/http_proxy.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/http_proxy_cli.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/inference_gateway.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/inference_gateway_cli.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/inference_gateway_full_fidelity.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/inference_identity.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/inference_identity_cli.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/integrity.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/integrity_cli.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/litellm_callback.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/litellm_callback_cli.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/live_core.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/live_view.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/live_view_extra_style.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/live_view_markup.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/live_view_script_a.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/live_view_script_b.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/live_view_script_c.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/live_view_script_d.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/live_view_style.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/model_runtime.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/model_runtime_cli.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/model_runtime_full_fidelity.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/openai_compatible.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/openai_compatible_cli.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/openai_compatible_full_fidelity.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/opencode_adapter.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/opencode_event_contract.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/opencode_full_fidelity.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/opencode_hook_cli.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/opencode_plugin_cli.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/opencode_record.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/opencode_task_linkage.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/overhead_benchmark.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/provider_lifecycle.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/provider_record.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/rule_pack.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/rule_pack_cli.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/scalability_benchmark.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/schema.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/scope.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/semantic.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/sink.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/strace_backend.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/theme.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/top.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/top_cli.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/validate.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/view_cli.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/viewer.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/viewer_antigravity_linkage_inspector.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/viewer_content_inspector.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/viewer_execution_inspector.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/viewer_projection_base.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/src/execweave/workflow.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/fixtures/hooks/README.md +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/fixtures/hooks/claude.json +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/fixtures/hooks/codex.json +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/fixtures/hooks/cursor.json +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/fixtures/hooks/gemini.json +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/fixtures/hooks/manifest.json +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/fixtures/hooks/opencode.json +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_agent_bootstrap.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_agent_message_viewer.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_agent_trace_lifecycle.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_agent_trace_viewer_visibility.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_analysis.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_anthropic.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_antigravity_agent_collaboration.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_antigravity_cursor_launch.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_antigravity_lifecycle.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_antigravity_linkage_projection.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_antigravity_official_contract.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_antigravity_subagent_transcript_linkage.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_antigravity_trace_capability_cli.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_auto_specialized.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_backends.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_claude_adapter.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_claude_delegation.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_claude_full_fidelity.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_claude_hook_contract.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_claude_hook_metadata.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_claude_hook_viewer.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_claude_model_observer.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_claude_record.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_codex_adapter.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_codex_full_fidelity.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_codex_hook_lifecycle.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_codex_message_diagnostics.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_codex_message_transport_diagnostics.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_codex_record.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_codex_reducer_command.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_codex_rollout_structures.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_codex_rollout_trace.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_collector.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_command.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_condense.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_conversation_access.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_correlation.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_correlation_canonical_path.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_correlation_checker.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_correlation_process_exe.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_cross_provider_agent_trace.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_cursor_adapter.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_cursor_delegation.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_cursor_full_fidelity.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_cursor_hook_contract.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_cursor_hook_fail_open.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_cursor_record.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_cursor_task_linkage.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_dashboard_ux_and_hook_projection.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_delegation_viewer.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_evidence_grade.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_execution_viewer.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_fidelity.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_filesystem_resilience.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_focus.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_full_fidelity.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_gemini_adapter.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_gemini_full_fidelity.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_gemini_hook_contract.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_gemini_lifecycle.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_gemini_record.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_graph.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_graph_ops.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_hook_fixture_corpus.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_http_proxy.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_inference_gateway.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_inference_gateway_full_fidelity.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_inference_identity.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_integrity.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_litellm_callback.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_live.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_live_auth.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_live_dashboard.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_live_dashboard_js.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_live_delta.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_live_logs_export.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_live_theme.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_lmstudio_auto_specialized.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_model_runtime.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_model_runtime_full_fidelity.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_openai_compatible.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_opencode_adapter.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_opencode_event_contract.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_opencode_event_lifecycle.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_opencode_full_fidelity.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_opencode_plugin.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_opencode_record.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_opencode_task_session_linkage.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_overhead_benchmark.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_provider_lifecycle.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_rule_pack.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_schema.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_scope.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_semantic.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_strace_backend.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_threat_model.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_top_detached.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_v063_features.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_v064_live_auto_integrations.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_v064_live_evidence.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_validate.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_version.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_viewer.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_viewer_content_inspector.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_viewer_projection.py +0 -0
- {execweave-0.7.0 → execweave-0.7.1}/tests/test_workflow.py +0 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
name: Cleanup workflow history
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
paths:
|
|
7
|
+
- .github/workflows/cleanup-workflow-history.yml
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
|
|
10
|
+
permissions:
|
|
11
|
+
contents: read
|
|
12
|
+
actions: write
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
cleanup:
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
steps:
|
|
18
|
+
- name: Delete superseded completed workflow runs
|
|
19
|
+
env:
|
|
20
|
+
GH_TOKEN: ${{ github.token }}
|
|
21
|
+
REPOSITORY: ${{ github.repository }}
|
|
22
|
+
CURRENT_RUN_ID: ${{ github.run_id }}
|
|
23
|
+
V070_PUBLISH_RUN_ID: "33179361863"
|
|
24
|
+
run: |
|
|
25
|
+
python - <<'PY'
|
|
26
|
+
import json
|
|
27
|
+
import os
|
|
28
|
+
import urllib.error
|
|
29
|
+
import urllib.request
|
|
30
|
+
|
|
31
|
+
repo = os.environ["REPOSITORY"]
|
|
32
|
+
token = os.environ["GH_TOKEN"]
|
|
33
|
+
current_run_id = int(os.environ["CURRENT_RUN_ID"])
|
|
34
|
+
protected_publish_run_id = int(os.environ["V070_PUBLISH_RUN_ID"])
|
|
35
|
+
api = f"https://api.github.com/repos/{repo}"
|
|
36
|
+
headers = {
|
|
37
|
+
"Accept": "application/vnd.github+json",
|
|
38
|
+
"Authorization": f"Bearer {token}",
|
|
39
|
+
"X-GitHub-Api-Version": "2022-11-28",
|
|
40
|
+
"User-Agent": "execweave-workflow-history-cleanup",
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
def request_json(url):
|
|
44
|
+
req = urllib.request.Request(url, headers=headers)
|
|
45
|
+
with urllib.request.urlopen(req) as response:
|
|
46
|
+
return json.load(response)
|
|
47
|
+
|
|
48
|
+
runs = []
|
|
49
|
+
page = 1
|
|
50
|
+
while True:
|
|
51
|
+
payload = request_json(f"{api}/actions/runs?per_page=100&page={page}")
|
|
52
|
+
batch = payload.get("workflow_runs", [])
|
|
53
|
+
runs.extend(batch)
|
|
54
|
+
if len(batch) < 100:
|
|
55
|
+
break
|
|
56
|
+
page += 1
|
|
57
|
+
|
|
58
|
+
completed = [run for run in runs if run.get("status") == "completed"]
|
|
59
|
+
completed.sort(key=lambda run: run.get("created_at", ""), reverse=True)
|
|
60
|
+
|
|
61
|
+
keep = {current_run_id, protected_publish_run_id}
|
|
62
|
+
seen_success = set()
|
|
63
|
+
seen_failure = set()
|
|
64
|
+
|
|
65
|
+
for run in completed:
|
|
66
|
+
workflow_id = run.get("workflow_id")
|
|
67
|
+
conclusion = run.get("conclusion")
|
|
68
|
+
if conclusion == "success" and workflow_id not in seen_success:
|
|
69
|
+
keep.add(run["id"])
|
|
70
|
+
seen_success.add(workflow_id)
|
|
71
|
+
elif conclusion != "success" and workflow_id not in seen_failure:
|
|
72
|
+
keep.add(run["id"])
|
|
73
|
+
seen_failure.add(workflow_id)
|
|
74
|
+
|
|
75
|
+
delete_ids = [run["id"] for run in completed if run["id"] not in keep]
|
|
76
|
+
deleted = 0
|
|
77
|
+
failed = []
|
|
78
|
+
for run_id in delete_ids:
|
|
79
|
+
req = urllib.request.Request(
|
|
80
|
+
f"{api}/actions/runs/{run_id}",
|
|
81
|
+
headers=headers,
|
|
82
|
+
method="DELETE",
|
|
83
|
+
)
|
|
84
|
+
try:
|
|
85
|
+
with urllib.request.urlopen(req) as response:
|
|
86
|
+
if response.status == 204:
|
|
87
|
+
deleted += 1
|
|
88
|
+
except urllib.error.HTTPError as exc:
|
|
89
|
+
failed.append((run_id, exc.code))
|
|
90
|
+
|
|
91
|
+
print(f"workflow runs discovered: {len(runs)}")
|
|
92
|
+
print(f"completed runs considered: {len(completed)}")
|
|
93
|
+
print(f"protected runs: {len(keep)}")
|
|
94
|
+
print(f"deleted runs: {deleted}")
|
|
95
|
+
if failed:
|
|
96
|
+
print(f"failed deletions: {failed}")
|
|
97
|
+
raise SystemExit(1)
|
|
98
|
+
PY
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: execweave
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.1
|
|
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
|
|
@@ -82,7 +82,7 @@ Install the latest published wheel/sdist from PyPI:
|
|
|
82
82
|
python -m pip install -U execweave
|
|
83
83
|
```
|
|
84
84
|
|
|
85
|
-
The current release is **v0.7.
|
|
85
|
+
The current release is **v0.7.1**.
|
|
86
86
|
|
|
87
87
|
For development:
|
|
88
88
|
|
|
@@ -327,7 +327,7 @@ Do not assume content has been secret-redacted. Commands, paths, endpoint metada
|
|
|
327
327
|
|
|
328
328
|
## Current status
|
|
329
329
|
|
|
330
|
-
v0.7.
|
|
330
|
+
v0.7.1 combines cross-platform runtime collection, materialized execution graphs, standalone/live viewing, conservative provider↔runtime correlation, full-fidelity content-addressed provider evidence, attributable multi-agent execution traces, direct run-local conversation access, evidence grades, bounded rule packs, an explicit runtime threat/fidelity contract, and honest local run-integrity sealing. Observed evidence and inference remain separate by design.
|
|
331
331
|
|
|
332
332
|
## Documentation
|
|
333
333
|
|
|
@@ -31,7 +31,7 @@ Install the latest published wheel/sdist from PyPI:
|
|
|
31
31
|
python -m pip install -U execweave
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
-
The current release is **v0.7.
|
|
34
|
+
The current release is **v0.7.1**.
|
|
35
35
|
|
|
36
36
|
For development:
|
|
37
37
|
|
|
@@ -276,7 +276,7 @@ Do not assume content has been secret-redacted. Commands, paths, endpoint metada
|
|
|
276
276
|
|
|
277
277
|
## Current status
|
|
278
278
|
|
|
279
|
-
v0.7.
|
|
279
|
+
v0.7.1 combines cross-platform runtime collection, materialized execution graphs, standalone/live viewing, conservative provider↔runtime correlation, full-fidelity content-addressed provider evidence, attributable multi-agent execution traces, direct run-local conversation access, evidence grades, bounded rule packs, an explicit runtime threat/fidelity contract, and honest local run-integrity sealing. Observed evidence and inference remain separate by design.
|
|
280
280
|
|
|
281
281
|
## Documentation
|
|
282
282
|
|
|
@@ -4,8 +4,8 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "execweave"
|
|
7
|
-
# ExecWeave v0.7.
|
|
8
|
-
version = "0.7.
|
|
7
|
+
# ExecWeave v0.7.1 release metadata
|
|
8
|
+
version = "0.7.1"
|
|
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"
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import os
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
_MAX_IDENTITY_SCAN_LINES = 64
|
|
9
|
+
_MAX_PREVIEW_MESSAGES = 80
|
|
10
|
+
_MAX_PREVIEW_TEXT_CHARS = 6000
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _canonical_absolute_path(value: object) -> Path | None:
|
|
14
|
+
if not isinstance(value, str) or not value:
|
|
15
|
+
return None
|
|
16
|
+
try:
|
|
17
|
+
path = Path(value).expanduser()
|
|
18
|
+
if not path.is_absolute():
|
|
19
|
+
return None
|
|
20
|
+
return path.resolve(strict=False)
|
|
21
|
+
except (OSError, RuntimeError, ValueError):
|
|
22
|
+
return None
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _codex_sessions_root() -> Path:
|
|
26
|
+
configured = os.environ.get("CODEX_HOME")
|
|
27
|
+
home = Path(configured).expanduser() if configured else Path.home() / ".codex"
|
|
28
|
+
return (home / "sessions").resolve(strict=False)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _inside_codex_sessions(path: Path) -> bool:
|
|
32
|
+
try:
|
|
33
|
+
path.relative_to(_codex_sessions_root())
|
|
34
|
+
except ValueError:
|
|
35
|
+
return False
|
|
36
|
+
return True
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _session_meta_identity(payload: dict[str, Any]) -> dict[str, Any] | None:
|
|
40
|
+
thread_id = payload.get("id") or payload.get("session_id")
|
|
41
|
+
if not isinstance(thread_id, str) or not thread_id:
|
|
42
|
+
return None
|
|
43
|
+
source = payload.get("source")
|
|
44
|
+
spawn: dict[str, Any] = {}
|
|
45
|
+
if isinstance(source, dict):
|
|
46
|
+
subagent = source.get("subagent")
|
|
47
|
+
if isinstance(subagent, dict):
|
|
48
|
+
candidate = subagent.get("thread_spawn")
|
|
49
|
+
if isinstance(candidate, dict):
|
|
50
|
+
spawn = candidate
|
|
51
|
+
agent_path = payload.get("agent_path") or spawn.get("agent_path")
|
|
52
|
+
nickname = payload.get("agent_nickname") or spawn.get("agent_nickname")
|
|
53
|
+
parent_thread_id = payload.get("parent_thread_id") or spawn.get("parent_thread_id")
|
|
54
|
+
history_start = payload.get("subagent_history_start_ordinal")
|
|
55
|
+
return {
|
|
56
|
+
"thread_id": thread_id,
|
|
57
|
+
"parent_thread_id": parent_thread_id if isinstance(parent_thread_id, str) else None,
|
|
58
|
+
"agent_path": agent_path if isinstance(agent_path, str) else None,
|
|
59
|
+
"agent_nickname": nickname if isinstance(nickname, str) else None,
|
|
60
|
+
"subagent_history_start_ordinal": (
|
|
61
|
+
history_start
|
|
62
|
+
if isinstance(history_start, int) and not isinstance(history_start, bool) and history_start >= 0
|
|
63
|
+
else None
|
|
64
|
+
),
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def codex_rollout_identity(path: str | Path) -> dict[str, Any] | None:
|
|
69
|
+
"""Read only leading Codex session metadata needed for exact thread identity."""
|
|
70
|
+
source = Path(path).expanduser().resolve(strict=False)
|
|
71
|
+
try:
|
|
72
|
+
with source.open("r", encoding="utf-8") as handle:
|
|
73
|
+
for index, line in enumerate(handle):
|
|
74
|
+
if index >= _MAX_IDENTITY_SCAN_LINES:
|
|
75
|
+
break
|
|
76
|
+
if not line.strip():
|
|
77
|
+
continue
|
|
78
|
+
try:
|
|
79
|
+
record = json.loads(line)
|
|
80
|
+
except json.JSONDecodeError:
|
|
81
|
+
return None
|
|
82
|
+
if record.get("type") != "session_meta":
|
|
83
|
+
continue
|
|
84
|
+
payload = record.get("payload")
|
|
85
|
+
return _session_meta_identity(payload) if isinstance(payload, dict) else None
|
|
86
|
+
except (OSError, RuntimeError, UnicodeError):
|
|
87
|
+
return None
|
|
88
|
+
return None
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def validated_codex_transcript(payload: dict[str, Any]) -> tuple[Path, dict[str, Any]] | None:
|
|
92
|
+
"""Validate a hook-supplied rollout path before ExecWeave reads or copies it."""
|
|
93
|
+
path = _canonical_absolute_path(payload.get("transcript_path"))
|
|
94
|
+
if path is None or path.suffix.lower() != ".jsonl" or not path.name.startswith("rollout-"):
|
|
95
|
+
return None
|
|
96
|
+
if not _inside_codex_sessions(path) or not path.is_file():
|
|
97
|
+
return None
|
|
98
|
+
agent_id = payload.get("agent_id")
|
|
99
|
+
session_id = payload.get("session_id")
|
|
100
|
+
expected = agent_id if isinstance(agent_id, str) and agent_id else session_id
|
|
101
|
+
if not isinstance(expected, str) or not expected or not path.stem.endswith(f"-{expected}"):
|
|
102
|
+
return None
|
|
103
|
+
identity = codex_rollout_identity(path)
|
|
104
|
+
if identity is None or identity.get("thread_id") != expected:
|
|
105
|
+
return None
|
|
106
|
+
if isinstance(agent_id, str) and agent_id and isinstance(session_id, str) and session_id:
|
|
107
|
+
parent = identity.get("parent_thread_id")
|
|
108
|
+
if isinstance(parent, str) and parent and parent != session_id:
|
|
109
|
+
return None
|
|
110
|
+
return path, identity
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def codex_rollout_identity_from_payload(payload: dict[str, Any]) -> dict[str, Any] | None:
|
|
114
|
+
validated = validated_codex_transcript(payload)
|
|
115
|
+
return validated[1] if validated is not None else None
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def _content_text(content: object) -> str:
|
|
119
|
+
if not isinstance(content, list):
|
|
120
|
+
return ""
|
|
121
|
+
parts: list[str] = []
|
|
122
|
+
for part in content:
|
|
123
|
+
if not isinstance(part, dict) or part.get("type") not in {"input_text", "output_text", "Text"}:
|
|
124
|
+
continue
|
|
125
|
+
text = part.get("text")
|
|
126
|
+
if isinstance(text, str) and text:
|
|
127
|
+
parts.append(text)
|
|
128
|
+
return "\n".join(parts).strip()
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def _trim_text(value: str) -> str:
|
|
132
|
+
if len(value) <= _MAX_PREVIEW_TEXT_CHARS:
|
|
133
|
+
return value
|
|
134
|
+
return value[: _MAX_PREVIEW_TEXT_CHARS - 1] + "…"
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def _agent_message_header(text: str) -> dict[str, str]:
|
|
138
|
+
result: dict[str, str] = {}
|
|
139
|
+
before_payload, marker, after_payload = text.partition("Payload:")
|
|
140
|
+
for line in before_payload.splitlines():
|
|
141
|
+
key, separator, value = line.partition(":")
|
|
142
|
+
if not separator:
|
|
143
|
+
continue
|
|
144
|
+
normalized = key.strip().lower().replace(" ", "_")
|
|
145
|
+
if normalized in {"message_type", "task_name", "sender"} and value.strip():
|
|
146
|
+
result[normalized] = value.strip()
|
|
147
|
+
if marker and after_payload.strip():
|
|
148
|
+
result["payload_text"] = after_payload.strip()
|
|
149
|
+
return result
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def _message(timestamp: object, ordinal: object, **fields: Any) -> dict[str, Any]:
|
|
153
|
+
return {
|
|
154
|
+
"timestamp": timestamp if isinstance(timestamp, str) else None,
|
|
155
|
+
"ordinal": ordinal if isinstance(ordinal, int) and not isinstance(ordinal, bool) else None,
|
|
156
|
+
**fields,
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def codex_rollout_preview(path: str | Path) -> dict[str, Any] | None:
|
|
161
|
+
"""Extract visible conversation items without exposing hidden/system context."""
|
|
162
|
+
source = Path(path).expanduser().resolve(strict=False)
|
|
163
|
+
identity = codex_rollout_identity(source)
|
|
164
|
+
if identity is None:
|
|
165
|
+
return None
|
|
166
|
+
cutoff = identity.get("subagent_history_start_ordinal")
|
|
167
|
+
min_ordinal = cutoff if isinstance(cutoff, int) else 0
|
|
168
|
+
agent_path = identity.get("agent_path")
|
|
169
|
+
if not isinstance(agent_path, str) or not agent_path:
|
|
170
|
+
agent_path = "/root" if identity.get("parent_thread_id") is None else None
|
|
171
|
+
messages: list[dict[str, Any]] = []
|
|
172
|
+
try:
|
|
173
|
+
with source.open("r", encoding="utf-8") as handle:
|
|
174
|
+
for line in handle:
|
|
175
|
+
if not line.strip():
|
|
176
|
+
continue
|
|
177
|
+
try:
|
|
178
|
+
record = json.loads(line)
|
|
179
|
+
except json.JSONDecodeError:
|
|
180
|
+
continue
|
|
181
|
+
ordinal = record.get("ordinal")
|
|
182
|
+
if isinstance(ordinal, int) and ordinal < min_ordinal:
|
|
183
|
+
continue
|
|
184
|
+
if record.get("type") != "response_item":
|
|
185
|
+
continue
|
|
186
|
+
payload = record.get("payload")
|
|
187
|
+
if not isinstance(payload, dict):
|
|
188
|
+
continue
|
|
189
|
+
payload_type = payload.get("type")
|
|
190
|
+
if payload_type == "agent_message":
|
|
191
|
+
content = payload.get("content")
|
|
192
|
+
header = _agent_message_header(_content_text(content))
|
|
193
|
+
encrypted = isinstance(content, list) and any(
|
|
194
|
+
isinstance(part, dict) and part.get("type") == "encrypted_content"
|
|
195
|
+
for part in content
|
|
196
|
+
)
|
|
197
|
+
messages.append(
|
|
198
|
+
_message(
|
|
199
|
+
record.get("timestamp"),
|
|
200
|
+
ordinal,
|
|
201
|
+
kind=header.get("message_type", "agent_message").lower(),
|
|
202
|
+
sender=payload.get("author") or header.get("sender"),
|
|
203
|
+
recipient=payload.get("recipient"),
|
|
204
|
+
text=None if encrypted else header.get("payload_text"),
|
|
205
|
+
content_state="provider_encrypted" if encrypted else "plaintext",
|
|
206
|
+
phase=None,
|
|
207
|
+
task_name=header.get("task_name"),
|
|
208
|
+
)
|
|
209
|
+
)
|
|
210
|
+
elif payload_type == "message":
|
|
211
|
+
role = payload.get("role")
|
|
212
|
+
phase = payload.get("phase")
|
|
213
|
+
text = _content_text(payload.get("content"))
|
|
214
|
+
if role == "assistant" and text and phase in {"commentary", "final_answer"}:
|
|
215
|
+
messages.append(
|
|
216
|
+
_message(
|
|
217
|
+
record.get("timestamp"),
|
|
218
|
+
ordinal,
|
|
219
|
+
kind="assistant_message",
|
|
220
|
+
sender=agent_path,
|
|
221
|
+
recipient=None,
|
|
222
|
+
text=_trim_text(text),
|
|
223
|
+
content_state="plaintext",
|
|
224
|
+
phase=phase,
|
|
225
|
+
task_name=None,
|
|
226
|
+
)
|
|
227
|
+
)
|
|
228
|
+
elif role == "user" and text:
|
|
229
|
+
metadata = payload.get("internal_chat_message_metadata_passthrough")
|
|
230
|
+
kinds = metadata.get("content_item_kinds") if isinstance(metadata, dict) else None
|
|
231
|
+
if isinstance(kinds, list) and "user.text" in kinds:
|
|
232
|
+
messages.append(
|
|
233
|
+
_message(
|
|
234
|
+
record.get("timestamp"),
|
|
235
|
+
ordinal,
|
|
236
|
+
kind="user_message",
|
|
237
|
+
sender="user",
|
|
238
|
+
recipient=agent_path,
|
|
239
|
+
text=_trim_text(text),
|
|
240
|
+
content_state="plaintext",
|
|
241
|
+
phase=None,
|
|
242
|
+
task_name=None,
|
|
243
|
+
)
|
|
244
|
+
)
|
|
245
|
+
elif (
|
|
246
|
+
payload_type == "function_call"
|
|
247
|
+
and payload.get("namespace") == "collaboration"
|
|
248
|
+
and payload.get("name") == "send_message"
|
|
249
|
+
):
|
|
250
|
+
arguments = payload.get("arguments")
|
|
251
|
+
try:
|
|
252
|
+
parsed = json.loads(arguments) if isinstance(arguments, str) else arguments
|
|
253
|
+
except json.JSONDecodeError:
|
|
254
|
+
parsed = None
|
|
255
|
+
if isinstance(parsed, dict):
|
|
256
|
+
target = parsed.get("target")
|
|
257
|
+
value = parsed.get("message")
|
|
258
|
+
encrypted = isinstance(value, str) and value.startswith("gAAAAA")
|
|
259
|
+
messages.append(
|
|
260
|
+
_message(
|
|
261
|
+
record.get("timestamp"),
|
|
262
|
+
ordinal,
|
|
263
|
+
kind="send_message",
|
|
264
|
+
sender=agent_path,
|
|
265
|
+
recipient=target if isinstance(target, str) else None,
|
|
266
|
+
text=(
|
|
267
|
+
_trim_text(value)
|
|
268
|
+
if isinstance(value, str) and value and not encrypted
|
|
269
|
+
else None
|
|
270
|
+
),
|
|
271
|
+
content_state="provider_encrypted" if encrypted else "plaintext",
|
|
272
|
+
phase=None,
|
|
273
|
+
task_name=None,
|
|
274
|
+
)
|
|
275
|
+
)
|
|
276
|
+
except (OSError, RuntimeError, UnicodeError):
|
|
277
|
+
return None
|
|
278
|
+
truncated = len(messages) > _MAX_PREVIEW_MESSAGES
|
|
279
|
+
if truncated:
|
|
280
|
+
messages = messages[:10] + messages[-(_MAX_PREVIEW_MESSAGES - 10) :]
|
|
281
|
+
return {
|
|
282
|
+
"thread_id": identity.get("thread_id"),
|
|
283
|
+
"parent_thread_id": identity.get("parent_thread_id"),
|
|
284
|
+
"agent_path": agent_path,
|
|
285
|
+
"agent_nickname": identity.get("agent_nickname"),
|
|
286
|
+
"message_count": len(messages),
|
|
287
|
+
"messages_truncated": truncated,
|
|
288
|
+
"messages": messages,
|
|
289
|
+
}
|
|
@@ -20,6 +20,7 @@ from .codex_hook_lifecycle import (
|
|
|
20
20
|
codex_official_hook_lifecycle_events,
|
|
21
21
|
)
|
|
22
22
|
from .content_store import FullFidelityContentStore
|
|
23
|
+
from .conversation_archive import codex_conversation_archive_events
|
|
23
24
|
|
|
24
25
|
|
|
25
26
|
def _hook_handler(command: str) -> dict[str, str]:
|
|
@@ -30,6 +31,21 @@ def _now() -> str:
|
|
|
30
31
|
return datetime.now(timezone.utc).isoformat().replace("+00:00", "Z")
|
|
31
32
|
|
|
32
33
|
|
|
34
|
+
def _codex_trace_visibility_event(timestamp: str) -> dict[str, Any]:
|
|
35
|
+
return provider_agent_trace_visibility_event(
|
|
36
|
+
"codex",
|
|
37
|
+
timestamp=timestamp,
|
|
38
|
+
source={
|
|
39
|
+
"type": "agent",
|
|
40
|
+
"id": "agent:OpenAI Codex",
|
|
41
|
+
"name": "OpenAI Codex",
|
|
42
|
+
"attributes": {"provider": "codex"},
|
|
43
|
+
},
|
|
44
|
+
attribution="codex_hook",
|
|
45
|
+
evidence_source="provider_hook",
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
|
|
33
49
|
def codex_hook_config(command: str = "execweave-codex-hook") -> dict[str, Any]:
|
|
34
50
|
handler = _hook_handler(command)
|
|
35
51
|
tool_group = {"matcher": "*", "hooks": [handler]}
|
|
@@ -126,14 +142,7 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
126
142
|
codex_official_hook_lifecycle_events(payload, timestamp=observed_at)
|
|
127
143
|
)
|
|
128
144
|
if payload.get("hook_event_name") == "SessionStart":
|
|
129
|
-
summary_records.append(
|
|
130
|
-
provider_agent_trace_visibility_event(
|
|
131
|
-
"codex",
|
|
132
|
-
timestamp=observed_at,
|
|
133
|
-
attribution="codex_hook",
|
|
134
|
-
evidence_source="provider_hook",
|
|
135
|
-
)
|
|
136
|
-
)
|
|
145
|
+
summary_records.append(_codex_trace_visibility_event(observed_at))
|
|
137
146
|
append_semantic_records(sidecar, summary_records)
|
|
138
147
|
|
|
139
148
|
content_store = FullFidelityContentStore(sidecar.parent)
|
|
@@ -143,6 +152,12 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
143
152
|
timestamp=observed_at,
|
|
144
153
|
)
|
|
145
154
|
append_semantic_records(sidecar, content_records)
|
|
155
|
+
archive_records = codex_conversation_archive_events(
|
|
156
|
+
payload,
|
|
157
|
+
store=content_store,
|
|
158
|
+
timestamp=observed_at,
|
|
159
|
+
)
|
|
160
|
+
append_semantic_records(sidecar, archive_records)
|
|
146
161
|
except (OSError, RuntimeError, TimeoutError, TypeError, ValueError) as exc:
|
|
147
162
|
print(f"ExecWeave Codex hook warning: {exc}", file=sys.stderr)
|
|
148
163
|
return 1 if args.strict else 0
|
|
@@ -4,6 +4,7 @@ from pathlib import Path
|
|
|
4
4
|
from typing import Any
|
|
5
5
|
|
|
6
6
|
from .antigravity_subagent_linkage import validated_transcript_path as _antigravity_transcript_path
|
|
7
|
+
from .codex_conversation import validated_codex_transcript
|
|
7
8
|
from .content_evidence import content_observation_event
|
|
8
9
|
from .content_store import FullFidelityContentStore
|
|
9
10
|
|
|
@@ -182,6 +183,102 @@ def claude_conversation_archive_events(
|
|
|
182
183
|
return []
|
|
183
184
|
|
|
184
185
|
|
|
186
|
+
def codex_conversation_archive_events(
|
|
187
|
+
payload: dict[str, Any],
|
|
188
|
+
*,
|
|
189
|
+
store: FullFidelityContentStore,
|
|
190
|
+
timestamp: str,
|
|
191
|
+
) -> list[dict[str, Any]]:
|
|
192
|
+
"""Snapshot validated Codex rollout JSONL so later inspection never needs ~/.codex."""
|
|
193
|
+
hook = payload.get("hook_event_name")
|
|
194
|
+
if hook not in {"SubagentStop", "Stop", "SessionEnd"}:
|
|
195
|
+
return []
|
|
196
|
+
session_id = payload.get("session_id")
|
|
197
|
+
if not isinstance(session_id, str) or not session_id:
|
|
198
|
+
return []
|
|
199
|
+
validated = validated_codex_transcript(payload)
|
|
200
|
+
if validated is None:
|
|
201
|
+
return []
|
|
202
|
+
path, identity = validated
|
|
203
|
+
agent_id = payload.get("agent_id")
|
|
204
|
+
if hook == "SubagentStop" and isinstance(agent_id, str) and agent_id:
|
|
205
|
+
agent_path = identity.get("agent_path")
|
|
206
|
+
nickname = identity.get("agent_nickname")
|
|
207
|
+
agent_type = payload.get("agent_type")
|
|
208
|
+
name = next(
|
|
209
|
+
(
|
|
210
|
+
value
|
|
211
|
+
for value in (agent_path, nickname, agent_type, "Codex subagent")
|
|
212
|
+
if isinstance(value, str) and value
|
|
213
|
+
),
|
|
214
|
+
"Codex subagent",
|
|
215
|
+
)
|
|
216
|
+
source = _entity(
|
|
217
|
+
"agent",
|
|
218
|
+
f"agent:codex:{session_id}:subagent:{agent_id}",
|
|
219
|
+
name=name,
|
|
220
|
+
attributes={
|
|
221
|
+
"provider": "codex",
|
|
222
|
+
"session_id": session_id,
|
|
223
|
+
"agent_id": agent_id,
|
|
224
|
+
"agent_type": agent_type,
|
|
225
|
+
"agent_path": agent_path,
|
|
226
|
+
"agent_nickname": nickname,
|
|
227
|
+
"parent_thread_id": identity.get("parent_thread_id"),
|
|
228
|
+
"identity_semantics": "provider_rollout_session_meta",
|
|
229
|
+
},
|
|
230
|
+
)
|
|
231
|
+
return _archive(
|
|
232
|
+
path=path,
|
|
233
|
+
store=store,
|
|
234
|
+
timestamp=timestamp,
|
|
235
|
+
provider="codex",
|
|
236
|
+
source=source,
|
|
237
|
+
content_kind="codex.conversation_transcript.subagent",
|
|
238
|
+
observed_field="transcript_path",
|
|
239
|
+
attribution="codex_hook_plus_rollout",
|
|
240
|
+
evidence_source="provider_hook_plus_validated_transcript",
|
|
241
|
+
attributes={
|
|
242
|
+
"codex_hook_event_name": hook,
|
|
243
|
+
"provider_subagent_id_exact": True,
|
|
244
|
+
"provider_rollout_thread_id_exact": True,
|
|
245
|
+
"transcript_scope": "subagent",
|
|
246
|
+
},
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
if isinstance(agent_id, str) and agent_id:
|
|
250
|
+
return []
|
|
251
|
+
source = _entity(
|
|
252
|
+
"agent",
|
|
253
|
+
"agent:OpenAI Codex",
|
|
254
|
+
name="OpenAI Codex",
|
|
255
|
+
attributes={
|
|
256
|
+
"provider": "codex",
|
|
257
|
+
"session_id": session_id,
|
|
258
|
+
"thread_id": identity.get("thread_id"),
|
|
259
|
+
"agent_path": "/root",
|
|
260
|
+
"identity_semantics": "provider_rollout_session_meta",
|
|
261
|
+
},
|
|
262
|
+
)
|
|
263
|
+
return _archive(
|
|
264
|
+
path=path,
|
|
265
|
+
store=store,
|
|
266
|
+
timestamp=timestamp,
|
|
267
|
+
provider="codex",
|
|
268
|
+
source=source,
|
|
269
|
+
content_kind="codex.conversation_transcript.main",
|
|
270
|
+
observed_field="transcript_path",
|
|
271
|
+
attribution="codex_hook_plus_rollout",
|
|
272
|
+
evidence_source="provider_hook_plus_validated_transcript",
|
|
273
|
+
attributes={
|
|
274
|
+
"codex_hook_event_name": hook,
|
|
275
|
+
"provider_session_id_exact": True,
|
|
276
|
+
"provider_rollout_thread_id_exact": True,
|
|
277
|
+
"transcript_scope": "main_session",
|
|
278
|
+
},
|
|
279
|
+
)
|
|
280
|
+
|
|
281
|
+
|
|
185
282
|
def antigravity_conversation_archive_events(
|
|
186
283
|
payload: dict[str, Any],
|
|
187
284
|
*,
|