execweave 0.8.16__tar.gz → 0.8.18__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.16 → execweave-0.8.18}/PKG-INFO +1 -1
- {execweave-0.8.16 → execweave-0.8.18}/pyproject.toml +10 -2
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/__init__.py +1 -1
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/_dashboard_shell_base.py +7 -1
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/auto_specialized.py +56 -3
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/collector.py +3 -1
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/live_core.py +10 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/live_view_process_layout.py +47 -91
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/live_view_script_c.py +1 -1
- execweave-0.8.18/src/execweave/runtime_endpoint_availability.py +44 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/top.py +6 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/viewer_dashboard_focus.py +23 -5
- execweave-0.8.18/src/execweave/viewer_dashboard_pr70.py +261 -0
- execweave-0.8.18/src/execweave/viewer_gif.py +278 -0
- execweave-0.8.18/src/execweave/viewer_layout_geometry.py +118 -0
- execweave-0.8.18/src/execweave/viewer_layout_v2.py +429 -0
- execweave-0.8.18/src/execweave/viewer_layout_v2_detached.py +25 -0
- execweave-0.8.18/src/execweave/viewer_projection_bridges.py +214 -0
- execweave-0.8.18/src/execweave/viewer_tool_mirror_identity.py +75 -0
- execweave-0.8.16/.github/workflows/ci.yml +0 -287
- execweave-0.8.16/.github/workflows/cleanup-workflow-history.yml +0 -98
- execweave-0.8.16/.github/workflows/i18n.yml +0 -35
- execweave-0.8.16/.github/workflows/package-benchmark.yml +0 -61
- execweave-0.8.16/.github/workflows/package-smoke.yml +0 -42
- execweave-0.8.16/.github/workflows/provider-capability-stage-integrity.yml +0 -238
- execweave-0.8.16/.github/workflows/provider-dashboard-contract.yml +0 -151
- execweave-0.8.16/.github/workflows/publish.yml +0 -87
- execweave-0.8.16/.github/workflows/scalability.yml +0 -54
- execweave-0.8.16/.github/workflows/viewer-agent-isolation.yml +0 -89
- execweave-0.8.16/.github/workflows/wheel-smoke.yml +0 -34
- execweave-0.8.16/.github/workflows/windows-launcher.yml +0 -43
- execweave-0.8.16/README.de.md +0 -302
- execweave-0.8.16/README.fr.md +0 -302
- execweave-0.8.16/README.ja.md +0 -302
- execweave-0.8.16/README.ko.md +0 -302
- execweave-0.8.16/README.ru.md +0 -302
- execweave-0.8.16/README.zh-CN.md +0 -302
- execweave-0.8.16/README.zh-TW.md +0 -302
- execweave-0.8.16/benchmarks/phase1_overhead.py +0 -5
- execweave-0.8.16/diagnostics/acceptance_hardening_20260906.md +0 -202
- execweave-0.8.16/diagnostics/audit_eight_children.py +0 -134
- execweave-0.8.16/diagnostics/audit_python_journey.py +0 -215
- execweave-0.8.16/diagnostics/audit_real_clicks.py +0 -83
- execweave-0.8.16/diagnostics/current_state_reaudit.md +0 -101
- execweave-0.8.16/diagnostics/execweave_full_audit.md +0 -468
- execweave-0.8.16/diagnostics/gate_status.md +0 -69
- execweave-0.8.16/diagnostics/gate_status_history_through_g3.md +0 -171
- execweave-0.8.16/diagnostics/github_pr_inventory.json +0 -402
- execweave-0.8.16/diagnostics/handoff_checkpoint_20260906.md +0 -98
- execweave-0.8.16/diagnostics/next_agent_handoff.md +0 -154
- execweave-0.8.16/diagnostics/pr_regression_map.md +0 -803
- execweave-0.8.16/docs/antigravity-hooks.md +0 -74
- execweave-0.8.16/docs/assets/codex.gif +0 -0
- execweave-0.8.16/docs/benchmarks/README.md +0 -46
- execweave-0.8.16/docs/benchmarks/v0.6.0-github-actions.json +0 -67
- execweave-0.8.16/docs/benchmarks/v0.6.0-github-actions.svg +0 -46
- execweave-0.8.16/docs/claude-code-hooks.de.md +0 -157
- execweave-0.8.16/docs/claude-code-hooks.fr.md +0 -157
- execweave-0.8.16/docs/claude-code-hooks.ja.md +0 -157
- execweave-0.8.16/docs/claude-code-hooks.ko.md +0 -157
- execweave-0.8.16/docs/claude-code-hooks.md +0 -157
- execweave-0.8.16/docs/claude-code-hooks.ru.md +0 -157
- execweave-0.8.16/docs/claude-code-hooks.zh-CN.md +0 -157
- execweave-0.8.16/docs/claude-code-hooks.zh-TW.md +0 -157
- execweave-0.8.16/docs/codex-hooks.de.md +0 -70
- execweave-0.8.16/docs/codex-hooks.fr.md +0 -70
- execweave-0.8.16/docs/codex-hooks.ja.md +0 -70
- execweave-0.8.16/docs/codex-hooks.ko.md +0 -70
- execweave-0.8.16/docs/codex-hooks.md +0 -70
- execweave-0.8.16/docs/codex-hooks.ru.md +0 -70
- execweave-0.8.16/docs/codex-hooks.zh-CN.md +0 -70
- execweave-0.8.16/docs/codex-hooks.zh-TW.md +0 -70
- execweave-0.8.16/docs/cursor-hooks.de.md +0 -58
- execweave-0.8.16/docs/cursor-hooks.fr.md +0 -58
- execweave-0.8.16/docs/cursor-hooks.ja.md +0 -58
- execweave-0.8.16/docs/cursor-hooks.ko.md +0 -58
- execweave-0.8.16/docs/cursor-hooks.md +0 -62
- execweave-0.8.16/docs/cursor-hooks.ru.md +0 -58
- execweave-0.8.16/docs/cursor-hooks.zh-CN.md +0 -58
- execweave-0.8.16/docs/cursor-hooks.zh-TW.md +0 -58
- execweave-0.8.16/docs/evidence-grades.de.md +0 -61
- execweave-0.8.16/docs/evidence-grades.fr.md +0 -61
- execweave-0.8.16/docs/evidence-grades.ja.md +0 -61
- execweave-0.8.16/docs/evidence-grades.ko.md +0 -61
- execweave-0.8.16/docs/evidence-grades.md +0 -61
- execweave-0.8.16/docs/evidence-grades.ru.md +0 -61
- execweave-0.8.16/docs/evidence-grades.zh-CN.md +0 -61
- execweave-0.8.16/docs/evidence-grades.zh-TW.md +0 -61
- execweave-0.8.16/docs/inference-gateway.de.md +0 -74
- execweave-0.8.16/docs/inference-gateway.fr.md +0 -74
- execweave-0.8.16/docs/inference-gateway.ja.md +0 -74
- execweave-0.8.16/docs/inference-gateway.ko.md +0 -74
- execweave-0.8.16/docs/inference-gateway.md +0 -74
- execweave-0.8.16/docs/inference-gateway.ru.md +0 -74
- execweave-0.8.16/docs/inference-gateway.zh-CN.md +0 -74
- execweave-0.8.16/docs/inference-gateway.zh-TW.md +0 -74
- execweave-0.8.16/docs/internal/provider-capability-matrix.md +0 -101
- execweave-0.8.16/docs/live-graph.de.md +0 -223
- execweave-0.8.16/docs/live-graph.fr.md +0 -223
- execweave-0.8.16/docs/live-graph.ja.md +0 -223
- execweave-0.8.16/docs/live-graph.ko.md +0 -223
- execweave-0.8.16/docs/live-graph.md +0 -223
- execweave-0.8.16/docs/live-graph.ru.md +0 -223
- execweave-0.8.16/docs/live-graph.zh-CN.md +0 -223
- execweave-0.8.16/docs/live-graph.zh-TW.md +0 -223
- execweave-0.8.16/docs/model-runtime.de.md +0 -61
- execweave-0.8.16/docs/model-runtime.fr.md +0 -61
- execweave-0.8.16/docs/model-runtime.ja.md +0 -61
- execweave-0.8.16/docs/model-runtime.ko.md +0 -61
- execweave-0.8.16/docs/model-runtime.md +0 -61
- execweave-0.8.16/docs/model-runtime.ru.md +0 -61
- execweave-0.8.16/docs/model-runtime.zh-CN.md +0 -61
- execweave-0.8.16/docs/model-runtime.zh-TW.md +0 -61
- execweave-0.8.16/docs/opencode-plugin.de.md +0 -54
- execweave-0.8.16/docs/opencode-plugin.fr.md +0 -54
- execweave-0.8.16/docs/opencode-plugin.ja.md +0 -54
- execweave-0.8.16/docs/opencode-plugin.ko.md +0 -54
- execweave-0.8.16/docs/opencode-plugin.md +0 -54
- execweave-0.8.16/docs/opencode-plugin.ru.md +0 -54
- execweave-0.8.16/docs/opencode-plugin.zh-CN.md +0 -54
- execweave-0.8.16/docs/opencode-plugin.zh-TW.md +0 -54
- execweave-0.8.16/docs/phase-1-runtime-collection.de.md +0 -322
- execweave-0.8.16/docs/phase-1-runtime-collection.fr.md +0 -322
- execweave-0.8.16/docs/phase-1-runtime-collection.ja.md +0 -322
- execweave-0.8.16/docs/phase-1-runtime-collection.ko.md +0 -322
- execweave-0.8.16/docs/phase-1-runtime-collection.md +0 -322
- execweave-0.8.16/docs/phase-1-runtime-collection.ru.md +0 -322
- execweave-0.8.16/docs/phase-1-runtime-collection.zh-CN.md +0 -312
- execweave-0.8.16/docs/phase-1-runtime-collection.zh-TW.md +0 -312
- execweave-0.8.16/docs/phase-2-execution-graph.de.md +0 -286
- execweave-0.8.16/docs/phase-2-execution-graph.fr.md +0 -286
- execweave-0.8.16/docs/phase-2-execution-graph.ja.md +0 -286
- execweave-0.8.16/docs/phase-2-execution-graph.ko.md +0 -286
- execweave-0.8.16/docs/phase-2-execution-graph.md +0 -286
- execweave-0.8.16/docs/phase-2-execution-graph.ru.md +0 -286
- execweave-0.8.16/docs/phase-2-execution-graph.zh-CN.md +0 -280
- execweave-0.8.16/docs/phase-2-execution-graph.zh-TW.md +0 -280
- execweave-0.8.16/docs/remaining-provider-audit-v0.8.7.md +0 -143
- execweave-0.8.16/docs/rule-packs.de.md +0 -77
- execweave-0.8.16/docs/rule-packs.fr.md +0 -77
- execweave-0.8.16/docs/rule-packs.ja.md +0 -77
- execweave-0.8.16/docs/rule-packs.ko.md +0 -77
- execweave-0.8.16/docs/rule-packs.md +0 -77
- execweave-0.8.16/docs/rule-packs.ru.md +0 -77
- execweave-0.8.16/docs/rule-packs.zh-CN.md +0 -77
- execweave-0.8.16/docs/rule-packs.zh-TW.md +0 -77
- execweave-0.8.16/docs/run-integrity.de.md +0 -52
- execweave-0.8.16/docs/run-integrity.fr.md +0 -52
- execweave-0.8.16/docs/run-integrity.ja.md +0 -52
- execweave-0.8.16/docs/run-integrity.ko.md +0 -52
- execweave-0.8.16/docs/run-integrity.md +0 -52
- execweave-0.8.16/docs/run-integrity.ru.md +0 -52
- execweave-0.8.16/docs/run-integrity.zh-CN.md +0 -52
- execweave-0.8.16/docs/run-integrity.zh-TW.md +0 -52
- execweave-0.8.16/docs/runtime-threat-model.de.md +0 -60
- execweave-0.8.16/docs/runtime-threat-model.fr.md +0 -60
- execweave-0.8.16/docs/runtime-threat-model.ja.md +0 -60
- execweave-0.8.16/docs/runtime-threat-model.ko.md +0 -60
- execweave-0.8.16/docs/runtime-threat-model.md +0 -60
- execweave-0.8.16/docs/runtime-threat-model.ru.md +0 -60
- execweave-0.8.16/docs/runtime-threat-model.zh-CN.md +0 -60
- execweave-0.8.16/docs/runtime-threat-model.zh-TW.md +0 -60
- execweave-0.8.16/docs/security-analysis.de.md +0 -178
- execweave-0.8.16/docs/security-analysis.fr.md +0 -178
- execweave-0.8.16/docs/security-analysis.ja.md +0 -178
- execweave-0.8.16/docs/security-analysis.ko.md +0 -178
- execweave-0.8.16/docs/security-analysis.md +0 -178
- execweave-0.8.16/docs/security-analysis.ru.md +0 -178
- execweave-0.8.16/docs/security-analysis.zh-CN.md +0 -170
- execweave-0.8.16/docs/security-analysis.zh-TW.md +0 -170
- execweave-0.8.16/docs/semantic-telemetry.de.md +0 -63
- execweave-0.8.16/docs/semantic-telemetry.fr.md +0 -63
- execweave-0.8.16/docs/semantic-telemetry.ja.md +0 -63
- execweave-0.8.16/docs/semantic-telemetry.ko.md +0 -63
- execweave-0.8.16/docs/semantic-telemetry.md +0 -63
- execweave-0.8.16/docs/semantic-telemetry.ru.md +0 -63
- execweave-0.8.16/docs/semantic-telemetry.zh-CN.md +0 -63
- execweave-0.8.16/docs/semantic-telemetry.zh-TW.md +0 -63
- execweave-0.8.16/docs/v0.6.5-hardening-decisions.md +0 -47
- execweave-0.8.16/docs/v0.8.3-graph-ergonomics.md +0 -180
- execweave-0.8.16/scripts/_check_release_stage_integrity_impl.py +0 -745
- execweave-0.8.16/scripts/_dashboard_acceptance_impl.py +0 -598
- execweave-0.8.16/scripts/_ollama_interactive_acceptance_impl.py +0 -806
- execweave-0.8.16/scripts/_ollama_visible_acceptance_impl.py +0 -852
- execweave-0.8.16/scripts/_python_native_acceptance_impl.py +0 -542
- execweave-0.8.16/scripts/acceptance/__init__.py +0 -1
- execweave-0.8.16/scripts/acceptance/browser_diagnostics.py +0 -81
- execweave-0.8.16/scripts/acceptance/contracts.py +0 -33
- execweave-0.8.16/scripts/acceptance/g5_runner.py +0 -468
- execweave-0.8.16/scripts/acceptance/g6_runner.py +0 -258
- execweave-0.8.16/scripts/acceptance/interrupt_guard.py +0 -88
- execweave-0.8.16/scripts/acceptance/processes.py +0 -207
- execweave-0.8.16/scripts/acceptance/reporting.py +0 -336
- execweave-0.8.16/scripts/acceptance/terminal_output.py +0 -242
- execweave-0.8.16/scripts/annotate_pytest_failures.py +0 -52
- execweave-0.8.16/scripts/audit_i18n_parity.py +0 -189
- execweave-0.8.16/scripts/check_claude_hook.py +0 -85
- execweave-0.8.16/scripts/check_claude_record_graph.py +0 -31
- execweave-0.8.16/scripts/check_codex_hook.py +0 -87
- execweave-0.8.16/scripts/check_conversation_records.py +0 -215
- execweave-0.8.16/scripts/check_correlation_graph.py +0 -80
- execweave-0.8.16/scripts/check_inference_gateway_cli.py +0 -155
- execweave-0.8.16/scripts/check_model_runtime_cli.py +0 -268
- execweave-0.8.16/scripts/check_openai_compatible_cli.py +0 -152
- execweave-0.8.16/scripts/check_release_stage_integrity.py +0 -79
- execweave-0.8.16/scripts/check_semantic_graph.py +0 -33
- execweave-0.8.16/scripts/check_viewer_js.py +0 -35
- execweave-0.8.16/scripts/check_wheel_install.py +0 -80
- execweave-0.8.16/scripts/check_windows_launchers.py +0 -120
- execweave-0.8.16/scripts/dashboard_acceptance.py +0 -49
- execweave-0.8.16/scripts/emit_claude_hook_smoke.py +0 -57
- execweave-0.8.16/scripts/emit_codex_hook_smoke.py +0 -201
- execweave-0.8.16/scripts/emit_cursor_hook_smoke.py +0 -67
- execweave-0.8.16/scripts/emit_opencode_plugin_smoke.py +0 -70
- execweave-0.8.16/scripts/make_semantic_smoke.py +0 -83
- execweave-0.8.16/scripts/measure_graph_metrics.py +0 -932
- execweave-0.8.16/scripts/ollama_interactive_acceptance.py +0 -88
- execweave-0.8.16/scripts/ollama_visible_acceptance.py +0 -33
- execweave-0.8.16/scripts/owned_cleanup_acceptance.py +0 -164
- execweave-0.8.16/scripts/probe_provider_capability.py +0 -167
- execweave-0.8.16/scripts/python_native_acceptance.py +0 -52
- execweave-0.8.16/scripts/sync_i18n_nav.py +0 -145
- execweave-0.8.16/src/execweave/viewer_gif.py +0 -232
- execweave-0.8.16/tests/dashboard_readability_fixture.py +0 -232
- execweave-0.8.16/tests/fixtures/codex_multi_agent/PROVENANCE.md +0 -38
- execweave-0.8.16/tests/fixtures/codex_multi_agent/hook-payloads.json +0 -105
- execweave-0.8.16/tests/fixtures/codex_multi_agent/rollout-main.jsonl +0 -77
- execweave-0.8.16/tests/fixtures/hooks/README.md +0 -33
- execweave-0.8.16/tests/fixtures/hooks/claude.json +0 -35
- execweave-0.8.16/tests/fixtures/hooks/codex.json +0 -40
- execweave-0.8.16/tests/fixtures/hooks/cursor.json +0 -51
- execweave-0.8.16/tests/fixtures/hooks/manifest.json +0 -49
- execweave-0.8.16/tests/fixtures/hooks/opencode.json +0 -30
- execweave-0.8.16/tests/multi_agent_run_fixture.py +0 -210
- execweave-0.8.16/tests/test_acceptance_browser_diagnostics_e2e.py +0 -138
- execweave-0.8.16/tests/test_acceptance_conpty_selection.py +0 -43
- execweave-0.8.16/tests/test_acceptance_interrupt_guard.py +0 -65
- execweave-0.8.16/tests/test_acceptance_owned_processes.py +0 -112
- execweave-0.8.16/tests/test_acceptance_required_capabilities.py +0 -64
- execweave-0.8.16/tests/test_acceptance_terminal_output.py +0 -79
- execweave-0.8.16/tests/test_acceptance_visible_pipe.py +0 -47
- execweave-0.8.16/tests/test_agent_bootstrap.py +0 -259
- execweave-0.8.16/tests/test_agent_message_viewer.py +0 -138
- execweave-0.8.16/tests/test_agent_node_labels.py +0 -165
- execweave-0.8.16/tests/test_agent_said_panel.py +0 -92
- execweave-0.8.16/tests/test_agent_topology_evidence.py +0 -439
- execweave-0.8.16/tests/test_agent_trace_lifecycle.py +0 -82
- execweave-0.8.16/tests/test_agent_trace_viewer_visibility.py +0 -72
- execweave-0.8.16/tests/test_agy_windows_wire_acceptance.py +0 -302
- execweave-0.8.16/tests/test_analysis.py +0 -178
- execweave-0.8.16/tests/test_anthropic.py +0 -248
- execweave-0.8.16/tests/test_antigravity_agent_collaboration.py +0 -161
- execweave-0.8.16/tests/test_antigravity_child_panel_policy.py +0 -166
- execweave-0.8.16/tests/test_antigravity_child_transcript_tools.py +0 -158
- execweave-0.8.16/tests/test_antigravity_cursor_launch.py +0 -142
- execweave-0.8.16/tests/test_antigravity_field_run_regressions.py +0 -280
- execweave-0.8.16/tests/test_antigravity_history_replay.py +0 -233
- execweave-0.8.16/tests/test_antigravity_identity_topology.py +0 -112
- execweave-0.8.16/tests/test_antigravity_invocation_archive.py +0 -237
- execweave-0.8.16/tests/test_antigravity_lifecycle.py +0 -54
- execweave-0.8.16/tests/test_antigravity_linkage_projection.py +0 -98
- execweave-0.8.16/tests/test_antigravity_multi_conversation_isolation.py +0 -316
- execweave-0.8.16/tests/test_antigravity_official_contract.py +0 -157
- execweave-0.8.16/tests/test_antigravity_role_path_fallback.py +0 -249
- execweave-0.8.16/tests/test_antigravity_root_child_history_v2.py +0 -173
- execweave-0.8.16/tests/test_antigravity_subagent_transcript_linkage.py +0 -398
- execweave-0.8.16/tests/test_antigravity_trace_capability_cli.py +0 -48
- execweave-0.8.16/tests/test_auto_specialized.py +0 -380
- execweave-0.8.16/tests/test_auto_specialized_ollama_two_phase.py +0 -230
- execweave-0.8.16/tests/test_backends.py +0 -21
- execweave-0.8.16/tests/test_claude_adapter.py +0 -284
- execweave-0.8.16/tests/test_claude_child_transcript_tools.py +0 -240
- execweave-0.8.16/tests/test_claude_delegation.py +0 -121
- execweave-0.8.16/tests/test_claude_full_fidelity.py +0 -163
- execweave-0.8.16/tests/test_claude_hook_contract.py +0 -313
- execweave-0.8.16/tests/test_claude_hook_metadata.py +0 -60
- execweave-0.8.16/tests/test_claude_hook_viewer.py +0 -101
- execweave-0.8.16/tests/test_claude_model_observer.py +0 -393
- execweave-0.8.16/tests/test_claude_record.py +0 -198
- execweave-0.8.16/tests/test_cleanup_finalizer_identity.py +0 -31
- execweave-0.8.16/tests/test_codex_adapter.py +0 -222
- execweave-0.8.16/tests/test_codex_archive_full_fidelity.py +0 -224
- execweave-0.8.16/tests/test_codex_child_panel_policy.py +0 -375
- execweave-0.8.16/tests/test_codex_conversation_isolation.py +0 -94
- execweave-0.8.16/tests/test_codex_full_fidelity.py +0 -193
- execweave-0.8.16/tests/test_codex_hook_global_fail_open.py +0 -99
- execweave-0.8.16/tests/test_codex_hook_lifecycle.py +0 -177
- execweave-0.8.16/tests/test_codex_hook_partial_capture.py +0 -248
- execweave-0.8.16/tests/test_codex_interrupt_contract.py +0 -73
- execweave-0.8.16/tests/test_codex_message_diagnostics.py +0 -186
- execweave-0.8.16/tests/test_codex_message_transport_diagnostics.py +0 -184
- execweave-0.8.16/tests/test_codex_nickname_path_fallback.py +0 -134
- execweave-0.8.16/tests/test_codex_plain_routed_agent_message.py +0 -87
- execweave-0.8.16/tests/test_codex_real_multi_agent_conversation.py +0 -474
- execweave-0.8.16/tests/test_codex_record.py +0 -187
- execweave-0.8.16/tests/test_codex_reducer_command.py +0 -83
- execweave-0.8.16/tests/test_codex_rollout_structures.py +0 -234
- execweave-0.8.16/tests/test_codex_rollout_trace.py +0 -393
- execweave-0.8.16/tests/test_codex_routing_native_identity.py +0 -44
- execweave-0.8.16/tests/test_collector.py +0 -43
- execweave-0.8.16/tests/test_command.py +0 -76
- execweave-0.8.16/tests/test_condense.py +0 -154
- execweave-0.8.16/tests/test_conversation_access.py +0 -276
- execweave-0.8.16/tests/test_conversation_agent_focus.py +0 -158
- execweave-0.8.16/tests/test_conversation_agent_isolation.py +0 -117
- execweave-0.8.16/tests/test_conversation_identity_merge.py +0 -491
- execweave-0.8.16/tests/test_conversation_message_observation_dedupe.py +0 -346
- execweave-0.8.16/tests/test_conversation_provider_parity.py +0 -479
- execweave-0.8.16/tests/test_conversation_root_authority.py +0 -40
- execweave-0.8.16/tests/test_correlation.py +0 -404
- execweave-0.8.16/tests/test_correlation_canonical_path.py +0 -76
- execweave-0.8.16/tests/test_correlation_checker.py +0 -75
- execweave-0.8.16/tests/test_correlation_process_exe.py +0 -83
- execweave-0.8.16/tests/test_cross_provider_agent_trace.py +0 -306
- execweave-0.8.16/tests/test_cursor_adapter.py +0 -162
- execweave-0.8.16/tests/test_cursor_delegation.py +0 -91
- execweave-0.8.16/tests/test_cursor_full_fidelity.py +0 -268
- execweave-0.8.16/tests/test_cursor_hook_contract.py +0 -127
- execweave-0.8.16/tests/test_cursor_hook_fail_open.py +0 -60
- execweave-0.8.16/tests/test_cursor_ollama_session_lifecycle.py +0 -176
- execweave-0.8.16/tests/test_cursor_record.py +0 -82
- execweave-0.8.16/tests/test_cursor_task_linkage.py +0 -96
- execweave-0.8.16/tests/test_d003_fast_reparent.py +0 -134
- execweave-0.8.16/tests/test_dagre_semantic_pipeline.py +0 -254
- execweave-0.8.16/tests/test_dashboard_acceptance_relative_output_e2e.py +0 -36
- execweave-0.8.16/tests/test_dashboard_acceptance_reporting.py +0 -60
- execweave-0.8.16/tests/test_dashboard_camera_scheduler_e2e.py +0 -299
- execweave-0.8.16/tests/test_dashboard_favicon.py +0 -8
- execweave-0.8.16/tests/test_dashboard_file_activity_filter.py +0 -30
- execweave-0.8.16/tests/test_dashboard_gif_export_e2e.py +0 -280
- execweave-0.8.16/tests/test_dashboard_information_architecture.py +0 -251
- execweave-0.8.16/tests/test_dashboard_initial_fit_readability_e2e.py +0 -107
- execweave-0.8.16/tests/test_dashboard_node_drag_camera_e2e.py +0 -67
- execweave-0.8.16/tests/test_dashboard_readability_e2e.py +0 -407
- execweave-0.8.16/tests/test_dashboard_round_fold_state_e2e.py +0 -258
- execweave-0.8.16/tests/test_dashboard_simplification.py +0 -220
- execweave-0.8.16/tests/test_dashboard_ux_and_hook_projection.py +0 -383
- execweave-0.8.16/tests/test_delegation_viewer.py +0 -209
- execweave-0.8.16/tests/test_evidence_grade.py +0 -72
- execweave-0.8.16/tests/test_execution_viewer.py +0 -112
- execweave-0.8.16/tests/test_external_endpoints_all_providers.py +0 -169
- execweave-0.8.16/tests/test_fidelity.py +0 -335
- execweave-0.8.16/tests/test_filesystem_resilience.py +0 -235
- execweave-0.8.16/tests/test_focus.py +0 -139
- execweave-0.8.16/tests/test_fold_budget_setting.py +0 -121
- execweave-0.8.16/tests/test_full_fidelity.py +0 -91
- execweave-0.8.16/tests/test_g5_hardening_contract.py +0 -39
- execweave-0.8.16/tests/test_g6_owned_parity_contract.py +0 -133
- execweave-0.8.16/tests/test_graph.py +0 -333
- execweave-0.8.16/tests/test_graph_arrange_constraints_e2e.py +0 -111
- execweave-0.8.16/tests/test_graph_clear_focus_e2e.py +0 -126
- execweave-0.8.16/tests/test_graph_edge_routing_e2e.py +0 -168
- execweave-0.8.16/tests/test_graph_lane_separation_e2e.py +0 -170
- execweave-0.8.16/tests/test_graph_node_sizing_e2e.py +0 -288
- execweave-0.8.16/tests/test_graph_ops.py +0 -131
- execweave-0.8.16/tests/test_hook_fixture_corpus.py +0 -150
- execweave-0.8.16/tests/test_http_proxy.py +0 -261
- execweave-0.8.16/tests/test_http_proxy_request_phase.py +0 -121
- execweave-0.8.16/tests/test_http_proxy_response_memory.py +0 -154
- execweave-0.8.16/tests/test_http_proxy_streaming.py +0 -116
- execweave-0.8.16/tests/test_i18n_readme_policy.py +0 -49
- execweave-0.8.16/tests/test_inference_endpoint_identity.py +0 -147
- execweave-0.8.16/tests/test_inference_gateway.py +0 -155
- execweave-0.8.16/tests/test_inference_gateway_full_fidelity.py +0 -411
- execweave-0.8.16/tests/test_inference_identity.py +0 -78
- execweave-0.8.16/tests/test_integrity.py +0 -112
- execweave-0.8.16/tests/test_litellm_callback.py +0 -189
- execweave-0.8.16/tests/test_live.py +0 -220
- execweave-0.8.16/tests/test_live_auth.py +0 -176
- execweave-0.8.16/tests/test_live_dashboard.py +0 -31
- execweave-0.8.16/tests/test_live_dashboard_js.py +0 -48
- execweave-0.8.16/tests/test_live_delta.py +0 -179
- execweave-0.8.16/tests/test_live_logs_export.py +0 -94
- execweave-0.8.16/tests/test_live_theme.py +0 -11
- execweave-0.8.16/tests/test_lmstudio_auto_specialized.py +0 -149
- execweave-0.8.16/tests/test_local_runtime_live_capture.py +0 -185
- execweave-0.8.16/tests/test_model_runtime.py +0 -226
- execweave-0.8.16/tests/test_model_runtime_full_fidelity.py +0 -218
- execweave-0.8.16/tests/test_ollama_interactive_acceptance.py +0 -269
- execweave-0.8.16/tests/test_ollama_interactive_terminal_semantics.py +0 -76
- execweave-0.8.16/tests/test_ollama_panel_policy.py +0 -89
- execweave-0.8.16/tests/test_ollama_serve_runtime_integration.py +0 -293
- execweave-0.8.16/tests/test_ollama_visible_acceptance.py +0 -254
- execweave-0.8.16/tests/test_openai_compatible.py +0 -307
- execweave-0.8.16/tests/test_opencode_adapter.py +0 -72
- execweave-0.8.16/tests/test_opencode_event_contract.py +0 -246
- execweave-0.8.16/tests/test_opencode_event_lifecycle.py +0 -57
- execweave-0.8.16/tests/test_opencode_full_fidelity.py +0 -137
- execweave-0.8.16/tests/test_opencode_identity_unification.py +0 -87
- execweave-0.8.16/tests/test_opencode_plugin.py +0 -41
- execweave-0.8.16/tests/test_opencode_record.py +0 -90
- execweave-0.8.16/tests/test_opencode_task_session_linkage.py +0 -125
- execweave-0.8.16/tests/test_overhead_benchmark.py +0 -84
- execweave-0.8.16/tests/test_per_agent_conversation_default.py +0 -157
- execweave-0.8.16/tests/test_pr25_premerge_hardening_contract.py +0 -52
- execweave-0.8.16/tests/test_pr25_premerge_hardening_e2e.py +0 -411
- execweave-0.8.16/tests/test_pro6_audit_regressions.py +0 -228
- execweave-0.8.16/tests/test_process_tree_layout.py +0 -208
- execweave-0.8.16/tests/test_provider_capability.py +0 -202
- execweave-0.8.16/tests/test_provider_conversation_evidence.py +0 -304
- execweave-0.8.16/tests/test_provider_conversation_history_integrity.py +0 -335
- execweave-0.8.16/tests/test_provider_dashboard_contract.py +0 -401
- execweave-0.8.16/tests/test_provider_lifecycle.py +0 -225
- execweave-0.8.16/tests/test_provider_neutral_viewer_semantics.py +0 -190
- execweave-0.8.16/tests/test_pypi_0812_regressions.py +0 -171
- execweave-0.8.16/tests/test_pypi_0813_cleanup.py +0 -382
- execweave-0.8.16/tests/test_python_native_acceptance.py +0 -107
- execweave-0.8.16/tests/test_relay_prompt_live_e2e.py +0 -179
- execweave-0.8.16/tests/test_release_stage_integrity_version_guard.py +0 -112
- execweave-0.8.16/tests/test_rule_pack.py +0 -153
- execweave-0.8.16/tests/test_schema.py +0 -18
- execweave-0.8.16/tests/test_scope.py +0 -54
- execweave-0.8.16/tests/test_semantic.py +0 -277
- execweave-0.8.16/tests/test_shared_injected_context_scope.py +0 -90
- execweave-0.8.16/tests/test_single_agent_barycenter.py +0 -261
- execweave-0.8.16/tests/test_strace_backend.py +0 -202
- execweave-0.8.16/tests/test_stream_assembly.py +0 -380
- execweave-0.8.16/tests/test_threat_model.py +0 -202
- execweave-0.8.16/tests/test_tool_traffic_e2e.py +0 -138
- execweave-0.8.16/tests/test_top_detached.py +0 -180
- execweave-0.8.16/tests/test_v063_features.py +0 -132
- execweave-0.8.16/tests/test_v064_live_auto_integrations.py +0 -124
- execweave-0.8.16/tests/test_v064_live_evidence.py +0 -250
- execweave-0.8.16/tests/test_v069_dashboard_release.py +0 -124
- execweave-0.8.16/tests/test_v079_review_e2e.py +0 -184
- execweave-0.8.16/tests/test_v079_review_regressions.py +0 -105
- execweave-0.8.16/tests/test_v083_release_gate_p2.py +0 -150
- execweave-0.8.16/tests/test_validate.py +0 -113
- execweave-0.8.16/tests/test_version.py +0 -7
- execweave-0.8.16/tests/test_viewer.py +0 -345
- execweave-0.8.16/tests/test_viewer_agent_isolation_e2e.py +0 -885
- execweave-0.8.16/tests/test_viewer_child_authority.py +0 -22
- execweave-0.8.16/tests/test_viewer_content_inspector.py +0 -248
- execweave-0.8.16/tests/test_viewer_limits.py +0 -115
- execweave-0.8.16/tests/test_viewer_projection.py +0 -412
- execweave-0.8.16/tests/test_visual_ux_readability.py +0 -256
- execweave-0.8.16/tests/test_windows_codex_agy_display_repair.py +0 -220
- execweave-0.8.16/tests/test_workflow.py +0 -94
- execweave-0.8.16/tools/verify_metrics_tool.py +0 -104
- {execweave-0.8.16 → execweave-0.8.18}/.gitignore +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/LICENSE +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/README.md +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/__main__.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/_conversation_records_core.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/_http_proxy_base.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/_http_proxy_bounded.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/_http_proxy_stage.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/agent_bootstrap.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/agent_topology.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/agent_trace.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/agy_preview_sanitize.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/analysis.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/anthropic.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/anthropic_cli.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/anthropic_full_fidelity.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/antigravity_adapter.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/antigravity_adapter_base.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/antigravity_full_fidelity.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/antigravity_full_fidelity_base.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/antigravity_full_fidelity_collaboration_base.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/antigravity_hook_cli.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/antigravity_record.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/antigravity_subagent_linkage.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/antigravity_trace_capability.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/backends.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/benchmark.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/claude_adapter.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/claude_child_transcript.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/claude_delegation.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/claude_full_fidelity.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/claude_hook_cli.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/claude_hook_contract.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/claude_model_observer.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/claude_record.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/cli.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/codex_adapter.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/codex_conversation.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/codex_full_fidelity.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/codex_hook_cli.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/codex_hook_entry.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/codex_hook_lifecycle.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/codex_message_diagnostics.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/codex_message_transport_diagnostics.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/codex_record.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/codex_rollout_structures.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/codex_rollout_trace.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/codex_rollout_trace_base.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/command.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/content_evidence.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/content_store.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/conversation_archive.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/conversation_message_identity.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/conversation_preview.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/conversation_preview_antigravity.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/conversation_preview_claude.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/conversation_preview_codex.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/conversation_preview_common.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/conversation_preview_generic.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/conversation_preview_lines.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/conversation_preview_transcript.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/conversation_records.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/conversation_records_antigravity.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/conversation_records_codex.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/conversation_records_common.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/conversation_records_ollama.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/correlation.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/cursor_adapter.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/cursor_delegation.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/cursor_delegation_base.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/cursor_full_fidelity.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/cursor_hook_cli.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/cursor_hook_contract.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/cursor_record.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/dashboard_shell.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/entry.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/evidence_availability.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/evidence_grade.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/fidelity.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/filesystem.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/focus.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/graph.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/graph_ops.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/http_proxy.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/http_proxy_cli.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/inference_gateway.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/inference_gateway_cli.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/inference_gateway_full_fidelity.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/inference_identity.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/inference_identity_cli.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/integrity.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/integrity_cli.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/litellm_callback.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/litellm_callback_cli.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/live.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/live_view.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/live_view_extra_style.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/live_view_markup.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/live_view_readability.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/live_view_script_a.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/live_view_script_b.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/live_view_script_d.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/live_view_style.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/model_runtime.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/model_runtime_cli.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/model_runtime_full_fidelity.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/openai_compatible.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/openai_compatible_cli.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/openai_compatible_full_fidelity.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/opencode_adapter.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/opencode_event_contract.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/opencode_full_fidelity.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/opencode_hook_cli.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/opencode_plugin_cli.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/opencode_record.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/opencode_task_linkage.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/overhead_benchmark.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/provider_capability.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/provider_lifecycle.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/provider_record.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/rule_pack.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/rule_pack_cli.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/scalability_benchmark.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/schema.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/scope.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/semantic.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/sink.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/strace_backend.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/stream_assembly.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/theme.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/top_cli.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/validate.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/vendor/dagre.min.js +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/view_cli.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/viewer.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/viewer_agent_panel.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/viewer_agent_panel_antigravity.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/viewer_agent_panel_claude.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/viewer_agent_panel_codex.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/viewer_agent_panel_cursor.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/viewer_agent_panel_default.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/viewer_agent_panel_ollama.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/viewer_agent_panel_opencode.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/viewer_agent_panel_registry.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/viewer_content_inspector.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/viewer_dashboard_clean.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/viewer_dashboard_hardening.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/viewer_dashboard_hardening_v2.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/viewer_external_endpoints.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/viewer_limits.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/viewer_live_layout.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/viewer_projection.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/viewer_projection_base.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/viewer_semantic_projection.py +0 -0
- {execweave-0.8.16 → execweave-0.8.18}/src/execweave/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.18
|
|
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
|
|
@@ -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.18 release metadata
|
|
8
|
+
version = "0.8.18"
|
|
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"
|
|
@@ -95,6 +95,14 @@ execweave-scalability = "execweave.scalability_benchmark:main"
|
|
|
95
95
|
[tool.hatch.build.targets.wheel]
|
|
96
96
|
packages = ["src/execweave"]
|
|
97
97
|
|
|
98
|
+
[tool.hatch.build.targets.sdist]
|
|
99
|
+
include = [
|
|
100
|
+
"/src/execweave",
|
|
101
|
+
"/pyproject.toml",
|
|
102
|
+
"/README.md",
|
|
103
|
+
"/LICENSE",
|
|
104
|
+
]
|
|
105
|
+
|
|
98
106
|
[tool.pytest.ini_options]
|
|
99
107
|
testpaths = ["tests"]
|
|
100
108
|
pythonpath = ["src"]
|
|
@@ -6,8 +6,11 @@ from typing import Any
|
|
|
6
6
|
from .live_view import LIVE_HTML as _BASE_LIVE_HTML
|
|
7
7
|
from .viewer_agent_panel import inject_agent_panel
|
|
8
8
|
from .viewer_dashboard_clean import fold_budget_bootstrap, inject_live_dashboard_clean
|
|
9
|
-
from .viewer_limits import resolve_viewer_limits, viewer_limits_bootstrap
|
|
10
9
|
from .viewer_dashboard_focus import inject_live_dashboard_focus
|
|
10
|
+
from .viewer_dashboard_pr70 import inject_pr70_dashboard_repairs
|
|
11
|
+
from .viewer_layout_v2 import inject_layout_v2
|
|
12
|
+
from .viewer_layout_v2_detached import inject_layout_v2_detached_cluster_policy
|
|
13
|
+
from .viewer_limits import resolve_viewer_limits, viewer_limits_bootstrap
|
|
11
14
|
from .viewer_live_layout import inject_live_dashboard_layout
|
|
12
15
|
|
|
13
16
|
|
|
@@ -70,6 +73,9 @@ def _build_dashboard_html() -> str:
|
|
|
70
73
|
html = _preserve_semantic_layout_constraints(html)
|
|
71
74
|
html = _preserve_semantic_arrange(html)
|
|
72
75
|
html = _route_ordinary_edges_from_final_positions(html)
|
|
76
|
+
html = inject_pr70_dashboard_repairs(html)
|
|
77
|
+
html = inject_layout_v2(html)
|
|
78
|
+
html = inject_layout_v2_detached_cluster_policy(html)
|
|
73
79
|
return _align_agent_panel_topology(inject_agent_panel(_guard_compact_live_snapshot(html)))
|
|
74
80
|
|
|
75
81
|
|
|
@@ -14,6 +14,8 @@ from urllib.error import HTTPError, URLError
|
|
|
14
14
|
from urllib.parse import urlsplit, urlunsplit
|
|
15
15
|
from urllib.request import Request, urlopen
|
|
16
16
|
|
|
17
|
+
from .runtime_endpoint_availability import windows_exclusive_endpoint_available
|
|
18
|
+
|
|
17
19
|
from .model_runtime import (
|
|
18
20
|
append_model_runtime_records,
|
|
19
21
|
llamacpp_models_to_events,
|
|
@@ -214,6 +216,49 @@ def _probe_spec(command: list[str]) -> _ProbeSpec | None:
|
|
|
214
216
|
return None
|
|
215
217
|
|
|
216
218
|
|
|
219
|
+
@dataclass(frozen=True)
|
|
220
|
+
class _LiveProbeAdmission:
|
|
221
|
+
# Prepared before the child (and any managed relay) is launched. A grace
|
|
222
|
+
# period is a scheduling aid, never evidence of endpoint ownership.
|
|
223
|
+
spec: _ProbeSpec | None
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
def prepare_live_specialized_probe(command: list[str]) -> _LiveProbeAdmission:
|
|
227
|
+
"""Do not attach an already listening or uncertain endpoint to a new run.
|
|
228
|
+
|
|
229
|
+
A refused connection establishes absence at this pre-launch boundary. A
|
|
230
|
+
Windows connect timeout requires independent exclusive-bind proof for every
|
|
231
|
+
resolved loopback address; a timeout alone never authorizes a probe. Other
|
|
232
|
+
unknown/denied states abstain. This affects automatic catalog polling only,
|
|
233
|
+
not command execution or explicit request/response capture.
|
|
234
|
+
"""
|
|
235
|
+
if not os.environ.get(_SEMANTIC_ENV):
|
|
236
|
+
return _LiveProbeAdmission(None)
|
|
237
|
+
spec = _probe_spec(command)
|
|
238
|
+
if spec is None:
|
|
239
|
+
return _LiveProbeAdmission(None)
|
|
240
|
+
address = urlsplit(spec.endpoint)
|
|
241
|
+
try:
|
|
242
|
+
with socket.create_connection(
|
|
243
|
+
(str(address.hostname), int(address.port or 80)),
|
|
244
|
+
timeout=_PROBE_TIMEOUT_SECONDS,
|
|
245
|
+
):
|
|
246
|
+
pass
|
|
247
|
+
except ConnectionRefusedError:
|
|
248
|
+
return _LiveProbeAdmission(spec)
|
|
249
|
+
except TimeoutError:
|
|
250
|
+
if windows_exclusive_endpoint_available(str(address.hostname), int(address.port or 80)):
|
|
251
|
+
return _LiveProbeAdmission(spec)
|
|
252
|
+
except OSError:
|
|
253
|
+
pass
|
|
254
|
+
print(
|
|
255
|
+
f"ExecWeave {spec.runtime} probe: endpoint {spec.endpoint} was not "
|
|
256
|
+
"proven unused before launch; automatic catalog evidence is disabled.",
|
|
257
|
+
file=sys.stderr,
|
|
258
|
+
)
|
|
259
|
+
return _LiveProbeAdmission(None)
|
|
260
|
+
|
|
261
|
+
|
|
217
262
|
def _get_json(url: str, *, timeout: float) -> dict[str, object]:
|
|
218
263
|
request = Request(url, headers={"Accept": "application/json"})
|
|
219
264
|
with urlopen(request, timeout=timeout) as response:
|
|
@@ -462,10 +507,18 @@ def auto_specialized_launch(
|
|
|
462
507
|
|
|
463
508
|
|
|
464
509
|
@contextmanager
|
|
465
|
-
def auto_specialized_probe(
|
|
466
|
-
|
|
510
|
+
def auto_specialized_probe(
|
|
511
|
+
command: list[str],
|
|
512
|
+
*,
|
|
513
|
+
admission: _LiveProbeAdmission | None = None,
|
|
514
|
+
) -> Iterator[None]:
|
|
515
|
+
"""Poll a prepared launch, or an explicitly requested library observation.
|
|
516
|
+
|
|
517
|
+
RuntimeCollector always supplies pre-launch admission. A direct library
|
|
518
|
+
caller without admission retains the explicit endpoint-observation API.
|
|
519
|
+
"""
|
|
467
520
|
configured_sidecar = os.environ.get(_SEMANTIC_ENV)
|
|
468
|
-
spec = _probe_spec(command)
|
|
521
|
+
spec = admission.spec if admission is not None else _probe_spec(command)
|
|
469
522
|
if not configured_sidecar or spec is None:
|
|
470
523
|
yield
|
|
471
524
|
return
|
|
@@ -16,6 +16,7 @@ from .auto_specialized import (
|
|
|
16
16
|
auto_specialized_launch,
|
|
17
17
|
auto_specialized_probe,
|
|
18
18
|
prepare_post_command_specialized_probe,
|
|
19
|
+
prepare_live_specialized_probe,
|
|
19
20
|
run_post_command_specialized_probe,
|
|
20
21
|
)
|
|
21
22
|
from .command import resolve_launch_command
|
|
@@ -209,6 +210,7 @@ class RuntimeCollector:
|
|
|
209
210
|
collector_error_type: str | None = None
|
|
210
211
|
workload_terminated_due_to_collector_error = False
|
|
211
212
|
subreaper_previous: bool | None = None
|
|
213
|
+
live_probe_admission = prepare_live_specialized_probe(command)
|
|
212
214
|
post_command_probe = prepare_post_command_specialized_probe(command)
|
|
213
215
|
try:
|
|
214
216
|
if watcher is not None:
|
|
@@ -235,7 +237,7 @@ class RuntimeCollector:
|
|
|
235
237
|
if snapshot is not None:
|
|
236
238
|
self._record_process_start(snapshot, parent=session, relation="LAUNCHED")
|
|
237
239
|
|
|
238
|
-
with auto_specialized_probe(command):
|
|
240
|
+
with auto_specialized_probe(command, admission=live_probe_admission):
|
|
239
241
|
while process.poll() is None:
|
|
240
242
|
self._sample_process_tree(root)
|
|
241
243
|
time.sleep(self.poll_interval)
|
|
@@ -549,6 +549,11 @@ class _LiveState:
|
|
|
549
549
|
else _inject_final_theme(render_graph_html(final_graph))
|
|
550
550
|
)
|
|
551
551
|
with self._lock:
|
|
552
|
+
# The last browser poll may precede the collector's final batch.
|
|
553
|
+
# Drain complete runtime/semantic records for raw-log and evidence
|
|
554
|
+
# counters before publishing FINISHED. The canonical graph below,
|
|
555
|
+
# not the provisional accumulator, remains the graph authority.
|
|
556
|
+
self._refresh_incremental_locked()
|
|
552
557
|
self._final_graph = final_graph
|
|
553
558
|
self._final_html = rendered_final
|
|
554
559
|
self._finished = True
|
|
@@ -563,6 +568,11 @@ class _LiveState:
|
|
|
563
568
|
"edges_added": [],
|
|
564
569
|
"edges_updated": [],
|
|
565
570
|
"terminal": True,
|
|
571
|
+
# A counts-only terminal delta loses unpolled nodes/edges and
|
|
572
|
+
# canonical identity/metadata changes. Reconcile in this same
|
|
573
|
+
# sequence-visible response, before the client stops polling.
|
|
574
|
+
# Use the normal projection and payload budget, as on reconnect.
|
|
575
|
+
"final_graph": self._snapshot_from_accumulator_locked(),
|
|
566
576
|
}
|
|
567
577
|
if not _within_live_payload_budget(node_count, edge_count):
|
|
568
578
|
terminal["live_payload_compact"] = True
|
|
@@ -254,16 +254,17 @@ function execweaveLayoutDirectedGraph(topo){
|
|
|
254
254
|
}
|
|
255
255
|
try{
|
|
256
256
|
const graph=new engine.graphlib.Graph();
|
|
257
|
-
graph.setGraph({rankdir:'LR',nodesep:EXECWEAVE_DAG_GAP,ranksep:48,marginx:
|
|
257
|
+
graph.setGraph({rankdir:'LR',nodesep:EXECWEAVE_DAG_GAP,ranksep:48,marginx:0,marginy:16,edgesep:16});
|
|
258
258
|
graph.setDefaultEdgeLabel(()=>({}));
|
|
259
259
|
const ids=[];
|
|
260
|
-
for(const id of topo.spec.keys()){
|
|
260
|
+
for(const id of [...topo.spec.keys()].sort()){
|
|
261
261
|
if(!nodeById.has(id))continue;
|
|
262
262
|
graph.setNode(id,{width:execweaveWidthOf(id),height:execweaveHeightOf(id)});
|
|
263
263
|
ids.push(id);
|
|
264
264
|
}
|
|
265
265
|
const seen=new Set();
|
|
266
|
-
for(const edge of edgeById.values()){
|
|
266
|
+
for(const edge of [...edgeById.values()].sort((a,b)=>edgeId(a).localeCompare(edgeId(b)))){
|
|
267
|
+
if(typeof execweaveIsStopped==='function'&&execweaveIsStopped(edge))continue;
|
|
267
268
|
if(!topo.spec.has(edge.source)||!topo.spec.has(edge.target)||edge.source===edge.target)continue;
|
|
268
269
|
const key=execweaveEdgeKey(edge.source,edge.target);
|
|
269
270
|
if(seen.has(key))continue;
|
|
@@ -301,74 +302,24 @@ function execweaveRestoreSemanticLayoutConstraints(topo,preferred,dagrePlacement
|
|
|
301
302
|
const nodes=[...nodeById.values()],edges=[...edgeById.values()];
|
|
302
303
|
const componentOf=execweaveComponents(nodes,edges);
|
|
303
304
|
|
|
304
|
-
// X
|
|
305
|
-
//
|
|
306
|
-
//
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
if (!node) continue;
|
|
323
|
-
const type = String(node.type || '').toLowerCase();
|
|
324
|
-
if (type === 'process' || type === 'session' || type === 'runtime') continue;
|
|
325
|
-
const lane = topo.spec.get(id)?.lane || before.lane || 'other';
|
|
326
|
-
const rank = laneRank[lane] ?? 3;
|
|
327
|
-
if (!nodesByRank.has(rank)) nodesByRank.set(rank, []);
|
|
328
|
-
nodesByRank.get(rank).push(id);
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
// Handle process-like nodes first (pinned to process-tree coordinates)
|
|
332
|
-
let maxProcessRight = 0;
|
|
333
|
-
for (const [id, before] of preferred) {
|
|
334
|
-
const after = topo.spec.get(id), node = nodeById.get(id);
|
|
335
|
-
if (!after || !node) continue;
|
|
336
|
-
const type = String(node.type || '').toLowerCase();
|
|
337
|
-
if (type === 'process' || type === 'session' || type === 'runtime') {
|
|
338
|
-
if (Number.isFinite(before.x)) after.x = before.x;
|
|
339
|
-
const pw = topo.width?.get(id) || (typeof execweaveWidthOf === 'function' ? execweaveWidthOf(id) : 160);
|
|
340
|
-
const px = Number.isFinite(after.x) ? after.x : 0;
|
|
341
|
-
maxProcessRight = Math.max(maxProcessRight, px + pw);
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
// Propagate corridor lower bounds across ranks:
|
|
346
|
-
// rank 1 (root) < rank 2 (agent) < rank 3 (model) < rank 4 (tool) < rank 5 (file) < rank 6 (endpoint)
|
|
347
|
-
let minAllowedX = maxProcessRight;
|
|
348
|
-
for (let r = 1; r <= 6; r++) {
|
|
349
|
-
const ids = nodesByRank.get(r) || [];
|
|
350
|
-
if (!ids.length) continue;
|
|
351
|
-
let rankMaxX = minAllowedX;
|
|
352
|
-
for (const id of ids) {
|
|
353
|
-
const after = topo.spec.get(id);
|
|
354
|
-
const before = preferred.get(id);
|
|
355
|
-
const dagreX = dagrePlacement.get(id)?.x;
|
|
356
|
-
const laneX = topo.laneX && Number.isFinite(topo.laneX[after?.lane]) ? topo.laneX[after.lane] : before?.x;
|
|
357
|
-
if (!after) continue;
|
|
358
|
-
|
|
359
|
-
const isBundledTarget = edges.some(e => e.target === id && topo.bundleByEdge?.get(edgeId(e))?.size > 1);
|
|
360
|
-
const candidateX = isBundledTarget && Number.isFinite(laneX) ? laneX : dagreX;
|
|
361
|
-
|
|
362
|
-
if (Number.isFinite(candidateX) && candidateX >= minAllowedX) {
|
|
363
|
-
after.x = candidateX;
|
|
364
|
-
} else if (Number.isFinite(before?.x) && before.x >= minAllowedX) {
|
|
365
|
-
after.x = before.x;
|
|
366
|
-
} else {
|
|
367
|
-
after.x = minAllowedX;
|
|
368
|
-
}
|
|
369
|
-
rankMaxX = Math.max(rankMaxX, after.x);
|
|
370
|
-
}
|
|
371
|
-
minAllowedX = rankMaxX + 1;
|
|
305
|
+
// Constrain X to measured semantic corridors. Dagre supplies ordering and route
|
|
306
|
+
// control points; process-tree depth is retained within the runtime corridor.
|
|
307
|
+
// All render paths consume these final coordinates, including Arrange.
|
|
308
|
+
let floor=-Infinity;
|
|
309
|
+
for(const [id,before] of preferred){
|
|
310
|
+
const after=topo.spec.get(id),node=nodeById.get(id);
|
|
311
|
+
if(!after||!node||!isProcess(node))continue;
|
|
312
|
+
after.x=before.x;
|
|
313
|
+
floor=Math.max(floor,after.x+(topo.width?.get(id)||EXECWEAVE_NODE_W)+PROCESS_COL_GAP);
|
|
314
|
+
}
|
|
315
|
+
for(const lane of ['root','agent','model','tool','file','endpoint','other']){
|
|
316
|
+
const ids=[...topo.spec.keys()].filter(id=>topo.spec.get(id)?.lane===lane&&!isProcess(nodeById.get(id)));
|
|
317
|
+
if(!ids.length)continue;
|
|
318
|
+
const laneX=Number.isFinite(topo.laneX?.[lane])?topo.laneX[lane]:Math.min(...ids.map(id=>preferred.get(id).x));
|
|
319
|
+
const x=Math.max(laneX,Number.isFinite(floor)?floor:laneX);
|
|
320
|
+
let right=x;
|
|
321
|
+
for(const id of ids){const after=topo.spec.get(id);after.x=x;right=Math.max(right,x+(topo.width?.get(id)||EXECWEAVE_NODE_W))}
|
|
322
|
+
floor=right+PROCESS_COL_GAP;
|
|
372
323
|
}
|
|
373
324
|
|
|
374
325
|
// Y constraint: Dagre coordinates optimize positions within semantic lane/component bounds
|
|
@@ -462,9 +413,15 @@ function execweaveRestoreSemanticLayoutConstraints(topo,preferred,dagrePlacement
|
|
|
462
413
|
return{value,members,minX,maxX,minY,maxY,w:maxX-minX,h:maxY-minY};
|
|
463
414
|
}).filter(box=>Number.isFinite(box.minX));
|
|
464
415
|
|
|
416
|
+
// Use an aspect-balanced shelf width for disconnected components instead of
|
|
417
|
+
// forcing every component wider than half a short spine onto its own row.
|
|
418
|
+
// Component shapes/ordering stay intact; this is packing, not raw graph repair.
|
|
419
|
+
const columns=Math.max(1,Math.ceil(Math.sqrt(compBoxes.length)));
|
|
420
|
+
const widest=compBoxes.reduce((width,box)=>Math.max(width,box.w),0);
|
|
421
|
+
const packingWidth=Math.max(spineWidth,columns*widest+(columns-1)*bandGap);
|
|
465
422
|
let cursorX=spineLeft,cursorY=spineFloor+bandGap,rowHeight=0;
|
|
466
423
|
for(const box of compBoxes){
|
|
467
|
-
if(cursorX>spineLeft&&cursorX+box.w>spineLeft+
|
|
424
|
+
if(cursorX>spineLeft&&cursorX+box.w>spineLeft+packingWidth){
|
|
468
425
|
cursorX=spineLeft;cursorY+=rowHeight+bandGap;rowHeight=0;
|
|
469
426
|
}
|
|
470
427
|
const shiftX=cursorX-box.minX,shiftY=cursorY-box.minY;
|
|
@@ -565,7 +522,13 @@ function execweaveRouteFromPoints(edge,points){
|
|
|
565
522
|
return{d,labelX:labelPoint.x,labelY:labelPoint.y-8,kind:execweaveIsSpawn(edge)?'spawn':(forward?'forward':'reverse'),bundle:null};
|
|
566
523
|
}
|
|
567
524
|
const execweaveBuildTopologyBase=execweaveBuildTopology;
|
|
568
|
-
execweaveBuildTopology=function(){
|
|
525
|
+
execweaveBuildTopology=function(){
|
|
526
|
+
// Width/height and lane helpers must see THIS build, never the previous graph.
|
|
527
|
+
const topo=execweaveBuildTopologyBase(),prior=execweaveTopology;
|
|
528
|
+
execweaveTopology=topo;
|
|
529
|
+
try{return execweaveApplyDirectedGraph(execweaveLayoutRelated(execweaveLayoutProcessTree(topo)))}
|
|
530
|
+
finally{execweaveTopology=prior}
|
|
531
|
+
};
|
|
569
532
|
if(typeof window!=='undefined'){
|
|
570
533
|
window.execweaveLayoutDirectedGraph=execweaveLayoutDirectedGraph;
|
|
571
534
|
window.execweaveSeparateOverlappingNodes=execweaveSeparateOverlappingNodes;
|
|
@@ -653,13 +616,7 @@ function execweaveWriteDirectedPositions(topo){
|
|
|
653
616
|
const next=new Map();
|
|
654
617
|
for(const id of nodeById.keys()){
|
|
655
618
|
const spec=topo.spec.get(id);
|
|
656
|
-
|
|
657
|
-
const laneX=(topo.laneX&&spec?.lane&&Number.isFinite(topo.laneX[spec.lane]))?topo.laneX[spec.lane]:spec?.x;
|
|
658
|
-
// Connected semantic lanes retain their established X contract. Only
|
|
659
|
-
// disconnected components use the final 2D packing X; forcing those back
|
|
660
|
-
// to the lane origin would stack every orphan node on the same rectangle.
|
|
661
|
-
const initialX=packed?spec?.x:laneX;
|
|
662
|
-
next.set(id,spec?{x:initialX,y:spec.y}:execweaveDesiredPosition(id));
|
|
619
|
+
next.set(id,spec?{x:spec.x,y:spec.y}:execweaveDesiredPosition(id));
|
|
663
620
|
}
|
|
664
621
|
positions=next;layerRows=new Map();
|
|
665
622
|
for(const [id,p] of positions){
|
|
@@ -673,20 +630,19 @@ function execweaveWriteDirectedPositions(topo){
|
|
|
673
630
|
for(const edge of edgeById.values())updateEdgeElement(edge);
|
|
674
631
|
svg.classList.toggle('execweave-crowded',!!topo.crowded);
|
|
675
632
|
}
|
|
676
|
-
|
|
677
|
-
fullLayout=function(){
|
|
678
|
-
const prior=positions;
|
|
679
|
-
const incoming=[...nodeById.keys()].some(id=>!prior.has(id));
|
|
680
|
-
if(prior.size&&!incoming){execweaveFullLayoutBase();return}
|
|
633
|
+
function execweaveInstallFinalLayout(priorY){
|
|
681
634
|
execweaveTopology=execweaveBuildTopology();
|
|
682
635
|
execweaveWriteDirectedPositions(execweaveTopology);
|
|
636
|
+
if(priorY.size&&typeof execweaveRestorePriorYUnlessWorse==='function'){
|
|
637
|
+
execweaveRestorePriorYUnlessWorse(priorY,execweaveTopology);
|
|
638
|
+
window.__execweavePr70.paint();
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
fullLayout=function(){
|
|
642
|
+
execweaveInstallFinalLayout(new Map([...positions].map(([id,p])=>[id,p.y])));
|
|
683
643
|
};
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
const incoming=(ids||[]).filter(id=>nodeById.has(id)&&!positions.has(id));
|
|
687
|
-
if(!incoming.length){execweavePlaceAddedBase(ids);return}
|
|
688
|
-
execweaveTopology=execweaveBuildTopology();
|
|
689
|
-
execweaveWriteDirectedPositions(execweaveTopology);
|
|
644
|
+
placeAddedNodes=function(_ids){
|
|
645
|
+
execweaveInstallFinalLayout(new Map([...positions].map(([id,p])=>[id,p.y])));
|
|
690
646
|
};
|
|
691
647
|
})();
|
|
692
648
|
""".strip()
|
|
@@ -12,7 +12,7 @@ function updateJumpLatest(){jumpLatest.hidden=!latestNodeId||latestInsideSafeZon
|
|
|
12
12
|
function userTookCamera(){if(cameraMode!=='manual')setCameraMode('manual',{apply:false})}
|
|
13
13
|
function zoomBy(factor){userTookCamera();const box=svg.getBoundingClientRect(),mx=box.width/2,my=box.height/2,old=transform.scale,nextScale=Math.min(4,Math.max(.07,old*factor)),gx=(mx-transform.x)/old,gy=(my-transform.y)/old;animateTo({x:mx-gx*nextScale,y:my-gy*nextScale,scale:nextScale},140)}
|
|
14
14
|
function applySearch(){const q=search.value.trim().toLowerCase(),matched=new Set();document.querySelectorAll('.node').forEach(el=>{const ok=!q||el.dataset.search.includes(q);el.classList.toggle('dim',!ok);if(ok)matched.add(el.dataset.id)});document.querySelectorAll('.edge').forEach(el=>{const keep=!q||matched.has(el.dataset.source)||matched.has(el.dataset.target)||el.dataset.relation.includes(q);el.classList.toggle('dim',!keep)})}
|
|
15
|
-
async function poll(){try{const response=await fetch(`/live.json?after=${liveSequence}`,{cache:'no-store'});if(!response.ok)throw new Error(String(response.status));const data=await response.json();if(data.kind==='snapshot'){liveSequence=Number(data.sequence)||0;setSnapshot(data.graph||{});}else if(data.kind==='delta'){if(Number(data.base_sequence)!==liveSequence){liveSequence=-1;setStatus('RESYNCING','resyncing');setTimeout(poll,0);return}for(const update of data.updates||[]){if(Number(update.sequence)!==liveSequence+1){liveSequence=-1;setStatus('RESYNCING','resyncing');setTimeout(poll,0);return}applyDelta(update);liveSequence=Number(update.sequence)}if(!(data.updates||[]).length)liveSequence=Number(data.sequence)||liveSequence;}else if(data.kind==='noop'){liveSequence=Number(data.sequence)||liveSequence;updateStats(data);}window.__execweaveDashboard?.onPayload?.(data);updateEvidence(data);const finished=!!data.live_finished;setStatus(finished?'FINISHED':(protectedMode?'PROTECTED':'LIVE'),finished?'finished':protectedMode?'reconnecting':'');if(finished){window.__execweaveDashboard?.onFinished?.();return}}catch(_){setStatus('RECONNECTING','reconnecting')}setTimeout(poll,500)}
|
|
15
|
+
async function poll(){try{const response=await fetch(`/live.json?after=${liveSequence}`,{cache:'no-store'});if(!response.ok)throw new Error(String(response.status));const data=await response.json();if(data.kind==='snapshot'){liveSequence=Number(data.sequence)||0;setSnapshot(data.graph||{});}else if(data.kind==='delta'){if(Number(data.base_sequence)!==liveSequence){liveSequence=-1;setStatus('RESYNCING','resyncing');setTimeout(poll,0);return}for(const update of data.updates||[]){if(Number(update.sequence)!==liveSequence+1){liveSequence=-1;setStatus('RESYNCING','resyncing');setTimeout(poll,0);return}if(update.terminal&&update.final_graph)setSnapshot(update.final_graph);else applyDelta(update);liveSequence=Number(update.sequence)}if(!(data.updates||[]).length)liveSequence=Number(data.sequence)||liveSequence;}else if(data.kind==='noop'){liveSequence=Number(data.sequence)||liveSequence;updateStats(data);}window.__execweaveDashboard?.onPayload?.(data);updateEvidence(data);const finished=!!data.live_finished;setStatus(finished?'FINISHED':(protectedMode?'PROTECTED':'LIVE'),finished?'finished':protectedMode?'reconnecting':'');if(finished){window.__execweaveDashboard?.onFinished?.();return}}catch(_){setStatus('RECONNECTING','reconnecting')}setTimeout(poll,500)}
|
|
16
16
|
svg.onpointerdown=e=>{if(e.target.closest?.('.node'))return;userTookCamera();stopAnimation();pan={x:e.clientX,y:e.clientY,tx:transform.x,ty:transform.y,travelled:false};svg.classList.add('panning');svg.setPointerCapture(e.pointerId)};svg.onpointermove=e=>{if(!pan)return;if(Math.abs(e.clientX-pan.x)>3||Math.abs(e.clientY-pan.y)>3)pan.travelled=true;transform.x=pan.tx+e.clientX-pan.x;transform.y=pan.ty+e.clientY-pan.y;applyTransform();updateJumpLatest()};svg.onpointerup=e=>{const dragged=!!pan?.travelled;pan=null;svg.classList.remove('panning');try{svg.releasePointerCapture(e.pointerId)}catch(_){}if(!dragged&&!e.target.closest?.('.node'))window.__execweaveClearFocus?.()};svg.addEventListener('wheel',e=>{e.preventDefault();userTookCamera();stopAnimation();const rect=svg.getBoundingClientRect(),mx=e.clientX-rect.left,my=e.clientY-rect.top,old=transform.scale,next=Math.min(4,Math.max(.07,old*Math.exp(-e.deltaY*.0012))),gx=(mx-transform.x)/old,gy=(my-transform.y)/old;transform.scale=next;transform.x=mx-gx*next;transform.y=my-gy*next;applyTransform();updateJumpLatest()},{passive:false});
|
|
17
17
|
function focusRawLogEvent(event){const target=event?.target?.id,source=event?.source?.id;if(target&&nodeById.has(target)){selectNode(target,{syncLog:false});focusNode(target);return}if(source&&nodeById.has(source)){selectNode(source,{syncLog:false});focusNode(source)}}
|
|
18
18
|
// Focus is only exitable if something offers the exit. The control appears with the
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"""Conservative Winsock fallback for a timed-out pre-launch loopback connect."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import ipaddress
|
|
5
|
+
import socket
|
|
6
|
+
import sys
|
|
7
|
+
from contextlib import ExitStack
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def windows_exclusive_endpoint_available(host: str, port: int) -> bool:
|
|
11
|
+
"""Require exclusive binds, not a timeout, as evidence of unused addresses.
|
|
12
|
+
|
|
13
|
+
A short Windows connect can time out before an unused port reports refusal.
|
|
14
|
+
SO_EXCLUSIVEADDRUSE prevents taking over an existing bind. Every resolved
|
|
15
|
+
loopback address must be exclusively bindable at the same instant; sockets
|
|
16
|
+
are closed before the real relay/child starts. No listener is created and no
|
|
17
|
+
SO_REUSEADDR is enabled. This proves availability only at the launch boundary,
|
|
18
|
+
not ownership of an unrelated service started later.
|
|
19
|
+
"""
|
|
20
|
+
exclusive = getattr(socket, 'SO_EXCLUSIVEADDRUSE', None)
|
|
21
|
+
if sys.platform != 'win32' or exclusive is None or not 0 < port <= 65535:
|
|
22
|
+
return False
|
|
23
|
+
try:
|
|
24
|
+
addresses = socket.getaddrinfo(host, port, type=socket.SOCK_STREAM,
|
|
25
|
+
proto=socket.IPPROTO_TCP)
|
|
26
|
+
seen = set()
|
|
27
|
+
with ExitStack() as stack:
|
|
28
|
+
for family, kind, protocol, _, address in addresses:
|
|
29
|
+
if family not in (socket.AF_INET, socket.AF_INET6):
|
|
30
|
+
return False
|
|
31
|
+
if not ipaddress.ip_address(address[0]).is_loopback:
|
|
32
|
+
return False
|
|
33
|
+
key = (family, address)
|
|
34
|
+
if key in seen:
|
|
35
|
+
continue
|
|
36
|
+
seen.add(key)
|
|
37
|
+
reservation = stack.enter_context(socket.socket(family, kind, protocol))
|
|
38
|
+
reservation.setsockopt(socket.SOL_SOCKET, exclusive, 1)
|
|
39
|
+
if family == socket.AF_INET6:
|
|
40
|
+
reservation.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 1)
|
|
41
|
+
reservation.bind(address)
|
|
42
|
+
return bool(seen)
|
|
43
|
+
except (OSError, ValueError):
|
|
44
|
+
return False
|
|
@@ -69,6 +69,12 @@ class TerminalState:
|
|
|
69
69
|
|
|
70
70
|
def apply_update(self, update: dict[str, object]) -> None:
|
|
71
71
|
self.sequence = int(update.get("sequence", self.sequence) or self.sequence)
|
|
72
|
+
final_graph = update.get("final_graph")
|
|
73
|
+
if update.get("terminal") and isinstance(final_graph, dict):
|
|
74
|
+
# The web client and Top must consume the same authoritative final
|
|
75
|
+
# entities, including canonical identity replacement, before stopping.
|
|
76
|
+
self.apply_snapshot(final_graph, self.sequence)
|
|
77
|
+
return
|
|
72
78
|
self.event_count = int(update.get("event_count", self.event_count) or 0)
|
|
73
79
|
self.node_count = int(update.get("node_count", self.node_count) or 0)
|
|
74
80
|
self.edge_count = int(update.get("edge_count", self.edge_count) or 0)
|
|
@@ -56,9 +56,22 @@ execweaveDashboardGraph=function(data){
|
|
|
56
56
|
}
|
|
57
57
|
const ollamaRoots=prepared.filter(node=>node?.type==='agent'&&['agent:Ollama','agent:ollama'].includes(String(node.id||'')));
|
|
58
58
|
const ollamaRuntimes=prepared.filter(node=>node?.type==='model_runtime'&&String(node?.attributes?.provider||'').toLowerCase()==='ollama');
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
const runtimeContextSupport=new Map();
|
|
60
|
+
// Same provider/cardinality does not establish runtime ownership. Compress a
|
|
61
|
+
// context only when an explicit, unambiguous agent->runtime observation exists.
|
|
62
|
+
// Otherwise retain the runtime and its original catalog edges, including old
|
|
63
|
+
// failed-launch artifacts that contain observations of a pre-existing server.
|
|
64
|
+
for(const runtime of ollamaRuntimes){
|
|
65
|
+
const incoming=(projected.edges||[]).filter(e=>e?.target===runtime.id&&prepared.some(n=>n.id===e.source&&n.type==='agent'));
|
|
66
|
+
const owners=[...new Set(incoming.map(e=>e.source))];
|
|
67
|
+
const root=owners.length===1?ollamaRoots.find(n=>n.id===owners[0]):null;
|
|
68
|
+
const support=incoming.filter(e=>e.relation==='OBSERVED_MODEL_RUNTIME');
|
|
69
|
+
const conflict=(a,b)=>['provider','run_id','session_id','conversation_id','provider_session_id','agent_path'].some(k=>
|
|
70
|
+
a?.[k]&&b?.[k]&&String(a[k])!==String(b[k]));
|
|
71
|
+
const identities=[runtime.attributes||{},root?.attributes||{},...incoming.map(e=>e.attributes||{})];
|
|
72
|
+
if(!root||!support.length||identities.some((a,i)=>identities.slice(0,i).some(b=>conflict(a,b))))continue;
|
|
73
|
+
presentationAlias.set(runtime.id,root.id);runtimeContextSupport.set(runtime.id,support);
|
|
74
|
+
prepared=prepared.filter(node=>node.id!==runtime.id);
|
|
62
75
|
}
|
|
63
76
|
const normalized=value=>String(value||'').trim().replaceAll('\\\\','/').replace(/\/+$/,'').toLowerCase();
|
|
64
77
|
const canonicalKey=node=>{
|
|
@@ -85,10 +98,15 @@ execweaveDashboardGraph=function(data){
|
|
|
85
98
|
const remapped=[];for(const edge of(projected.edges||[])){
|
|
86
99
|
if(!edge)continue;const source=canonicalId.get(edge.source)||edge.source,target=canonicalId.get(edge.target)||edge.target;
|
|
87
100
|
if(!ids.has(source)||!ids.has(target)||source===target)continue;
|
|
88
|
-
|
|
101
|
+
const support=runtimeContextSupport.get(edge.source);
|
|
102
|
+
if(support){
|
|
103
|
+
remapped.push({...edge,source,target,viewer_only:true,inferred:true,causal:false,
|
|
104
|
+
viewer_runtime_context:true,viewer_original_source:edge.source,viewer_original_target:edge.target,
|
|
105
|
+
viewer_supporting_edges:[...support,edge]});
|
|
106
|
+
}else remapped.push(source===edge.source&&target===edge.target?edge:{...edge,source,target,viewer_canonicalized:true,viewer_original_source:edge.source,viewer_original_target:edge.target});
|
|
89
107
|
}
|
|
90
108
|
const edgeGroups=new Map();
|
|
91
|
-
for(const edge of remapped){const key=`${edge.source}\u0000${edge.relation||''}\u0000${edge.target}`,existing=edgeGroups.get(key);if(!existing){edgeGroups.set(key,{...edge,viewer_edge_occurrence_count:1,viewer_edge_occurrence_ids:[edge.id]});continue}existing.viewer_edge_occurrence_count+=1;existing.viewer_edge_occurrence_ids.push(edge.id);existing.count=Number(existing.count||1)+Number(edge.count||1);if(Number.isInteger(edge.first_sequence))existing.first_sequence=Number.isInteger(existing.first_sequence)?Math.min(existing.first_sequence,edge.first_sequence):edge.first_sequence;if(Number.isInteger(edge.last_sequence))existing.last_sequence=Number.isInteger(existing.last_sequence)?Math.max(existing.last_sequence,edge.last_sequence):edge.last_sequence;existing.first_seen=earlier(existing.first_seen,edge.first_seen);existing.last_seen=later(existing.last_seen,edge.last_seen)}
|
|
109
|
+
for(const edge of remapped){const key=`${edge.source}\u0000${edge.relation||''}\u0000${edge.target}${edge.viewer_runtime_context?'\u0000'+edge.viewer_original_source:''}`,existing=edgeGroups.get(key);if(!existing){edgeGroups.set(key,{...edge,viewer_edge_occurrence_count:1,viewer_edge_occurrence_ids:[edge.id]});continue}existing.viewer_edge_occurrence_count+=1;existing.viewer_edge_occurrence_ids.push(edge.id);existing.count=Number(existing.count||1)+Number(edge.count||1);if(Number.isInteger(edge.first_sequence))existing.first_sequence=Number.isInteger(existing.first_sequence)?Math.min(existing.first_sequence,edge.first_sequence):edge.first_sequence;if(Number.isInteger(edge.last_sequence))existing.last_sequence=Number.isInteger(existing.last_sequence)?Math.max(existing.last_sequence,edge.last_sequence):edge.last_sequence;existing.first_seen=earlier(existing.first_seen,edge.first_seen);existing.last_seen=later(existing.last_seen,edge.last_seen)}
|
|
92
110
|
const edges=[...edgeGroups.values()];
|
|
93
111
|
return{...projected,nodes,edges,node_count:nodes.length,edge_count:edges.length,dashboard_projection:{...(projected.dashboard_projection||{}),hidden_context_node_count:before.length-prepared.length,merged_context_node_count:mergedContextNodeCount,hidden_orphan_file_node_count:0}};
|
|
94
112
|
};
|