execweave 0.7.3__tar.gz → 0.7.4__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.
Files changed (439) hide show
  1. {execweave-0.7.3 → execweave-0.7.4}/PKG-INFO +4 -4
  2. {execweave-0.7.3 → execweave-0.7.4}/README.de.md +3 -3
  3. {execweave-0.7.3 → execweave-0.7.4}/README.fr.md +3 -3
  4. {execweave-0.7.3 → execweave-0.7.4}/README.ja.md +3 -3
  5. {execweave-0.7.3 → execweave-0.7.4}/README.ko.md +3 -3
  6. {execweave-0.7.3 → execweave-0.7.4}/README.md +3 -3
  7. {execweave-0.7.3 → execweave-0.7.4}/README.ru.md +3 -3
  8. {execweave-0.7.3 → execweave-0.7.4}/README.zh-CN.md +3 -3
  9. {execweave-0.7.3 → execweave-0.7.4}/README.zh-TW.md +3 -3
  10. {execweave-0.7.3 → execweave-0.7.4}/pyproject.toml +2 -2
  11. {execweave-0.7.3 → execweave-0.7.4}/scripts/audit_i18n_parity.py +13 -3
  12. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/__init__.py +1 -1
  13. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/_conversation_records_core.py +17 -4
  14. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/live_view_script_a.py +2 -2
  15. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/viewer.py +2 -2
  16. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/viewer_conversation_tree.py +22 -6
  17. execweave-0.7.4/tests/test_conversation_agent_focus.py +229 -0
  18. {execweave-0.7.3 → execweave-0.7.4}/tests/test_v069_dashboard_release.py +6 -6
  19. execweave-0.7.3/.github/workflows/repair-v073.yml +0 -173
  20. {execweave-0.7.3 → execweave-0.7.4}/.github/workflows/ci.yml +0 -0
  21. {execweave-0.7.3 → execweave-0.7.4}/.github/workflows/cleanup-workflow-history.yml +0 -0
  22. {execweave-0.7.3 → execweave-0.7.4}/.github/workflows/i18n.yml +0 -0
  23. {execweave-0.7.3 → execweave-0.7.4}/.github/workflows/package-benchmark.yml +0 -0
  24. {execweave-0.7.3 → execweave-0.7.4}/.github/workflows/package-smoke.yml +0 -0
  25. {execweave-0.7.3 → execweave-0.7.4}/.github/workflows/publish.yml +0 -0
  26. {execweave-0.7.3 → execweave-0.7.4}/.github/workflows/scalability.yml +0 -0
  27. {execweave-0.7.3 → execweave-0.7.4}/.github/workflows/wheel-smoke.yml +0 -0
  28. {execweave-0.7.3 → execweave-0.7.4}/.github/workflows/windows-launcher.yml +0 -0
  29. {execweave-0.7.3 → execweave-0.7.4}/.gitignore +0 -0
  30. {execweave-0.7.3 → execweave-0.7.4}/LICENSE +0 -0
  31. {execweave-0.7.3 → execweave-0.7.4}/benchmarks/phase1_overhead.py +0 -0
  32. {execweave-0.7.3 → execweave-0.7.4}/docs/antigravity-hooks.md +0 -0
  33. {execweave-0.7.3 → execweave-0.7.4}/docs/assets/codex.gif +0 -0
  34. {execweave-0.7.3 → execweave-0.7.4}/docs/benchmarks/README.md +0 -0
  35. {execweave-0.7.3 → execweave-0.7.4}/docs/benchmarks/v0.6.0-github-actions.json +0 -0
  36. {execweave-0.7.3 → execweave-0.7.4}/docs/benchmarks/v0.6.0-github-actions.svg +0 -0
  37. {execweave-0.7.3 → execweave-0.7.4}/docs/claude-code-hooks.de.md +0 -0
  38. {execweave-0.7.3 → execweave-0.7.4}/docs/claude-code-hooks.fr.md +0 -0
  39. {execweave-0.7.3 → execweave-0.7.4}/docs/claude-code-hooks.ja.md +0 -0
  40. {execweave-0.7.3 → execweave-0.7.4}/docs/claude-code-hooks.ko.md +0 -0
  41. {execweave-0.7.3 → execweave-0.7.4}/docs/claude-code-hooks.md +0 -0
  42. {execweave-0.7.3 → execweave-0.7.4}/docs/claude-code-hooks.ru.md +0 -0
  43. {execweave-0.7.3 → execweave-0.7.4}/docs/claude-code-hooks.zh-CN.md +0 -0
  44. {execweave-0.7.3 → execweave-0.7.4}/docs/claude-code-hooks.zh-TW.md +0 -0
  45. {execweave-0.7.3 → execweave-0.7.4}/docs/codex-hooks.de.md +0 -0
  46. {execweave-0.7.3 → execweave-0.7.4}/docs/codex-hooks.fr.md +0 -0
  47. {execweave-0.7.3 → execweave-0.7.4}/docs/codex-hooks.ja.md +0 -0
  48. {execweave-0.7.3 → execweave-0.7.4}/docs/codex-hooks.ko.md +0 -0
  49. {execweave-0.7.3 → execweave-0.7.4}/docs/codex-hooks.md +0 -0
  50. {execweave-0.7.3 → execweave-0.7.4}/docs/codex-hooks.ru.md +0 -0
  51. {execweave-0.7.3 → execweave-0.7.4}/docs/codex-hooks.zh-CN.md +0 -0
  52. {execweave-0.7.3 → execweave-0.7.4}/docs/codex-hooks.zh-TW.md +0 -0
  53. {execweave-0.7.3 → execweave-0.7.4}/docs/cursor-hooks.de.md +0 -0
  54. {execweave-0.7.3 → execweave-0.7.4}/docs/cursor-hooks.fr.md +0 -0
  55. {execweave-0.7.3 → execweave-0.7.4}/docs/cursor-hooks.ja.md +0 -0
  56. {execweave-0.7.3 → execweave-0.7.4}/docs/cursor-hooks.ko.md +0 -0
  57. {execweave-0.7.3 → execweave-0.7.4}/docs/cursor-hooks.md +0 -0
  58. {execweave-0.7.3 → execweave-0.7.4}/docs/cursor-hooks.ru.md +0 -0
  59. {execweave-0.7.3 → execweave-0.7.4}/docs/cursor-hooks.zh-CN.md +0 -0
  60. {execweave-0.7.3 → execweave-0.7.4}/docs/cursor-hooks.zh-TW.md +0 -0
  61. {execweave-0.7.3 → execweave-0.7.4}/docs/evidence-grades.de.md +0 -0
  62. {execweave-0.7.3 → execweave-0.7.4}/docs/evidence-grades.fr.md +0 -0
  63. {execweave-0.7.3 → execweave-0.7.4}/docs/evidence-grades.ja.md +0 -0
  64. {execweave-0.7.3 → execweave-0.7.4}/docs/evidence-grades.ko.md +0 -0
  65. {execweave-0.7.3 → execweave-0.7.4}/docs/evidence-grades.md +0 -0
  66. {execweave-0.7.3 → execweave-0.7.4}/docs/evidence-grades.ru.md +0 -0
  67. {execweave-0.7.3 → execweave-0.7.4}/docs/evidence-grades.zh-CN.md +0 -0
  68. {execweave-0.7.3 → execweave-0.7.4}/docs/evidence-grades.zh-TW.md +0 -0
  69. {execweave-0.7.3 → execweave-0.7.4}/docs/gemini-hooks.de.md +0 -0
  70. {execweave-0.7.3 → execweave-0.7.4}/docs/gemini-hooks.fr.md +0 -0
  71. {execweave-0.7.3 → execweave-0.7.4}/docs/gemini-hooks.ja.md +0 -0
  72. {execweave-0.7.3 → execweave-0.7.4}/docs/gemini-hooks.ko.md +0 -0
  73. {execweave-0.7.3 → execweave-0.7.4}/docs/gemini-hooks.md +0 -0
  74. {execweave-0.7.3 → execweave-0.7.4}/docs/gemini-hooks.ru.md +0 -0
  75. {execweave-0.7.3 → execweave-0.7.4}/docs/gemini-hooks.zh-CN.md +0 -0
  76. {execweave-0.7.3 → execweave-0.7.4}/docs/gemini-hooks.zh-TW.md +0 -0
  77. {execweave-0.7.3 → execweave-0.7.4}/docs/inference-gateway.de.md +0 -0
  78. {execweave-0.7.3 → execweave-0.7.4}/docs/inference-gateway.fr.md +0 -0
  79. {execweave-0.7.3 → execweave-0.7.4}/docs/inference-gateway.ja.md +0 -0
  80. {execweave-0.7.3 → execweave-0.7.4}/docs/inference-gateway.ko.md +0 -0
  81. {execweave-0.7.3 → execweave-0.7.4}/docs/inference-gateway.md +0 -0
  82. {execweave-0.7.3 → execweave-0.7.4}/docs/inference-gateway.ru.md +0 -0
  83. {execweave-0.7.3 → execweave-0.7.4}/docs/inference-gateway.zh-CN.md +0 -0
  84. {execweave-0.7.3 → execweave-0.7.4}/docs/inference-gateway.zh-TW.md +0 -0
  85. {execweave-0.7.3 → execweave-0.7.4}/docs/live-graph.de.md +0 -0
  86. {execweave-0.7.3 → execweave-0.7.4}/docs/live-graph.fr.md +0 -0
  87. {execweave-0.7.3 → execweave-0.7.4}/docs/live-graph.ja.md +0 -0
  88. {execweave-0.7.3 → execweave-0.7.4}/docs/live-graph.ko.md +0 -0
  89. {execweave-0.7.3 → execweave-0.7.4}/docs/live-graph.md +0 -0
  90. {execweave-0.7.3 → execweave-0.7.4}/docs/live-graph.ru.md +0 -0
  91. {execweave-0.7.3 → execweave-0.7.4}/docs/live-graph.zh-CN.md +0 -0
  92. {execweave-0.7.3 → execweave-0.7.4}/docs/live-graph.zh-TW.md +0 -0
  93. {execweave-0.7.3 → execweave-0.7.4}/docs/model-runtime.de.md +0 -0
  94. {execweave-0.7.3 → execweave-0.7.4}/docs/model-runtime.fr.md +0 -0
  95. {execweave-0.7.3 → execweave-0.7.4}/docs/model-runtime.ja.md +0 -0
  96. {execweave-0.7.3 → execweave-0.7.4}/docs/model-runtime.ko.md +0 -0
  97. {execweave-0.7.3 → execweave-0.7.4}/docs/model-runtime.md +0 -0
  98. {execweave-0.7.3 → execweave-0.7.4}/docs/model-runtime.ru.md +0 -0
  99. {execweave-0.7.3 → execweave-0.7.4}/docs/model-runtime.zh-CN.md +0 -0
  100. {execweave-0.7.3 → execweave-0.7.4}/docs/model-runtime.zh-TW.md +0 -0
  101. {execweave-0.7.3 → execweave-0.7.4}/docs/opencode-plugin.de.md +0 -0
  102. {execweave-0.7.3 → execweave-0.7.4}/docs/opencode-plugin.fr.md +0 -0
  103. {execweave-0.7.3 → execweave-0.7.4}/docs/opencode-plugin.ja.md +0 -0
  104. {execweave-0.7.3 → execweave-0.7.4}/docs/opencode-plugin.ko.md +0 -0
  105. {execweave-0.7.3 → execweave-0.7.4}/docs/opencode-plugin.md +0 -0
  106. {execweave-0.7.3 → execweave-0.7.4}/docs/opencode-plugin.ru.md +0 -0
  107. {execweave-0.7.3 → execweave-0.7.4}/docs/opencode-plugin.zh-CN.md +0 -0
  108. {execweave-0.7.3 → execweave-0.7.4}/docs/opencode-plugin.zh-TW.md +0 -0
  109. {execweave-0.7.3 → execweave-0.7.4}/docs/phase-1-runtime-collection.de.md +0 -0
  110. {execweave-0.7.3 → execweave-0.7.4}/docs/phase-1-runtime-collection.fr.md +0 -0
  111. {execweave-0.7.3 → execweave-0.7.4}/docs/phase-1-runtime-collection.ja.md +0 -0
  112. {execweave-0.7.3 → execweave-0.7.4}/docs/phase-1-runtime-collection.ko.md +0 -0
  113. {execweave-0.7.3 → execweave-0.7.4}/docs/phase-1-runtime-collection.md +0 -0
  114. {execweave-0.7.3 → execweave-0.7.4}/docs/phase-1-runtime-collection.ru.md +0 -0
  115. {execweave-0.7.3 → execweave-0.7.4}/docs/phase-1-runtime-collection.zh-CN.md +0 -0
  116. {execweave-0.7.3 → execweave-0.7.4}/docs/phase-1-runtime-collection.zh-TW.md +0 -0
  117. {execweave-0.7.3 → execweave-0.7.4}/docs/phase-2-execution-graph.de.md +0 -0
  118. {execweave-0.7.3 → execweave-0.7.4}/docs/phase-2-execution-graph.fr.md +0 -0
  119. {execweave-0.7.3 → execweave-0.7.4}/docs/phase-2-execution-graph.ja.md +0 -0
  120. {execweave-0.7.3 → execweave-0.7.4}/docs/phase-2-execution-graph.ko.md +0 -0
  121. {execweave-0.7.3 → execweave-0.7.4}/docs/phase-2-execution-graph.md +0 -0
  122. {execweave-0.7.3 → execweave-0.7.4}/docs/phase-2-execution-graph.ru.md +0 -0
  123. {execweave-0.7.3 → execweave-0.7.4}/docs/phase-2-execution-graph.zh-CN.md +0 -0
  124. {execweave-0.7.3 → execweave-0.7.4}/docs/phase-2-execution-graph.zh-TW.md +0 -0
  125. {execweave-0.7.3 → execweave-0.7.4}/docs/rule-packs.de.md +0 -0
  126. {execweave-0.7.3 → execweave-0.7.4}/docs/rule-packs.fr.md +0 -0
  127. {execweave-0.7.3 → execweave-0.7.4}/docs/rule-packs.ja.md +0 -0
  128. {execweave-0.7.3 → execweave-0.7.4}/docs/rule-packs.ko.md +0 -0
  129. {execweave-0.7.3 → execweave-0.7.4}/docs/rule-packs.md +0 -0
  130. {execweave-0.7.3 → execweave-0.7.4}/docs/rule-packs.ru.md +0 -0
  131. {execweave-0.7.3 → execweave-0.7.4}/docs/rule-packs.zh-CN.md +0 -0
  132. {execweave-0.7.3 → execweave-0.7.4}/docs/rule-packs.zh-TW.md +0 -0
  133. {execweave-0.7.3 → execweave-0.7.4}/docs/run-integrity.de.md +0 -0
  134. {execweave-0.7.3 → execweave-0.7.4}/docs/run-integrity.fr.md +0 -0
  135. {execweave-0.7.3 → execweave-0.7.4}/docs/run-integrity.ja.md +0 -0
  136. {execweave-0.7.3 → execweave-0.7.4}/docs/run-integrity.ko.md +0 -0
  137. {execweave-0.7.3 → execweave-0.7.4}/docs/run-integrity.md +0 -0
  138. {execweave-0.7.3 → execweave-0.7.4}/docs/run-integrity.ru.md +0 -0
  139. {execweave-0.7.3 → execweave-0.7.4}/docs/run-integrity.zh-CN.md +0 -0
  140. {execweave-0.7.3 → execweave-0.7.4}/docs/run-integrity.zh-TW.md +0 -0
  141. {execweave-0.7.3 → execweave-0.7.4}/docs/runtime-threat-model.de.md +0 -0
  142. {execweave-0.7.3 → execweave-0.7.4}/docs/runtime-threat-model.fr.md +0 -0
  143. {execweave-0.7.3 → execweave-0.7.4}/docs/runtime-threat-model.ja.md +0 -0
  144. {execweave-0.7.3 → execweave-0.7.4}/docs/runtime-threat-model.ko.md +0 -0
  145. {execweave-0.7.3 → execweave-0.7.4}/docs/runtime-threat-model.md +0 -0
  146. {execweave-0.7.3 → execweave-0.7.4}/docs/runtime-threat-model.ru.md +0 -0
  147. {execweave-0.7.3 → execweave-0.7.4}/docs/runtime-threat-model.zh-CN.md +0 -0
  148. {execweave-0.7.3 → execweave-0.7.4}/docs/runtime-threat-model.zh-TW.md +0 -0
  149. {execweave-0.7.3 → execweave-0.7.4}/docs/security-analysis.de.md +0 -0
  150. {execweave-0.7.3 → execweave-0.7.4}/docs/security-analysis.fr.md +0 -0
  151. {execweave-0.7.3 → execweave-0.7.4}/docs/security-analysis.ja.md +0 -0
  152. {execweave-0.7.3 → execweave-0.7.4}/docs/security-analysis.ko.md +0 -0
  153. {execweave-0.7.3 → execweave-0.7.4}/docs/security-analysis.md +0 -0
  154. {execweave-0.7.3 → execweave-0.7.4}/docs/security-analysis.ru.md +0 -0
  155. {execweave-0.7.3 → execweave-0.7.4}/docs/security-analysis.zh-CN.md +0 -0
  156. {execweave-0.7.3 → execweave-0.7.4}/docs/security-analysis.zh-TW.md +0 -0
  157. {execweave-0.7.3 → execweave-0.7.4}/docs/semantic-telemetry.de.md +0 -0
  158. {execweave-0.7.3 → execweave-0.7.4}/docs/semantic-telemetry.fr.md +0 -0
  159. {execweave-0.7.3 → execweave-0.7.4}/docs/semantic-telemetry.ja.md +0 -0
  160. {execweave-0.7.3 → execweave-0.7.4}/docs/semantic-telemetry.ko.md +0 -0
  161. {execweave-0.7.3 → execweave-0.7.4}/docs/semantic-telemetry.md +0 -0
  162. {execweave-0.7.3 → execweave-0.7.4}/docs/semantic-telemetry.ru.md +0 -0
  163. {execweave-0.7.3 → execweave-0.7.4}/docs/semantic-telemetry.zh-CN.md +0 -0
  164. {execweave-0.7.3 → execweave-0.7.4}/docs/semantic-telemetry.zh-TW.md +0 -0
  165. {execweave-0.7.3 → execweave-0.7.4}/docs/v0.6.5-hardening-decisions.md +0 -0
  166. {execweave-0.7.3 → execweave-0.7.4}/scripts/check_claude_hook.py +0 -0
  167. {execweave-0.7.3 → execweave-0.7.4}/scripts/check_claude_record_graph.py +0 -0
  168. {execweave-0.7.3 → execweave-0.7.4}/scripts/check_codex_hook.py +0 -0
  169. {execweave-0.7.3 → execweave-0.7.4}/scripts/check_conversation_records.py +0 -0
  170. {execweave-0.7.3 → execweave-0.7.4}/scripts/check_correlation_graph.py +0 -0
  171. {execweave-0.7.3 → execweave-0.7.4}/scripts/check_inference_gateway_cli.py +0 -0
  172. {execweave-0.7.3 → execweave-0.7.4}/scripts/check_model_runtime_cli.py +0 -0
  173. {execweave-0.7.3 → execweave-0.7.4}/scripts/check_openai_compatible_cli.py +0 -0
  174. {execweave-0.7.3 → execweave-0.7.4}/scripts/check_semantic_graph.py +0 -0
  175. {execweave-0.7.3 → execweave-0.7.4}/scripts/check_viewer_js.py +0 -0
  176. {execweave-0.7.3 → execweave-0.7.4}/scripts/check_wheel_install.py +0 -0
  177. {execweave-0.7.3 → execweave-0.7.4}/scripts/check_windows_launchers.py +0 -0
  178. {execweave-0.7.3 → execweave-0.7.4}/scripts/emit_claude_hook_smoke.py +0 -0
  179. {execweave-0.7.3 → execweave-0.7.4}/scripts/emit_codex_hook_smoke.py +0 -0
  180. {execweave-0.7.3 → execweave-0.7.4}/scripts/emit_cursor_hook_smoke.py +0 -0
  181. {execweave-0.7.3 → execweave-0.7.4}/scripts/emit_gemini_hook_smoke.py +0 -0
  182. {execweave-0.7.3 → execweave-0.7.4}/scripts/emit_opencode_plugin_smoke.py +0 -0
  183. {execweave-0.7.3 → execweave-0.7.4}/scripts/make_semantic_smoke.py +0 -0
  184. {execweave-0.7.3 → execweave-0.7.4}/scripts/sync_i18n_nav.py +0 -0
  185. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/__main__.py +0 -0
  186. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/agent_bootstrap.py +0 -0
  187. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/agent_topology.py +0 -0
  188. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/agent_trace.py +0 -0
  189. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/analysis.py +0 -0
  190. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/anthropic.py +0 -0
  191. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/anthropic_cli.py +0 -0
  192. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/anthropic_full_fidelity.py +0 -0
  193. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/antigravity_adapter.py +0 -0
  194. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/antigravity_adapter_base.py +0 -0
  195. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/antigravity_full_fidelity.py +0 -0
  196. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/antigravity_full_fidelity_base.py +0 -0
  197. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/antigravity_full_fidelity_collaboration_base.py +0 -0
  198. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/antigravity_hook_cli.py +0 -0
  199. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/antigravity_record.py +0 -0
  200. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/antigravity_subagent_linkage.py +0 -0
  201. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/antigravity_trace_capability.py +0 -0
  202. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/auto_specialized.py +0 -0
  203. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/backends.py +0 -0
  204. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/benchmark.py +0 -0
  205. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/claude_adapter.py +0 -0
  206. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/claude_delegation.py +0 -0
  207. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/claude_full_fidelity.py +0 -0
  208. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/claude_hook_cli.py +0 -0
  209. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/claude_hook_contract.py +0 -0
  210. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/claude_model_observer.py +0 -0
  211. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/claude_record.py +0 -0
  212. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/cli.py +0 -0
  213. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/codex_adapter.py +0 -0
  214. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/codex_conversation.py +0 -0
  215. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/codex_full_fidelity.py +0 -0
  216. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/codex_hook_cli.py +0 -0
  217. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/codex_hook_lifecycle.py +0 -0
  218. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/codex_message_diagnostics.py +0 -0
  219. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/codex_message_transport_diagnostics.py +0 -0
  220. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/codex_record.py +0 -0
  221. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/codex_rollout_structures.py +0 -0
  222. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/codex_rollout_trace.py +0 -0
  223. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/codex_rollout_trace_base.py +0 -0
  224. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/collector.py +0 -0
  225. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/command.py +0 -0
  226. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/content_evidence.py +0 -0
  227. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/content_store.py +0 -0
  228. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/conversation_archive.py +0 -0
  229. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/conversation_message_identity.py +0 -0
  230. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/conversation_preview.py +0 -0
  231. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/conversation_records.py +0 -0
  232. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/correlation.py +0 -0
  233. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/cursor_adapter.py +0 -0
  234. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/cursor_delegation.py +0 -0
  235. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/cursor_delegation_base.py +0 -0
  236. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/cursor_full_fidelity.py +0 -0
  237. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/cursor_hook_cli.py +0 -0
  238. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/cursor_hook_contract.py +0 -0
  239. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/cursor_record.py +0 -0
  240. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/entry.py +0 -0
  241. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/evidence_grade.py +0 -0
  242. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/fidelity.py +0 -0
  243. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/filesystem.py +0 -0
  244. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/focus.py +0 -0
  245. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/gemini_adapter.py +0 -0
  246. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/gemini_full_fidelity.py +0 -0
  247. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/gemini_hook_cli.py +0 -0
  248. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/gemini_hook_contract.py +0 -0
  249. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/gemini_record.py +0 -0
  250. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/graph.py +0 -0
  251. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/graph_ops.py +0 -0
  252. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/http_proxy.py +0 -0
  253. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/http_proxy_cli.py +0 -0
  254. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/inference_gateway.py +0 -0
  255. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/inference_gateway_cli.py +0 -0
  256. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/inference_gateway_full_fidelity.py +0 -0
  257. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/inference_identity.py +0 -0
  258. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/inference_identity_cli.py +0 -0
  259. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/integrity.py +0 -0
  260. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/integrity_cli.py +0 -0
  261. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/litellm_callback.py +0 -0
  262. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/litellm_callback_cli.py +0 -0
  263. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/live.py +0 -0
  264. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/live_core.py +0 -0
  265. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/live_view.py +0 -0
  266. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/live_view_extra_style.py +0 -0
  267. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/live_view_markup.py +0 -0
  268. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/live_view_script_b.py +0 -0
  269. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/live_view_script_c.py +0 -0
  270. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/live_view_script_d.py +0 -0
  271. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/live_view_style.py +0 -0
  272. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/model_runtime.py +0 -0
  273. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/model_runtime_cli.py +0 -0
  274. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/model_runtime_full_fidelity.py +0 -0
  275. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/openai_compatible.py +0 -0
  276. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/openai_compatible_cli.py +0 -0
  277. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/openai_compatible_full_fidelity.py +0 -0
  278. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/opencode_adapter.py +0 -0
  279. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/opencode_event_contract.py +0 -0
  280. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/opencode_full_fidelity.py +0 -0
  281. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/opencode_hook_cli.py +0 -0
  282. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/opencode_plugin_cli.py +0 -0
  283. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/opencode_record.py +0 -0
  284. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/opencode_task_linkage.py +0 -0
  285. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/overhead_benchmark.py +0 -0
  286. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/provider_lifecycle.py +0 -0
  287. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/provider_record.py +0 -0
  288. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/rule_pack.py +0 -0
  289. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/rule_pack_cli.py +0 -0
  290. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/scalability_benchmark.py +0 -0
  291. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/schema.py +0 -0
  292. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/scope.py +0 -0
  293. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/semantic.py +0 -0
  294. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/sink.py +0 -0
  295. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/strace_backend.py +0 -0
  296. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/theme.py +0 -0
  297. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/top.py +0 -0
  298. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/top_cli.py +0 -0
  299. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/validate.py +0 -0
  300. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/view_cli.py +0 -0
  301. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/viewer_antigravity_linkage_inspector.py +0 -0
  302. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/viewer_content_inspector.py +0 -0
  303. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/viewer_conversation_panel.py +0 -0
  304. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/viewer_dashboard_clean.py +0 -0
  305. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/viewer_dashboard_focus.py +0 -0
  306. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/viewer_execution_inspector.py +0 -0
  307. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/viewer_live_layout.py +0 -0
  308. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/viewer_projection.py +0 -0
  309. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/viewer_projection_base.py +0 -0
  310. {execweave-0.7.3 → execweave-0.7.4}/src/execweave/workflow.py +0 -0
  311. {execweave-0.7.3 → execweave-0.7.4}/tests/fixtures/codex_multi_agent/PROVENANCE.md +0 -0
  312. {execweave-0.7.3 → execweave-0.7.4}/tests/fixtures/codex_multi_agent/hook-payloads.json +0 -0
  313. {execweave-0.7.3 → execweave-0.7.4}/tests/fixtures/codex_multi_agent/rollout-main.jsonl +0 -0
  314. {execweave-0.7.3 → execweave-0.7.4}/tests/fixtures/hooks/README.md +0 -0
  315. {execweave-0.7.3 → execweave-0.7.4}/tests/fixtures/hooks/claude.json +0 -0
  316. {execweave-0.7.3 → execweave-0.7.4}/tests/fixtures/hooks/codex.json +0 -0
  317. {execweave-0.7.3 → execweave-0.7.4}/tests/fixtures/hooks/cursor.json +0 -0
  318. {execweave-0.7.3 → execweave-0.7.4}/tests/fixtures/hooks/gemini.json +0 -0
  319. {execweave-0.7.3 → execweave-0.7.4}/tests/fixtures/hooks/manifest.json +0 -0
  320. {execweave-0.7.3 → execweave-0.7.4}/tests/fixtures/hooks/opencode.json +0 -0
  321. {execweave-0.7.3 → execweave-0.7.4}/tests/test_agent_bootstrap.py +0 -0
  322. {execweave-0.7.3 → execweave-0.7.4}/tests/test_agent_message_viewer.py +0 -0
  323. {execweave-0.7.3 → execweave-0.7.4}/tests/test_agent_topology_evidence.py +0 -0
  324. {execweave-0.7.3 → execweave-0.7.4}/tests/test_agent_trace_lifecycle.py +0 -0
  325. {execweave-0.7.3 → execweave-0.7.4}/tests/test_agent_trace_viewer_visibility.py +0 -0
  326. {execweave-0.7.3 → execweave-0.7.4}/tests/test_analysis.py +0 -0
  327. {execweave-0.7.3 → execweave-0.7.4}/tests/test_anthropic.py +0 -0
  328. {execweave-0.7.3 → execweave-0.7.4}/tests/test_antigravity_agent_collaboration.py +0 -0
  329. {execweave-0.7.3 → execweave-0.7.4}/tests/test_antigravity_cursor_launch.py +0 -0
  330. {execweave-0.7.3 → execweave-0.7.4}/tests/test_antigravity_lifecycle.py +0 -0
  331. {execweave-0.7.3 → execweave-0.7.4}/tests/test_antigravity_linkage_projection.py +0 -0
  332. {execweave-0.7.3 → execweave-0.7.4}/tests/test_antigravity_official_contract.py +0 -0
  333. {execweave-0.7.3 → execweave-0.7.4}/tests/test_antigravity_subagent_transcript_linkage.py +0 -0
  334. {execweave-0.7.3 → execweave-0.7.4}/tests/test_antigravity_trace_capability_cli.py +0 -0
  335. {execweave-0.7.3 → execweave-0.7.4}/tests/test_auto_specialized.py +0 -0
  336. {execweave-0.7.3 → execweave-0.7.4}/tests/test_backends.py +0 -0
  337. {execweave-0.7.3 → execweave-0.7.4}/tests/test_claude_adapter.py +0 -0
  338. {execweave-0.7.3 → execweave-0.7.4}/tests/test_claude_delegation.py +0 -0
  339. {execweave-0.7.3 → execweave-0.7.4}/tests/test_claude_full_fidelity.py +0 -0
  340. {execweave-0.7.3 → execweave-0.7.4}/tests/test_claude_hook_contract.py +0 -0
  341. {execweave-0.7.3 → execweave-0.7.4}/tests/test_claude_hook_metadata.py +0 -0
  342. {execweave-0.7.3 → execweave-0.7.4}/tests/test_claude_hook_viewer.py +0 -0
  343. {execweave-0.7.3 → execweave-0.7.4}/tests/test_claude_model_observer.py +0 -0
  344. {execweave-0.7.3 → execweave-0.7.4}/tests/test_claude_record.py +0 -0
  345. {execweave-0.7.3 → execweave-0.7.4}/tests/test_codex_adapter.py +0 -0
  346. {execweave-0.7.3 → execweave-0.7.4}/tests/test_codex_archive_full_fidelity.py +0 -0
  347. {execweave-0.7.3 → execweave-0.7.4}/tests/test_codex_conversation_isolation.py +0 -0
  348. {execweave-0.7.3 → execweave-0.7.4}/tests/test_codex_full_fidelity.py +0 -0
  349. {execweave-0.7.3 → execweave-0.7.4}/tests/test_codex_hook_lifecycle.py +0 -0
  350. {execweave-0.7.3 → execweave-0.7.4}/tests/test_codex_hook_partial_capture.py +0 -0
  351. {execweave-0.7.3 → execweave-0.7.4}/tests/test_codex_message_diagnostics.py +0 -0
  352. {execweave-0.7.3 → execweave-0.7.4}/tests/test_codex_message_transport_diagnostics.py +0 -0
  353. {execweave-0.7.3 → execweave-0.7.4}/tests/test_codex_real_multi_agent_conversation.py +0 -0
  354. {execweave-0.7.3 → execweave-0.7.4}/tests/test_codex_record.py +0 -0
  355. {execweave-0.7.3 → execweave-0.7.4}/tests/test_codex_reducer_command.py +0 -0
  356. {execweave-0.7.3 → execweave-0.7.4}/tests/test_codex_rollout_structures.py +0 -0
  357. {execweave-0.7.3 → execweave-0.7.4}/tests/test_codex_rollout_trace.py +0 -0
  358. {execweave-0.7.3 → execweave-0.7.4}/tests/test_codex_routing_native_identity.py +0 -0
  359. {execweave-0.7.3 → execweave-0.7.4}/tests/test_collector.py +0 -0
  360. {execweave-0.7.3 → execweave-0.7.4}/tests/test_command.py +0 -0
  361. {execweave-0.7.3 → execweave-0.7.4}/tests/test_condense.py +0 -0
  362. {execweave-0.7.3 → execweave-0.7.4}/tests/test_conversation_access.py +0 -0
  363. {execweave-0.7.3 → execweave-0.7.4}/tests/test_conversation_agent_isolation.py +0 -0
  364. {execweave-0.7.3 → execweave-0.7.4}/tests/test_conversation_identity_merge.py +0 -0
  365. {execweave-0.7.3 → execweave-0.7.4}/tests/test_conversation_message_observation_dedupe.py +0 -0
  366. {execweave-0.7.3 → execweave-0.7.4}/tests/test_conversation_provider_parity.py +0 -0
  367. {execweave-0.7.3 → execweave-0.7.4}/tests/test_correlation.py +0 -0
  368. {execweave-0.7.3 → execweave-0.7.4}/tests/test_correlation_canonical_path.py +0 -0
  369. {execweave-0.7.3 → execweave-0.7.4}/tests/test_correlation_checker.py +0 -0
  370. {execweave-0.7.3 → execweave-0.7.4}/tests/test_correlation_process_exe.py +0 -0
  371. {execweave-0.7.3 → execweave-0.7.4}/tests/test_cross_provider_agent_trace.py +0 -0
  372. {execweave-0.7.3 → execweave-0.7.4}/tests/test_cursor_adapter.py +0 -0
  373. {execweave-0.7.3 → execweave-0.7.4}/tests/test_cursor_delegation.py +0 -0
  374. {execweave-0.7.3 → execweave-0.7.4}/tests/test_cursor_full_fidelity.py +0 -0
  375. {execweave-0.7.3 → execweave-0.7.4}/tests/test_cursor_hook_contract.py +0 -0
  376. {execweave-0.7.3 → execweave-0.7.4}/tests/test_cursor_hook_fail_open.py +0 -0
  377. {execweave-0.7.3 → execweave-0.7.4}/tests/test_cursor_record.py +0 -0
  378. {execweave-0.7.3 → execweave-0.7.4}/tests/test_cursor_task_linkage.py +0 -0
  379. {execweave-0.7.3 → execweave-0.7.4}/tests/test_dashboard_information_architecture.py +0 -0
  380. {execweave-0.7.3 → execweave-0.7.4}/tests/test_dashboard_simplification.py +0 -0
  381. {execweave-0.7.3 → execweave-0.7.4}/tests/test_dashboard_ux_and_hook_projection.py +0 -0
  382. {execweave-0.7.3 → execweave-0.7.4}/tests/test_delegation_viewer.py +0 -0
  383. {execweave-0.7.3 → execweave-0.7.4}/tests/test_evidence_grade.py +0 -0
  384. {execweave-0.7.3 → execweave-0.7.4}/tests/test_execution_viewer.py +0 -0
  385. {execweave-0.7.3 → execweave-0.7.4}/tests/test_fidelity.py +0 -0
  386. {execweave-0.7.3 → execweave-0.7.4}/tests/test_filesystem_resilience.py +0 -0
  387. {execweave-0.7.3 → execweave-0.7.4}/tests/test_focus.py +0 -0
  388. {execweave-0.7.3 → execweave-0.7.4}/tests/test_full_fidelity.py +0 -0
  389. {execweave-0.7.3 → execweave-0.7.4}/tests/test_gemini_adapter.py +0 -0
  390. {execweave-0.7.3 → execweave-0.7.4}/tests/test_gemini_full_fidelity.py +0 -0
  391. {execweave-0.7.3 → execweave-0.7.4}/tests/test_gemini_hook_contract.py +0 -0
  392. {execweave-0.7.3 → execweave-0.7.4}/tests/test_gemini_lifecycle.py +0 -0
  393. {execweave-0.7.3 → execweave-0.7.4}/tests/test_gemini_record.py +0 -0
  394. {execweave-0.7.3 → execweave-0.7.4}/tests/test_graph.py +0 -0
  395. {execweave-0.7.3 → execweave-0.7.4}/tests/test_graph_ops.py +0 -0
  396. {execweave-0.7.3 → execweave-0.7.4}/tests/test_hook_fixture_corpus.py +0 -0
  397. {execweave-0.7.3 → execweave-0.7.4}/tests/test_http_proxy.py +0 -0
  398. {execweave-0.7.3 → execweave-0.7.4}/tests/test_inference_gateway.py +0 -0
  399. {execweave-0.7.3 → execweave-0.7.4}/tests/test_inference_gateway_full_fidelity.py +0 -0
  400. {execweave-0.7.3 → execweave-0.7.4}/tests/test_inference_identity.py +0 -0
  401. {execweave-0.7.3 → execweave-0.7.4}/tests/test_integrity.py +0 -0
  402. {execweave-0.7.3 → execweave-0.7.4}/tests/test_litellm_callback.py +0 -0
  403. {execweave-0.7.3 → execweave-0.7.4}/tests/test_live.py +0 -0
  404. {execweave-0.7.3 → execweave-0.7.4}/tests/test_live_auth.py +0 -0
  405. {execweave-0.7.3 → execweave-0.7.4}/tests/test_live_dashboard.py +0 -0
  406. {execweave-0.7.3 → execweave-0.7.4}/tests/test_live_dashboard_js.py +0 -0
  407. {execweave-0.7.3 → execweave-0.7.4}/tests/test_live_delta.py +0 -0
  408. {execweave-0.7.3 → execweave-0.7.4}/tests/test_live_logs_export.py +0 -0
  409. {execweave-0.7.3 → execweave-0.7.4}/tests/test_live_theme.py +0 -0
  410. {execweave-0.7.3 → execweave-0.7.4}/tests/test_lmstudio_auto_specialized.py +0 -0
  411. {execweave-0.7.3 → execweave-0.7.4}/tests/test_model_runtime.py +0 -0
  412. {execweave-0.7.3 → execweave-0.7.4}/tests/test_model_runtime_full_fidelity.py +0 -0
  413. {execweave-0.7.3 → execweave-0.7.4}/tests/test_openai_compatible.py +0 -0
  414. {execweave-0.7.3 → execweave-0.7.4}/tests/test_opencode_adapter.py +0 -0
  415. {execweave-0.7.3 → execweave-0.7.4}/tests/test_opencode_event_contract.py +0 -0
  416. {execweave-0.7.3 → execweave-0.7.4}/tests/test_opencode_event_lifecycle.py +0 -0
  417. {execweave-0.7.3 → execweave-0.7.4}/tests/test_opencode_full_fidelity.py +0 -0
  418. {execweave-0.7.3 → execweave-0.7.4}/tests/test_opencode_plugin.py +0 -0
  419. {execweave-0.7.3 → execweave-0.7.4}/tests/test_opencode_record.py +0 -0
  420. {execweave-0.7.3 → execweave-0.7.4}/tests/test_opencode_task_session_linkage.py +0 -0
  421. {execweave-0.7.3 → execweave-0.7.4}/tests/test_overhead_benchmark.py +0 -0
  422. {execweave-0.7.3 → execweave-0.7.4}/tests/test_provider_conversation_evidence.py +0 -0
  423. {execweave-0.7.3 → execweave-0.7.4}/tests/test_provider_lifecycle.py +0 -0
  424. {execweave-0.7.3 → execweave-0.7.4}/tests/test_rule_pack.py +0 -0
  425. {execweave-0.7.3 → execweave-0.7.4}/tests/test_schema.py +0 -0
  426. {execweave-0.7.3 → execweave-0.7.4}/tests/test_scope.py +0 -0
  427. {execweave-0.7.3 → execweave-0.7.4}/tests/test_semantic.py +0 -0
  428. {execweave-0.7.3 → execweave-0.7.4}/tests/test_strace_backend.py +0 -0
  429. {execweave-0.7.3 → execweave-0.7.4}/tests/test_threat_model.py +0 -0
  430. {execweave-0.7.3 → execweave-0.7.4}/tests/test_top_detached.py +0 -0
  431. {execweave-0.7.3 → execweave-0.7.4}/tests/test_v063_features.py +0 -0
  432. {execweave-0.7.3 → execweave-0.7.4}/tests/test_v064_live_auto_integrations.py +0 -0
  433. {execweave-0.7.3 → execweave-0.7.4}/tests/test_v064_live_evidence.py +0 -0
  434. {execweave-0.7.3 → execweave-0.7.4}/tests/test_validate.py +0 -0
  435. {execweave-0.7.3 → execweave-0.7.4}/tests/test_version.py +0 -0
  436. {execweave-0.7.3 → execweave-0.7.4}/tests/test_viewer.py +0 -0
  437. {execweave-0.7.3 → execweave-0.7.4}/tests/test_viewer_content_inspector.py +0 -0
  438. {execweave-0.7.3 → execweave-0.7.4}/tests/test_viewer_projection.py +0 -0
  439. {execweave-0.7.3 → execweave-0.7.4}/tests/test_workflow.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: execweave
3
- Version: 0.7.3
3
+ Version: 0.7.4
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.2**.
85
+ The current release is **v0.7.4**.
86
86
 
87
87
  For development:
88
88
 
@@ -118,7 +118,7 @@ execweave record --open -- python my_agent.py
118
118
 
119
119
  `execweave top -- codex` keeps the Agent interactive in the launch terminal while opening/attaching the detached Top dashboard according to the host environment.
120
120
 
121
- **v0.7.2 — provider-neutral, agent-local multi-agent conversations.** ExecWeave now projects provider-exposed conversation evidence into agent-scoped dashboard threads instead of duplicating one full transcript across every agent node. Parent child task assignments, routed inter-agent messages, waits/results, and child parent final responses are preserved when the provider exposes authoritative identity or routing evidence. A child agent keeps only its own visible task and conversation; inherited parent history and sibling-private content are excluded. The common merge layer also scopes by provider, raw thread identity, and agent identity, so even a reused provider thread ID cannot fold Agent 1 into Agent 2.
121
+ **v0.7.4per-agent conversation focus in the dashboard.** Building on the provider-neutral, agent-local multi-agent conversations materialized in v0.7.3, selecting an agent node now scopes the conversation panel to that agent alone, with its visible item count and a control to restore the full tree. A click resolves to a thread by graph agent node identity rather than by label matching, so agents that share a provider nickname stay distinct. Markdown conversation sections now lead with the agent path instead of the provider nickname, so every section names the agent it belongs to. Both the standalone viewer and the live dashboard are covered; conversation materialization itself is unchanged.
122
122
 
123
123
  The unified dashboard brings the execution graph, logs, and conversation records into the same inspection flow. Finalized runs generate `conversations.md` and `conversations.json`, while validated provider transcripts are copied into the run-local SHA-256 content store. Claude Code, OpenAI Codex, Cursor, OpenCode, and Google Antigravity use the strongest provider-exposed multi-agent evidence available to each integration. For gateways and local runtimes that expose only root request/response traffic, ExecWeave shows only that root conversation and does not invent subagents or hidden routing.
124
124
 
@@ -327,7 +327,7 @@ Conversation isolation is an attribution/display rule, not a redaction boundary.
327
327
 
328
328
  ## Current status
329
329
 
330
- v0.7.2 combines cross-platform runtime collection, materialized execution graphs, standalone/live dashboards, conservative provider↔runtime correlation, full-fidelity content-addressed provider evidence, attributable multi-agent execution traces, direct run-local conversation access, and agent-local conversation isolation across provider-neutral projections. Supported integrations preserve the strongest identity/routing evidence actually exposed by each provider and abstain when that evidence is unavailable. Observed evidence and inference remain separate by design.
330
+ v0.7.4 combines cross-platform runtime collection, materialized execution graphs, standalone/live dashboards, conservative provider↔runtime correlation, full-fidelity content-addressed provider evidence, attributable multi-agent execution traces, direct run-local conversation access, agent-local conversation isolation across provider-neutral projections, and per-agent conversation focus in the standalone and live dashboards. Supported integrations preserve the strongest identity/routing evidence actually exposed by each provider and abstain when that evidence is unavailable. Observed evidence and inference remain separate by design.
331
331
 
332
332
  ## Documentation
333
333
 
@@ -31,7 +31,7 @@ Installieren Sie das neueste veröffentlichte wheel/sdist von PyPI:
31
31
  python -m pip install -U execweave
32
32
  ```
33
33
 
34
- Die aktuelle Version ist **v0.7.2**.
34
+ Die aktuelle Version ist **v0.7.4**.
35
35
 
36
36
  Für die Entwicklung:
37
37
 
@@ -67,7 +67,7 @@ execweave record --open -- python my_agent.py
67
67
 
68
68
  `execweave top -- codex` hält den Agent im Startterminal interaktiv und öffnet bzw. verbindet gleichzeitig das detached Top dashboard entsprechend der Host-Umgebung.
69
69
 
70
- **v0.7.2provider-neutral, agent-local multi-agent conversations.** ExecWeave projiziert die vom Provider tatsächlich offengelegte conversation evidence jetzt in agent-spezifische Dashboard-Threads, statt denselben vollständigen Transcript in jeden agent node zu kopieren. Wenn der Provider authoritative identity / routing evidence bereitstellt, werden parent child task assignments, inter-agent messages, waits/results und child parent final responses erhalten. Ein Child Agent enthält nur die Task, die er tatsächlich erhalten hat, sowie seine eigene Conversation; inherited parent history und sibling-private content werden ausgeschlossen. Die gemeinsame Merge-Schicht scoped zusätzlich nach Provider, raw thread identity und agent identity, sodass selbst ein wiederverwendeter Provider-thread-ID Agent 1 und Agent 2 nicht zusammenführen kann.
70
+ **v0.7.4Conversation-Fokus pro Agent im Dashboard.** Aufbauend auf den in v0.7.3 materialisierten provider-neutralen, agent-lokalen Multi-Agent-Conversations begrenzt die Auswahl eines agent node das Conversation-Panel jetzt auf genau diesen Agent, samt Anzahl der sichtbaren Einträge und einem Control zum Wiederherstellen des vollständigen Baums. Ein Klick wird über die identity des graph agent node und nicht über Label-Vergleich zu einem Thread aufgelöst, sodass Agents mit demselben Provider-Nickname unterscheidbar bleiben. Markdown-Conversation-Abschnitte beginnen nun mit dem agent path statt mit dem Provider-Nickname, sodass jeder Abschnitt den zugehörigen Agent benennt. Sowohl der Standalone-Viewer als auch das Live-Dashboard sind abgedeckt; die Conversation-Materialisierung selbst bleibt unverändert.
71
71
 
72
72
  Das vereinheitlichte Dashboard bringt execution graph, logs und conversation records in denselben Inspection-Flow. Finalisierte Runs erzeugen `conversations.md` und `conversations.json`; validierte Provider-Transcripts werden in den run-local SHA-256 content store kopiert. Claude Code, OpenAI Codex, Cursor, OpenCode und Google Antigravity verwenden jeweils die stärkste Multi-Agent-Evidence, die ihre Integration tatsächlich offenlegt. Wenn ein Gateway oder lokaler Runtime nur root request/response sichtbar macht, zeigt ExecWeave nur diese Root-Conversation und erfindet weder Subagents noch hidden routing.
73
73
 
@@ -276,7 +276,7 @@ Conversation isolation ist eine Attribution-/Display-Regel, keine Redaction Boun
276
276
 
277
277
  ## Aktueller Stand
278
278
 
279
- v0.7.2 kombiniert cross-platform runtime collection, materialized execution graphs, standalone/live dashboards, konservative provider↔runtime correlation, full-fidelity content-addressed provider evidence, attributable multi-agent execution traces, direkten run-local conversation access und agent-local conversation isolation in provider-neutralen Projektionen. Jede Integration bewahrt nur die stärkste identity/routing evidence, die der Provider tatsächlich offenlegt, und enthält sich, wenn diese Evidence fehlt. Observed evidence und inference bleiben konstruktiv getrennt.
279
+ v0.7.4 kombiniert cross-platform runtime collection, materialized execution graphs, standalone/live dashboards, konservative provider↔runtime correlation, full-fidelity content-addressed provider evidence, attributable multi-agent execution traces, direkten run-local conversation access agent-local conversation isolation in provider-neutralen Projektionen und per-agent conversation focus in den Standalone- und Live-Dashboards. Jede Integration bewahrt nur die stärkste identity/routing evidence, die der Provider tatsächlich offenlegt, und enthält sich, wenn diese Evidence fehlt. Observed evidence und inference bleiben konstruktiv getrennt.
280
280
 
281
281
  ## Dokumentation
282
282
 
@@ -31,7 +31,7 @@ Installez le dernier wheel/sdist publié depuis PyPI :
31
31
  python -m pip install -U execweave
32
32
  ```
33
33
 
34
- La version courante est **v0.7.2**.
34
+ La version courante est **v0.7.4**.
35
35
 
36
36
  Pour le développement :
37
37
 
@@ -67,7 +67,7 @@ execweave record --open -- python my_agent.py
67
67
 
68
68
  `execweave top -- codex` garde l’Agent interactif dans le terminal de lancement tout en ouvrant ou en attachant le dashboard Top détaché selon l’environnement hôte.
69
69
 
70
- **v0.7.2 — conversations multi-agent provider-neutral et agent-local.** ExecWeave projette désormais les conversation evidence réellement exposées par le provider dans des threads de dashboard propres à chaque agent, au lieu de dupliquer un transcript complet dans tous les agent nodes. Lorsque le provider expose une identity ou un routing faisant autorité, ExecWeave conserve les task assignments parent → child, les inter-agent messages, les waits/results et les final responses child parent. Un child agent ne garde que la tâche quil a réellement reçue et sa propre conversation ; l’inherited parent history et le contenu privé des siblings sont exclus. La couche de merge commune scope également par provider, raw thread identity et agent identity, de sorte qu’un thread ID réutilisé ne puisse pas fusionner Agent 1 avec Agent 2.
70
+ **v0.7.4focus de conversation par agent dans le dashboard.** En s’appuyant sur les conversations multi-agent provider-neutral et agent-local matérialisées en v0.7.3, sélectionner un agent node restreint désormais le panneau de conversation à cet agent seul, avec le nombre d’éléments visibles et un contrôle pour restaurer l’arbre complet. Un clic est résolu en thread via l’identity du graph agent node et non par correspondance de label, de sorte que des agents partageant un même provider nickname restent distincts. Les sections de conversation Markdown commencent maintenant par lagent path plutôt que par le provider nickname, si bien que chaque section nomme l’agent auquel elle appartient. Le viewer standalone et le live dashboard sont tous deux couverts ; la matérialisation des conversations est inchangée.
71
71
 
72
72
  Le dashboard unifié rassemble execution graph, logs et conversation records dans le même flux d’inspection. Les runs finalisés génèrent `conversations.md` et `conversations.json`, et les transcripts provider validés sont copiés dans le content store SHA-256 local au run. Claude Code, OpenAI Codex, Cursor, OpenCode et Google Antigravity exploitent chacun le niveau de multi-agent evidence réellement exposé par leur integration. Lorsqu’un gateway ou un local runtime n’expose que des request/response root, ExecWeave affiche uniquement cette root conversation et n’invente ni subagent ni hidden routing.
73
73
 
@@ -276,7 +276,7 @@ La conversation isolation est une règle d’attribution et d’affichage, pas u
276
276
 
277
277
  ## État actuel
278
278
 
279
- v0.7.2 combine cross-platform runtime collection, materialized execution graphs, standalone/live dashboards, conservative provider↔runtime correlation, full-fidelity content-addressed provider evidence, attributable multi-agent execution traces, accès direct aux conversations run-local et agent-local conversation isolation dans les projections provider-neutral. Chaque integration conserve uniquement la meilleure identity/routing evidence réellement exposée par le provider et s’abstient lorsque cette evidence manque. Observed evidence et inference restent séparées par conception.
279
+ v0.7.4 combine cross-platform runtime collection, materialized execution graphs, standalone/live dashboards, conservative provider↔runtime correlation, full-fidelity content-addressed provider evidence, attributable multi-agent execution traces, accès direct aux conversations run-local agent-local conversation isolation dans les projections provider-neutral et per-agent conversation focus dans les dashboards standalone et live. Chaque integration conserve uniquement la meilleure identity/routing evidence réellement exposée par le provider et s’abstient lorsque cette evidence manque. Observed evidence et inference restent séparées par conception.
280
280
 
281
281
  ## Documentation
282
282
 
@@ -31,7 +31,7 @@ PyPI から最新の wheel/sdist をインストールします。
31
31
  python -m pip install -U execweave
32
32
  ```
33
33
 
34
- 現在のリリースは **v0.7.2** です。
34
+ 現在のリリースは **v0.7.4** です。
35
35
 
36
36
  開発環境では次のようにインストールできます。
37
37
 
@@ -67,7 +67,7 @@ execweave record --open -- python my_agent.py
67
67
 
68
68
  `execweave top -- codex` は Agent を起動 terminal 上でインタラクティブなまま保ち、ホスト環境に応じて detached Top dashboard を開くか既存のものに attach します。
69
69
 
70
- **v0.7.2 — provider-neutral かつ agent-local な multi-agent conversation。** ExecWeave provider が実際に公開した conversation evidence agent ごとの dashboard thread に投影し、同じ完全 transcript をすべての agent node に複製しません。provider が権威ある identity / routing evidence を公開している場合、parent child の task assignment、inter-agent message、wait/result、child parent final response を保持します。Child agent には、その agent が実際に受け取った task と自身の conversation だけを残し、継承された parent history や sibling-private content は除外します。共通 merge layer も provider、raw thread identity、agent identity を組み合わせて scope するため、provider が同じ thread ID を再利用しても Agent 1 と Agent 2 が混ざりません。
70
+ **v0.7.4dashboard での per-agent conversation focus。** v0.7.3 で materialize された provider-neutral かつ agent-local な multi-agent conversation を土台に、agent node を選択すると conversation panel がその agent だけに絞り込まれ、表示項目数と全体ツリーに戻すコントロールが付きます。クリックは label の一致ではなく graph agent node identity thread に解決されるため、同じ provider nickname を共有する agent どうしも混ざりません。Markdown conversation セクションは provider nickname ではなく agent path で始まるようになり、各セクションがどの agent のものかを明示します。standalone viewer live dashboard の両方が対象で、conversation materialization 自体は変更していません。
71
71
 
72
72
  統合 dashboard では execution graph、logs、conversation records を同じ inspection flow で確認できます。Finalized run は `conversations.md` と `conversations.json` を生成し、検証済み provider transcript は run-local SHA-256 content store にコピーされます。Claude Code、OpenAI Codex、Cursor、OpenCode、Google Antigravity は、それぞれが実際に公開する最も強い multi-agent evidence を利用します。gateway や local runtime が root request/response しか公開しない場合、ExecWeave は root conversation だけを表示し、subagent や hidden routing を捏造しません。
73
73
 
@@ -276,7 +276,7 @@ Conversation isolation は attribution/display の規則であり redaction boun
276
276
 
277
277
  ## 現在の状態
278
278
 
279
- v0.7.2 は cross-platform runtime collection、materialized execution graph、standalone/live dashboard、保守的な provider↔runtime correlation、content-addressed full-fidelity provider evidence、attributable multi-agent execution trace、run-local conversation access、provider-neutral projection 上の agent-local conversation isolation を統合します。各 integration は provider が実際に公開した最も強い identity/routing evidence のみを保持し、不足する場合は abstain します。Observed evidence と inference は設計上分離されたままです。
279
+ v0.7.4 は cross-platform runtime collection、materialized execution graph、standalone/live dashboard、保守的な provider↔runtime correlation、content-addressed full-fidelity provider evidence、attributable multi-agent execution trace、run-local conversation access、provider-neutral projection 上の agent-local conversation isolation、standalone および live dashboard での per-agent conversation focus を統合します。各 integration は provider が実際に公開した最も強い identity/routing evidence のみを保持し、不足する場合は abstain します。Observed evidence と inference は設計上分離されたままです。
280
280
 
281
281
  ## ドキュメント
282
282
 
@@ -31,7 +31,7 @@ PyPI에서 최신 wheel/sdist를 설치합니다.
31
31
  python -m pip install -U execweave
32
32
  ```
33
33
 
34
- 현재 릴리스는 **v0.7.2** 입니다.
34
+ 현재 릴리스는 **v0.7.4** 입니다.
35
35
 
36
36
  개발 설치:
37
37
 
@@ -67,7 +67,7 @@ execweave record --open -- python my_agent.py
67
67
 
68
68
  `execweave top -- codex`는 Agent를 시작 terminal에서 interactive 상태로 유지하면서 host 환경에 따라 detached Top dashboard를 열거나 attach합니다.
69
69
 
70
- **v0.7.2 — provider-neutral, agent-local multi-agent conversation.** ExecWeave는 provider가 실제로 노출한 conversation evidence를 agent dashboard thread에 투영하며, 동일한 전체 transcript를 모든 agent node에 복제하지 않습니다. provider가 authoritative identity / routing evidence를 제공하면 parent → child task assignment, inter-agent message, wait/result, child parent final response를 보존합니다. Child agent에는 자신이 실제로 받은 task와 자신이 생성한 conversation 남고 inherited parent history sibling-private content는 제외됩니다. 공통 merge layer 역시 provider, raw thread identity, agent identity로 scope하므로 provider가 동일한 thread ID를 재사용해도 Agent 1과 Agent 2가 섞이지 않습니다.
70
+ **v0.7.4dashboard의 per-agent conversation focus.** v0.7.3에서 materialize된 provider-neutral, agent-local multi-agent conversation 토대로, 이제 agent node를 선택하면 conversation panel이 해당 agent 보여주며 표시 항목 수와 전체 트리로 복원하는 컨트롤이 함께 제공됩니다. 클릭은 label 비교가 아니라 graph agent node identity로 thread에 매핑되므로 동일한 provider nickname을 공유하는 agent끼리도 섞이지 않습니다. Markdown conversation 섹션은 provider nickname 대신 agent path로 시작하여 섹션이 어떤 agent 것인지 명시합니다. standalone viewer와 live dashboard 모두 적용되며 conversation materialization 자체는 변경되지 않았습니다.
71
71
 
72
72
  통합 dashboard는 execution graph, logs, conversation records를 하나의 inspection flow에서 제공합니다. Finalized run은 `conversations.md`와 `conversations.json`을 만들며, 검증된 provider transcript는 run-local SHA-256 content store로 복사됩니다. Claude Code, OpenAI Codex, Cursor, OpenCode, Google Antigravity는 각 integration이 실제로 노출하는 가장 강한 multi-agent evidence를 사용합니다. gateway나 local runtime이 root request/response만 노출하면 ExecWeave는 root conversation만 보여 주며 subagent나 hidden routing을 만들어내지 않습니다.
73
73
 
@@ -276,7 +276,7 @@ Conversation isolation은 attribution/display 규칙이지 redaction boundary가
276
276
 
277
277
  ## 현재 상태
278
278
 
279
- v0.7.2는 cross-platform runtime collection, materialized execution graph, standalone/live dashboard, 보수적인 provider↔runtime correlation, content-addressed full-fidelity provider evidence, attributable multi-agent execution trace, run-local conversation access, provider-neutral projection의 agent-local conversation isolation 통합합니다. 각 integration은 provider가 실제로 노출한 가장 강한 identity/routing evidence만 보존하고 충분한 증거가 없으면 abstain합니다. Observed evidence와 inference는 설계상 계속 분리됩니다.
279
+ v0.7.4는 cross-platform runtime collection, materialized execution graph, standalone/live dashboard, 보수적인 provider↔runtime correlation, content-addressed full-fidelity provider evidence, attributable multi-agent execution trace, run-local conversation access, provider-neutral projection의 agent-local conversation isolation, standalone 및 live dashboard의 per-agent conversation focus를 통합합니다. 각 integration은 provider가 실제로 노출한 가장 강한 identity/routing evidence만 보존하고 충분한 증거가 없으면 abstain합니다. Observed evidence와 inference는 설계상 계속 분리됩니다.
280
280
 
281
281
  ## 문서
282
282
 
@@ -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.2**.
34
+ The current release is **v0.7.4**.
35
35
 
36
36
  For development:
37
37
 
@@ -67,7 +67,7 @@ execweave record --open -- python my_agent.py
67
67
 
68
68
  `execweave top -- codex` keeps the Agent interactive in the launch terminal while opening/attaching the detached Top dashboard according to the host environment.
69
69
 
70
- **v0.7.2 — provider-neutral, agent-local multi-agent conversations.** ExecWeave now projects provider-exposed conversation evidence into agent-scoped dashboard threads instead of duplicating one full transcript across every agent node. Parent child task assignments, routed inter-agent messages, waits/results, and child parent final responses are preserved when the provider exposes authoritative identity or routing evidence. A child agent keeps only its own visible task and conversation; inherited parent history and sibling-private content are excluded. The common merge layer also scopes by provider, raw thread identity, and agent identity, so even a reused provider thread ID cannot fold Agent 1 into Agent 2.
70
+ **v0.7.4per-agent conversation focus in the dashboard.** Building on the provider-neutral, agent-local multi-agent conversations materialized in v0.7.3, selecting an agent node now scopes the conversation panel to that agent alone, with its visible item count and a control to restore the full tree. A click resolves to a thread by graph agent node identity rather than by label matching, so agents that share a provider nickname stay distinct. Markdown conversation sections now lead with the agent path instead of the provider nickname, so every section names the agent it belongs to. Both the standalone viewer and the live dashboard are covered; conversation materialization itself is unchanged.
71
71
 
72
72
  The unified dashboard brings the execution graph, logs, and conversation records into the same inspection flow. Finalized runs generate `conversations.md` and `conversations.json`, while validated provider transcripts are copied into the run-local SHA-256 content store. Claude Code, OpenAI Codex, Cursor, OpenCode, and Google Antigravity use the strongest provider-exposed multi-agent evidence available to each integration. For gateways and local runtimes that expose only root request/response traffic, ExecWeave shows only that root conversation and does not invent subagents or hidden routing.
73
73
 
@@ -276,7 +276,7 @@ Conversation isolation is an attribution/display rule, not a redaction boundary.
276
276
 
277
277
  ## Current status
278
278
 
279
- v0.7.2 combines cross-platform runtime collection, materialized execution graphs, standalone/live dashboards, conservative provider↔runtime correlation, full-fidelity content-addressed provider evidence, attributable multi-agent execution traces, direct run-local conversation access, and agent-local conversation isolation across provider-neutral projections. Supported integrations preserve the strongest identity/routing evidence actually exposed by each provider and abstain when that evidence is unavailable. Observed evidence and inference remain separate by design.
279
+ v0.7.4 combines cross-platform runtime collection, materialized execution graphs, standalone/live dashboards, conservative provider↔runtime correlation, full-fidelity content-addressed provider evidence, attributable multi-agent execution traces, direct run-local conversation access, agent-local conversation isolation across provider-neutral projections, and per-agent conversation focus in the standalone and live dashboards. Supported integrations preserve the strongest identity/routing evidence actually exposed by each provider and abstain when that evidence is unavailable. Observed evidence and inference remain separate by design.
280
280
 
281
281
  ## Documentation
282
282
 
@@ -31,7 +31,7 @@ ExecWeave — source-available, local-first проект наблюдаемос
31
31
  python -m pip install -U execweave
32
32
  ```
33
33
 
34
- Текущая версия — **v0.7.2**.
34
+ Текущая версия — **v0.7.4**.
35
35
 
36
36
  Для разработки:
37
37
 
@@ -67,7 +67,7 @@ execweave record --open -- python my_agent.py
67
67
 
68
68
  `execweave top -- codex` оставляет Agent интерактивным в стартовом terminal и одновременно открывает либо подключает detached Top dashboard в зависимости от host environment.
69
69
 
70
- **v0.7.2 — provider-neutral, agent-local multi-agent conversations.** ExecWeave теперь проецирует conversation evidence, реально раскрытую provider, в отдельные dashboard threads для каждого agent, вместо копирования одного полного transcript во все agent nodes. Если provider предоставляет authoritative identity / routing evidence, сохраняются parent → child task assignments, inter-agent messages, waits/results и child parent final responses. Child agent содержит только фактически полученную им task и собственную conversation; inherited parent history и sibling-private content исключаются. Общий merge layer также scope-ит данные по provider, raw thread identity и agent identity, поэтому даже повторно использованный thread ID не сможет объединить Agent 1 и Agent 2.
70
+ **v0.7.4фокус на conversation отдельного agent в dashboard.** Опираясь на provider-neutral, agent-local multi-agent conversations, материализованные в v0.7.3, выбор agent node теперь ограничивает conversation panel только этим agent, показывая число видимых элементов и control для возврата к полному дереву. Клик сопоставляется с thread по identity graph agent node, а не по совпадению label, поэтому agents с одинаковым provider nickname остаются различимыми. Секции conversation в Markdown теперь начинаются с agent path, а не с provider nickname, так что каждая секция называет свой agent. Покрыты и standalone viewer, и live dashboard; сама материализация conversation не изменена.
71
71
 
72
72
  Единый dashboard объединяет execution graph, logs и conversation records в одном inspection flow. Finalized runs создают `conversations.md` и `conversations.json`, а проверенные provider transcripts копируются в run-local SHA-256 content store. Claude Code, OpenAI Codex, Cursor, OpenCode и Google Antigravity используют наиболее сильную multi-agent evidence, которую реально раскрывает соответствующая integration. Если gateway или local runtime показывает только root request/response, ExecWeave отображает только root conversation и не выдумывает subagents или hidden routing.
73
73
 
@@ -276,7 +276,7 @@ Conversation isolation — это правило attribution/display, а не re
276
276
 
277
277
  ## Текущий статус
278
278
 
279
- v0.7.2 объединяет cross-platform runtime collection, materialized execution graphs, standalone/live dashboards, conservative provider↔runtime correlation, full-fidelity content-addressed provider evidence, attributable multi-agent execution traces, прямой run-local conversation access и agent-local conversation isolation в provider-neutral projections. Каждая integration сохраняет только наиболее сильную identity/routing evidence, реально раскрытую provider, и abstain-ит при её отсутствии. Observed evidence и inference по-прежнему разделены архитектурно.
279
+ v0.7.4 объединяет cross-platform runtime collection, materialized execution graphs, standalone/live dashboards, conservative provider↔runtime correlation, full-fidelity content-addressed provider evidence, attributable multi-agent execution traces, прямой run-local conversation access agent-local conversation isolation в provider-neutral projections и per-agent conversation focus в standalone и live dashboards. Каждая integration сохраняет только наиболее сильную identity/routing evidence, реально раскрытую provider, и abstain-ит при её отсутствии. Observed evidence и inference по-прежнему разделены архитектурно.
280
280
 
281
281
  ## Документация
282
282
 
@@ -31,7 +31,7 @@ ExecWeave 是一个 source-available、local-first 的可观测性项目,把 A
31
31
  python -m pip install -U execweave
32
32
  ```
33
33
 
34
- 当前正式版本是 **v0.7.2**。
34
+ 当前正式版本是 **v0.7.4**。
35
35
 
36
36
  开发安装:
37
37
 
@@ -67,7 +67,7 @@ execweave record --open -- python my_agent.py
67
67
 
68
68
  `execweave top -- codex` 会让 Agent 保持在启动 terminal 中交互,并根据主机环境打开或附加 detached Top dashboard。
69
69
 
70
- **v0.7.2 — provider-neutral、agent-local multi-agent conversation。** ExecWeave 现在会把 provider 真正暴露的 conversation evidence 投影到各自 agent dashboard thread,而不是把同一份完整 transcript 复制到每个 agent node。当 provider 提供权威的 identity / routing evidence 时,会保留 parent → child task assignment、inter-agent message、wait/result,以及 child parent final response。Child agent 只保留自己实际收到的 task 与自己生成的 conversation;继承的 parent history sibling-private content 会被排除。公共 merge layer 还会同时按 provider、raw thread identity 与 agent identity scope,因此即使 provider 重复使用同一个 thread ID,也不会把 Agent 1 和 Agent 2 混到一起。
70
+ **v0.7.4dashboard 的 per-agent conversation focus。** 延续 v0.7.3 已经 materialize 的 provider-neutral、agent-local multi-agent conversation,现在点选某个 agent node,conversation panel 只会显示该 agent 自己的 thread,并附带可见项目数与还原完整树状视图的控件。点击是以 graph agent node identity 对应到 thread,而不是比对 label,因此即使多个 agent 共用同一个 provider nickname 也不会被混在一起。Markdown conversation 章节现在以 agent path 开头,而不是 provider nickname,每个章节都能明确指出自己属于哪一个 agent。standalone viewer live dashboard 都覆盖;conversation materialization 本身没有变动。
71
71
 
72
72
  统一 dashboard 把 execution graph、logs 与 conversation records 放进同一条 inspection flow。Finalized run 会生成 `conversations.md` 与 `conversations.json`,经过验证的 provider transcript 也会复制进 run-local SHA-256 content store。Claude Code、OpenAI Codex、Cursor、OpenCode 与 Google Antigravity 都依据各自实际暴露的 evidence 强度建立 multi-agent trace;如果 gateway 或 local runtime 只提供 root request/response,ExecWeave 就只显示 root conversation,不会虚构 subagent 或 hidden routing。
73
73
 
@@ -276,7 +276,7 @@ Conversation isolation 是 attribution/display 规则,而不是 redaction boun
276
276
 
277
277
  ## 当前状态
278
278
 
279
- v0.7.2 组合 cross-platform runtime collection、materialized execution graph、standalone/live dashboard、保守的 provider↔runtime correlation、content-addressed full-fidelity provider evidence、可归属的 multi-agent execution trace、run-local conversation access,以及 provider-neutral projection 上的 agent-local conversation isolation。各 integration 只保留 provider 实际暴露的最强 identity/routing evidence,证据不足时选择 abstain。Observed evidence 与 inference 从设计上保持分离。
279
+ v0.7.4 组合 cross-platform runtime collection、materialized execution graph、standalone/live dashboard、保守的 provider↔runtime correlation、content-addressed full-fidelity provider evidence、可归属的 multi-agent execution trace、run-local conversation accessprovider-neutral projection 上的 agent-local conversation isolation,以及 standalone 与 live dashboard 上的 per-agent conversation focus。各 integration 只保留 provider 实际暴露的最强 identity/routing evidence,证据不足时选择 abstain。Observed evidence 与 inference 从设计上保持分离。
280
280
 
281
281
  ## 文档
282
282
 
@@ -31,7 +31,7 @@ ExecWeave 是一個 source-available、local-first 的可觀測性專案,會
31
31
  python -m pip install -U execweave
32
32
  ```
33
33
 
34
- 目前正式版本是 **v0.7.2**。
34
+ 目前正式版本是 **v0.7.4**。
35
35
 
36
36
  開發安裝:
37
37
 
@@ -67,7 +67,7 @@ execweave record --open -- python my_agent.py
67
67
 
68
68
  `execweave top -- codex` 會讓 Agent 保持在啟動 terminal 中互動,並依主機環境開啟或附加 detached Top dashboard。
69
69
 
70
- **v0.7.2 — provider-neutral、agent-local multi-agent conversation。** ExecWeave 現在會把 provider 真正曝露的 conversation evidence 投影到各自 agent dashboard thread,不再把同一份完整 transcript 複製到每一個 agent node。當 provider 有權威的 identity / routing evidence 時,會保留 parent → child task assignment、inter-agent message、wait/result,以及 child parent final response。Child agent 只保留自己實際收到的 task 與自己產生的 conversation;繼承的 parent history sibling-private content 會被排除。共用 merge layer 也會用 provider、raw thread identity 與 agent identity 一起 scope,所以就算 provider 重複使用同一個 thread ID,也不會把 Agent 1 與 Agent 2 混在一起。
70
+ **v0.7.4dashboard 的 per-agent conversation focus。** 延續 v0.7.3 已經 materialize 的 provider-neutral、agent-local multi-agent conversation,現在點選某個 agent node,conversation panel 會只顯示該 agent 自己的 thread,並附上可見項目數與還原完整樹狀檢視的控制項。點擊是以 graph agent node identity 對應到 thread,而不是比對 label,所以即使多個 agent 共用同一個 provider nickname 也不會被混在一起。Markdown conversation 章節現在以 agent path 開頭,而不是 provider nickname,每個章節都能明確指出自己屬於哪一個 agent。standalone viewer live dashboard 都涵蓋;conversation materialization 本身沒有變動。
71
71
 
72
72
  統一 dashboard 把 execution graph、logs 與 conversation records 放進同一條 inspection flow。Finalized run 會產生 `conversations.md` 與 `conversations.json`,經驗證的 provider transcript 也會複製進 run-local SHA-256 content store。Claude Code、OpenAI Codex、Cursor、OpenCode 與 Google Antigravity 都依各自實際曝露的 evidence 強度建立 multi-agent trace;若 gateway 或 local runtime 只提供 root request/response,ExecWeave 就只顯示 root conversation,不會虛構 subagent 或 hidden routing。
73
73
 
@@ -276,7 +276,7 @@ Conversation isolation 是 attribution/display 規則,不是 redaction boundar
276
276
 
277
277
  ## 目前狀態
278
278
 
279
- v0.7.2 整合 cross-platform runtime collection、materialized execution graph、standalone/live dashboard、保守的 provider↔runtime correlation、content-addressed full-fidelity provider evidence、可歸屬的 multi-agent execution trace、run-local conversation access,以及 provider-neutral projection 上的 agent-local conversation isolation。各 integration 只保留 provider 實際曝露的最強 identity/routing evidence,證據不足時選擇 abstain。Observed evidence 與 inference 仍從設計上分離。
279
+ v0.7.4 整合 cross-platform runtime collection、materialized execution graph、standalone/live dashboard、保守的 provider↔runtime correlation、content-addressed full-fidelity provider evidence、可歸屬的 multi-agent execution trace、run-local conversation accessprovider-neutral projection 上的 agent-local conversation isolation,以及 standalone 與 live dashboard 上的 per-agent conversation focus。各 integration 只保留 provider 實際曝露的最強 identity/routing evidence,證據不足時選擇 abstain。Observed evidence 與 inference 仍從設計上分離。
280
280
 
281
281
  ## 文件
282
282
 
@@ -4,8 +4,8 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "execweave"
7
- # ExecWeave v0.7.3 release metadata
8
- version = "0.7.3"
7
+ # ExecWeave v0.7.4 release metadata
8
+ version = "0.7.4"
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"
@@ -32,9 +32,18 @@ DOCS = [
32
32
  (Path("docs/run-integrity.md"), "docs/run-integrity"),
33
33
  ]
34
34
 
35
+
36
+ def current_release_tag() -> str:
37
+ pyproject = Path("pyproject.toml").read_text(encoding="utf-8")
38
+ match = re.search(r'(?m)^version\s*=\s*"([^\"]+)"\s*$', pyproject)
39
+ if match is None:
40
+ raise RuntimeError("project version not found in pyproject.toml")
41
+ return f"v{match.group(1)}"
42
+
43
+
35
44
  README_REQUIRED_SNIPPETS = [
36
45
  "v0.6.9",
37
- "v0.7.2",
46
+ current_release_tag(),
38
47
  "execweave live --open -- cursor",
39
48
  "execweave live --open -- opencode",
40
49
  "execweave live --open -- ollama serve",
@@ -120,8 +129,9 @@ def audit_coverage() -> int:
120
129
  print(f"FAIL missing {lang:5}: {path}")
121
130
  failures += 1
122
131
 
123
- for lang in ALL_LANGS:
124
- path = Path(f"README.{lang}.md")
132
+ readmes = [("en", Path("README.md"))]
133
+ readmes.extend((lang, Path(f"README.{lang}.md")) for lang in ALL_LANGS)
134
+ for lang, path in readmes:
125
135
  if not path.exists():
126
136
  continue
127
137
  text = path.read_text(encoding="utf-8")
@@ -1,3 +1,3 @@
1
1
  """ExecWeave runtime graph package."""
2
2
 
3
- __version__ = "0.7.3"
3
+ __version__ = "0.7.4"
@@ -640,10 +640,23 @@ def _render_markdown(entries: list[dict[str, Any]]) -> str:
640
640
  or entry.get("source_id")
641
641
  )
642
642
  provider_label = preview.get("provider_label") or entry.get("provider")
643
- heading = f"### {_markdown_text(provider_label)} · {_markdown_text(agent_label)}"
644
- nickname = preview.get("agent_nickname")
645
- if isinstance(nickname, str) and nickname and nickname != agent_label:
646
- heading += f" ({_markdown_text(nickname)})"
643
+ # Lead with the agent path. A provider nickname is often unrelated to the task
644
+ # the agent was given ("OpenAI Codex · Avicenna" for /root/ci_agent), so heading
645
+ # every section with provider plus nickname made six agents indistinguishable.
646
+ agent_path = preview.get("agent_path")
647
+ identity = (
648
+ agent_path if isinstance(agent_path, str) and agent_path else agent_label
649
+ )
650
+ heading = f"### {_markdown_text(identity)} · {_markdown_text(provider_label)}"
651
+ for annotation in (agent_label, preview.get("agent_nickname")):
652
+ if (
653
+ isinstance(annotation, str)
654
+ and annotation
655
+ and annotation != identity
656
+ and annotation != provider_label
657
+ and f"({_markdown_text(annotation)})" not in heading
658
+ ):
659
+ heading += f" ({_markdown_text(annotation)})"
647
660
  lines.extend([heading, ""])
648
661
 
649
662
  messages = preview.get("messages")
@@ -35,8 +35,8 @@ function entityLabel(id){const node=nodeById.get(id);return node?.name||node?.id
35
35
  function renderKv(target,entries){target.replaceChildren();for(const [key,value] of entries){if(value===null||value===undefined||value==='')continue;const dt=document.createElement('dt');dt.textContent=key;const dd=document.createElement('dd');if(key==='Evidence'){const badge=document.createElement('span');badge.className='badge '+evidenceClass(value.raw||{});badge.textContent=value.label||String(value);dd.appendChild(badge)}else dd.textContent=String(value);target.append(dt,dd)}}
36
36
  function show(value,kind='Selection'){detailsEmpty.hidden=true;details.innerHTML='';const title=document.createElement('div');title.className='current-title';title.textContent=kind==='Node'?(value.name||value.id||'Node'):kind==='Edge'?(value.relation||value.id||'Edge'):kind;const sub=document.createElement('div');sub.className='current-sub';sub.textContent=kind==='Node'?(value.type||'unknown'):kind==='Edge'?`${entityLabel(value.source)} → ${entityLabel(value.target)}`:'';const dl=document.createElement('dl');dl.className='kv';const entries=kind==='Node'?[['Type',value.type],['Events',value.event_count],['First seen',prettyTime(value.first_seen)],['Last seen',prettyTime(value.last_seen)]]:[['Count',value.count],['Last seen',prettyTime(value.last_seen)],['Sequence',value.last_sequence],['Evidence',{label:evidenceLabel(value),raw:value}]];renderKv(dl,entries);const raw=document.createElement('details');raw.className='raw-toggle';const summary=document.createElement('summary');summary.textContent='Raw metadata';const pre=document.createElement('pre');pre.textContent=JSON.stringify(value,null,2);raw.append(summary,pre);details.append(title,sub,dl,raw)}
37
37
  function clearSelection(){if(selectedNodeId&&nodeElements.has(selectedNodeId))nodeElements.get(selectedNodeId).classList.remove('selected');if(selectedEdgeId&&edgeElements.has(selectedEdgeId)){const els=edgeElements.get(selectedEdgeId);els.visible.classList.remove('selected');els.label.classList.remove('selected')}selectedNodeId=null;selectedEdgeId=null;document.querySelectorAll('.activity-row.selected').forEach(row=>row.classList.remove('selected'))}
38
- function selectNode(id,{syncLog=true}={}){const node=nodeById.get(id);if(!node)return;clearSelection();selectedNodeId=id;nodeElements.get(id)?.classList.add('selected');show(node,'Node');if(syncLog){const activity=[...activities].reverse().find(item=>item.nodeId===id);if(activity)selectActivityRow(activity.id,false)}}
39
- function selectEdge(id,{syncLog=true}={}){const edge=edgeById.get(id);if(!edge)return;clearSelection();selectedEdgeId=id;const els=edgeElements.get(id);if(els){els.visible.classList.add('selected');els.label.classList.add('selected')}show(edge,'Edge');if(syncLog){const activity=[...activities].reverse().find(item=>item.edgeId===id);if(activity)selectActivityRow(activity.id,false)}}
38
+ function selectNode(id,{syncLog=true}={}){const node=nodeById.get(id);if(!node)return;clearSelection();selectedNodeId=id;nodeElements.get(id)?.classList.add('selected');show(node,'Node');window.__execweaveFocusConversationAgent?.(node);if(syncLog){const activity=[...activities].reverse().find(item=>item.nodeId===id);if(activity)selectActivityRow(activity.id,false)}}
39
+ function selectEdge(id,{syncLog=true}={}){const edge=edgeById.get(id);if(!edge)return;clearSelection();window.__execweaveClearConversationFocus?.();selectedEdgeId=id;const els=edgeElements.get(id);if(els){els.visible.classList.add('selected');els.label.classList.add('selected')}show(edge,'Edge');if(syncLog){const activity=[...activities].reverse().find(item=>item.edgeId===id);if(activity)selectActivityRow(activity.id,false)}}
40
40
  function createNodeElement(n){if(nodeElements.has(n.id))return updateNodeElement(n);const p=positions.get(n.id);if(!p)return;const group=document.createElementNS('http://www.w3.org/2000/svg','g');group.classList.add('node');group.dataset.id=n.id;group.setAttribute('transform',`translate(${p.x} ${p.y})`);const rect=document.createElementNS('http://www.w3.org/2000/svg','rect');rect.setAttribute('width',160);rect.setAttribute('height',50);group.appendChild(rect);const type=document.createElementNS('http://www.w3.org/2000/svg','text');type.setAttribute('x',10);type.setAttribute('y',15);type.classList.add('type');group.appendChild(type);const label=document.createElementNS('http://www.w3.org/2000/svg','text');label.setAttribute('x',10);label.setAttribute('y',34);label.classList.add('name-label');group.appendChild(label);group.onclick=ev=>{ev.stopPropagation();selectNode(n.id)};nodeLayer.appendChild(group);nodeElements.set(n.id,group);updateNodeElement(n)}
41
41
  function updateNodeElement(n){const group=nodeElements.get(n.id);if(!group)return;group.dataset.search=`${n.id} ${n.name||''} ${n.type||''}`.toLowerCase();const rect=group.querySelector('rect');if(rect)rect.setAttribute('fill',nodeColor(n.type));const type=group.querySelector('.type');if(type)type.textContent=n.type||'unknown';const label=group.querySelector('.name-label');if(label)label.textContent=short(n);group.classList.toggle('latest',n.id===latestNodeId);group.classList.toggle('selected',n.id===selectedNodeId)}
42
42
  function createEdgeElement(e){const id=edgeId(e);if(edgeElements.has(id))return updateEdgeElement(e);if(!positions.has(e.source)||!positions.has(e.target))return;const visible=document.createElementNS('http://www.w3.org/2000/svg','path');visible.classList.add('edge');visible.dataset.edgeId=id;edgeLayer.appendChild(visible);const hit=document.createElementNS('http://www.w3.org/2000/svg','path');hit.classList.add('edge-hit');hit.dataset.edgeId=id;hit.onclick=ev=>{ev.stopPropagation();selectEdge(id)};edgeLayer.appendChild(hit);const label=document.createElementNS('http://www.w3.org/2000/svg','text');label.setAttribute('text-anchor','middle');label.classList.add('label');label.dataset.edgeId=id;labelLayer.appendChild(label);edgeElements.set(id,{visible,hit,label});updateEdgeElement(e)}
@@ -271,7 +271,7 @@ function renderEdges(){
271
271
  function scheduleEdgeRender(){if(edgeRenderFrame!==null)return;edgeRenderFrame=requestAnimationFrame(()=>{edgeRenderFrame=null;renderEdges()})}
272
272
  function renderNodes(){
273
273
  nodeLayer.replaceChildren();nodeElements=new Map();
274
- visibleNodes.forEach(node=>{const p=positions.get(node.id);if(!p)return;const g=document.createElementNS('http://www.w3.org/2000/svg','g');g.classList.add('node');if(expansionClusters[node.id])g.classList.add('cluster');g.setAttribute('transform',`translate(${p.x} ${p.y})`);const r=document.createElementNS('http://www.w3.org/2000/svg','rect');r.setAttribute('width','170');r.setAttribute('height','58');r.setAttribute('fill',colorForType(node.type));g.appendChild(r);const type=document.createElementNS('http://www.w3.org/2000/svg','text');type.setAttribute('x','12');type.setAttribute('y','18');type.classList.add('node-type');type.textContent=node.type||'unknown';g.appendChild(type);const label=document.createElementNS('http://www.w3.org/2000/svg','text');label.setAttribute('x','12');label.setAttribute('y','39');label.textContent=labelFor(node);g.appendChild(label);g.addEventListener('pointerdown',ev=>{ev.stopPropagation();const pt=svgPoint(ev);dragNode={id:node.id,dx:pt.x-p.x,dy:pt.y-p.y};g.setPointerCapture(ev.pointerId)});g.addEventListener('pointermove',ev=>{if(!dragNode||dragNode.id!==node.id)return;const pt=svgPoint(ev),np={x:pt.x-dragNode.dx,y:pt.y-dragNode.dy};positions.set(node.id,np);g.setAttribute('transform',`translate(${np.x} ${np.y})`);scheduleEdgeRender()});g.addEventListener('pointerup',ev=>{dragNode=null;scheduleEdgeRender();try{g.releasePointerCapture(ev.pointerId)}catch(_){}});g.addEventListener('click',ev=>{ev.stopPropagation();document.querySelectorAll('.node.selected').forEach(el=>el.classList.remove('selected'));g.classList.add('selected');showDetails('Node',node)});nodeLayer.appendChild(g);nodeElements.set(node.id,g)});
274
+ visibleNodes.forEach(node=>{const p=positions.get(node.id);if(!p)return;const g=document.createElementNS('http://www.w3.org/2000/svg','g');g.classList.add('node');if(expansionClusters[node.id])g.classList.add('cluster');g.setAttribute('transform',`translate(${p.x} ${p.y})`);const r=document.createElementNS('http://www.w3.org/2000/svg','rect');r.setAttribute('width','170');r.setAttribute('height','58');r.setAttribute('fill',colorForType(node.type));g.appendChild(r);const type=document.createElementNS('http://www.w3.org/2000/svg','text');type.setAttribute('x','12');type.setAttribute('y','18');type.classList.add('node-type');type.textContent=node.type||'unknown';g.appendChild(type);const label=document.createElementNS('http://www.w3.org/2000/svg','text');label.setAttribute('x','12');label.setAttribute('y','39');label.textContent=labelFor(node);g.appendChild(label);g.addEventListener('pointerdown',ev=>{ev.stopPropagation();const pt=svgPoint(ev);dragNode={id:node.id,dx:pt.x-p.x,dy:pt.y-p.y};g.setPointerCapture(ev.pointerId)});g.addEventListener('pointermove',ev=>{if(!dragNode||dragNode.id!==node.id)return;const pt=svgPoint(ev),np={x:pt.x-dragNode.dx,y:pt.y-dragNode.dy};positions.set(node.id,np);g.setAttribute('transform',`translate(${np.x} ${np.y})`);scheduleEdgeRender()});g.addEventListener('pointerup',ev=>{dragNode=null;scheduleEdgeRender();try{g.releasePointerCapture(ev.pointerId)}catch(_){}});g.addEventListener('click',ev=>{ev.stopPropagation();document.querySelectorAll('.node.selected').forEach(el=>el.classList.remove('selected'));g.classList.add('selected');showDetails('Node',node);if(typeof execweaveFocusConversationAgent==='function')execweaveFocusConversationAgent(node)});nodeLayer.appendChild(g);nodeElements.set(node.id,g)});
275
275
  }
276
276
  function svgPoint(ev){const rect=svg.getBoundingClientRect();return{x:(ev.clientX-rect.left-transform.x)/transform.scale,y:(ev.clientY-rect.top-transform.y)/transform.scale}}
277
277
  function fit(){if(!positions.size)return;let minX=Infinity,maxX=-Infinity,minY=Infinity,maxY=-Infinity;positions.forEach(p=>{if(p.x<minX)minX=p.x;if(p.x>maxX)maxX=p.x;if(p.y<minY)minY=p.y;if(p.y>maxY)maxY=p.y});maxX+=170;maxY+=58;const box=svg.getBoundingClientRect(),width=Math.max(1,maxX-minX),height=Math.max(1,maxY-minY),scale=Math.min(1.25,Math.max(.08,Math.min((box.width-70)/width,(box.height-70)/height)));transform={x:35-minX*scale,y:35-minY*scale,scale};applyTransform()}
@@ -319,7 +319,7 @@ savePresetButton.addEventListener('click',savePreset);deletePresetButton.addEven
319
319
  document.getElementById('fit').addEventListener('click',fit);
320
320
  document.getElementById('reset').addEventListener('click',()=>{computeLayout();renderNodes();renderEdges();applySearch();fit()});
321
321
  window.addEventListener('resize',fit);
322
- svg.addEventListener('click',()=>document.querySelectorAll('.node.selected').forEach(el=>el.classList.remove('selected')));
322
+ svg.addEventListener('click',()=>{document.querySelectorAll('.node.selected').forEach(el=>el.classList.remove('selected'));if(typeof execweaveClearConversationFocus==='function')execweaveClearConversationFocus()});
323
323
  renderCorrelationSummary();loadPresets();applyGraphFilters();
324
324
  })();
325
325
  </script>
@@ -12,35 +12,51 @@ _TREE_CSS = r"""
12
12
  .execweave-conversation-thread{margin-top:5px;padding:6px 7px 7px 10px;border-radius:7px;background:color-mix(in srgb,var(--panel2) 72%,transparent)}
13
13
  .execweave-conversation-thread>.execweave-conversation-meta,.execweave-conversation-thread>.conversation-live-meta{margin-top:0}
14
14
  .execweave-conversation-tree .execweave-conversation-messages,.execweave-conversation-tree .conversation-live-messages{margin-top:6px}
15
+ .execweave-conversation-focus{display:flex;align-items:center;gap:8px;margin-bottom:8px;padding:6px 8px;border:1px solid color-mix(in srgb,var(--selected) 40%,var(--border));border-radius:7px;background:color-mix(in srgb,var(--panel2) 82%,var(--selected) 10%)}
16
+ .execweave-conversation-focus-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:750;color:var(--text)}
17
+ .execweave-conversation-focus-clear{margin-left:auto;flex:0 0 auto;padding:3px 8px;border:1px solid var(--border);border-radius:6px;background:var(--panel);color:var(--text);font:inherit;font-size:9px;font-weight:650;letter-spacing:.06em;text-transform:uppercase;cursor:pointer}
18
+ .execweave-conversation-focus-clear:hover{border-color:var(--selected)}
19
+ .execweave-conversation-focus-clear:focus-visible{outline:2px solid var(--selected);outline-offset:2px}
15
20
  """.strip()
16
21
 
17
22
  _STATIC_HELPERS = r"""
18
23
  const execweaveConversationRootIds=new Set(['agent:Claude Code','agent:OpenAI Codex','agent:Codex','agent:Cursor','agent:OpenCode','agent:Gemini CLI','agent:Antigravity']);
19
24
  function execweaveConversationPath(entry){const p=entry?.conversation_preview||{},path=String(p.agent_path||'').trim();return path||String(entry?.source_name||entry?.source_id||'agent')}
20
- function execweaveConversationRecordFromEntry(entry){const p=entry?.conversation_preview||{},path=execweaveConversationPath(entry),thread=String(p.thread_id||`${entry?.provider||'provider'}:${entry?.source_id||path}`),parent=p.parent_thread_id?String(p.parent_thread_id):null,label=String(p.agent_label||p.provider_label||entry?.source_name||path),isRoot=p.is_root===true||path==='/root';return{key:`thread:${thread}`,thread,parent,path,label,provider:String(entry?.provider||''),entry,isRoot}}
21
- function execweaveConversationAgentRecords(threads){const records=new Map();for(const entry of threads){const record=execweaveConversationRecordFromEntry(entry);records.set(record.key,record)}for(const node of(Array.isArray(possibleNodes)?possibleNodes:[])){if(node?.type!=='agent'||!node.id)continue;const attrs=node.attributes||{},provider=String(attrs.provider||'').toLowerCase(),agentPath=String(attrs.agent_path||'').trim(),isRoot=execweaveConversationRootIds.has(node.id),nativeId=String(attrs.agent_id||attrs.subagent_id||attrs.session_id||''),path=agentPath||(isRoot?'/root':nativeId?`/root/${nativeId}`:''),thread=String(attrs.thread_id||attrs.session_id||node.id),key=`graph:${node.id}`;if([...records.values()].some(record=>record.path&&path&&record.path===path&&record.provider===provider))continue;records.set(key,{key,thread,parent:null,path,label:String(node.name||path||node.id),provider,entry:null,isRoot})}return[...records.values()]}
25
+ function execweaveConversationRecordFromEntry(entry){const p=entry?.conversation_preview||{},path=execweaveConversationPath(entry),thread=String(p.thread_id||`${entry?.provider||'provider'}:${entry?.source_id||path}`),parent=p.parent_thread_id?String(p.parent_thread_id):null,label=String(p.agent_label||p.provider_label||entry?.source_name||path),isRoot=p.is_root===true||path==='/root';return{key:`thread:${thread}`,thread,parent,path,label,provider:String(entry?.provider||''),entry,isRoot,nodeId:String(entry?.source_id||'')}}
26
+ function execweaveConversationAgentRecords(threads){const records=new Map();for(const entry of threads){const record=execweaveConversationRecordFromEntry(entry);records.set(record.key,record)}for(const node of(Array.isArray(possibleNodes)?possibleNodes:[])){if(node?.type!=='agent'||!node.id)continue;const attrs=node.attributes||{},provider=String(attrs.provider||'').toLowerCase(),agentPath=String(attrs.agent_path||'').trim(),isRoot=execweaveConversationRootIds.has(node.id),nativeId=String(attrs.agent_id||attrs.subagent_id||attrs.session_id||''),path=agentPath||(isRoot?'/root':nativeId?`/root/${nativeId}`:''),thread=String(attrs.thread_id||attrs.session_id||node.id),key=`graph:${node.id}`;if([...records.values()].some(record=>record.path&&path&&record.path===path&&record.provider===provider))continue;records.set(key,{key,thread,parent:null,path,label:String(node.name||path||node.id),provider,entry:null,isRoot,nodeId:String(node.id)})}return[...records.values()]}
22
27
  function execweaveConversationRootRecord(records){return records.find(record=>record.isRoot)||records.find(record=>record.path==='/root')||null}
23
28
  function execweaveAppendTreeConversationMessage(container,message,currentPath){const row=document.createElement('div');row.className='execweave-conversation-message';if(message?.phase==='final_answer')row.classList.add('final');if(message?.content_state==='provider_encrypted')row.classList.add('encrypted');const meta=document.createElement('div');meta.className='execweave-conversation-message-meta';const sender=String(message?.sender||''),recipient=String(message?.recipient||''),kind=String(message?.kind||'message'),phase=message?.phase?String(message.phase):'',route=recipient?`${sender||currentPath} → ${recipient}`:(sender&&sender!==currentPath?sender:'');meta.textContent=[route,kind,phase].filter(Boolean).join(' · ');const body=document.createElement('div');body.className='execweave-conversation-message-body';body.textContent=message?.content_state==='provider_encrypted'?'Provider-encrypted payload — plaintext is not exposed by the observed provider surface.':String(message?.text||'(no plaintext body exposed)');row.append(meta,body);container.appendChild(row)}
24
29
  function execweaveConversationThread(entry,path){const preview=entry.conversation_preview||{},thread=document.createElement('div');thread.className='execweave-conversation-thread';const meta=document.createElement('div');meta.className='execweave-conversation-meta';meta.textContent=`${preview.provider_label||entry.provider||'provider'} · ${entry.relation||'conversation'} · ${entry.size_bytes||0} bytes`;const messages=document.createElement('div');messages.className='execweave-conversation-messages';for(const message of(preview.messages||[]).slice(-40))execweaveAppendTreeConversationMessage(messages,message,path);const raw=document.createElement('a');raw.className='execweave-conversation-link';raw.href=execweaveConversationHref(String(entry.path||''));raw.target='_blank';raw.rel='noreferrer';raw.textContent='Open raw conversation evidence';thread.append(meta,messages,raw);return thread}
25
30
  function execweaveConversationAgentNode(record,isRoot=false){const node=document.createElement('div');node.className=isRoot?'execweave-conversation-root-node':'execweave-conversation-agent-node';const label=document.createElement('span');label.className='execweave-conversation-agent-label';const nickname=record.entry?.conversation_preview?.agent_nickname;label.textContent=`${record.label||record.path||record.key}${nickname&&nickname!==record.label?` · ${nickname}`:''}`;const badge=document.createElement('span');badge.className='execweave-conversation-agent-badge';badge.textContent=isRoot?'run root':record.entry?'agent':'agent · waiting';node.append(label,badge);return node}
26
31
  function execweaveAppendConversationBranch(container,record,records,rootThread,visited){if(visited.has(record.key))return;visited.add(record.key);const branch=document.createElement('div');branch.className='execweave-conversation-branch';branch.appendChild(execweaveConversationAgentNode(record,false));if(record.entry)branch.appendChild(execweaveConversationThread(record.entry,record.path||record.label));const children=records.filter(candidate=>candidate.key!==record.key&&!visited.has(candidate.key)&&candidate.parent&&String(candidate.parent)===String(record.thread));if(children.length){const box=document.createElement('div');box.className='execweave-conversation-children';for(const child of children)execweaveAppendConversationBranch(box,child,records,rootThread,visited);branch.appendChild(box)}container.appendChild(branch)}
32
+ let execweaveConversationFocusNodeId=null;
33
+ function execweaveConversationFocusRecord(records){if(!execweaveConversationFocusNodeId)return null;return records.find(record=>record.nodeId&&String(record.nodeId)===String(execweaveConversationFocusNodeId))||null}
34
+ function execweaveFocusConversationAgent(node){const id=node&&node.type==='agent'&&node.id?String(node.id):null;if(execweaveConversationFocusNodeId===id)return;execweaveConversationFocusNodeId=id;execweaveRenderConversationRecords()}
35
+ function execweaveClearConversationFocus(){if(execweaveConversationFocusNodeId===null)return;execweaveConversationFocusNodeId=null;execweaveRenderConversationRecords()}
36
+ function execweaveRenderFocusedConversation(panel,record){const banner=document.createElement('div');banner.className='execweave-conversation-focus';const label=document.createElement('span');label.className='execweave-conversation-focus-label';const count=(record.entry?.conversation_preview?.messages||[]).length;label.textContent=`${record.path||record.label} · ${count} visible item${count===1?'':'s'}`;const clear=document.createElement('button');clear.type='button';clear.className='execweave-conversation-focus-clear';clear.textContent='Show all agents';clear.addEventListener('click',execweaveClearConversationFocus);banner.append(label,clear);panel.appendChild(banner);const tree=document.createElement('div');tree.className='execweave-conversation-tree';tree.appendChild(execweaveConversationAgentNode(record,record.isRoot===true));if(record.entry)tree.appendChild(execweaveConversationThread(record.entry,record.path||record.label));else{const empty=document.createElement('div');empty.className='execweave-conversation-summary';empty.textContent='No conversation evidence is available for this agent.';tree.appendChild(empty)}panel.appendChild(tree)}
27
37
  """.strip()
28
38
 
29
- _STATIC_RENDER = r"""function execweaveRenderRichConversationRecords(panel,entries){const threads=execweaveLatestConversationThreads(entries),records=execweaveConversationAgentRecords(threads);if(!threads.length&&!records.length)return false;panel.replaceChildren();const messageCount=threads.reduce((total,entry)=>total+((entry.conversation_preview?.messages||[]).length),0),summary=document.createElement('div');summary.className='execweave-conversation-summary';summary.textContent=`${records.length} agent${records.length===1?'':'s'} · ${messageCount} visible item${messageCount===1?'':'s'} · provider-neutral run-local evidence`;panel.appendChild(summary);const rootRecord=execweaveConversationRootRecord(records);if(!rootRecord){const notice=document.createElement('div');notice.className='execweave-conversation-unresolved-root';notice.textContent='No root agent identified in this run\u2019s evidence. Agent conversations are listed without a parent.';panel.appendChild(notice);const flat=document.createElement('div');flat.className='execweave-conversation-children';for(const record of records)if(record.entry)flat.appendChild(execweaveConversationThread(record.entry,record.path||record.key));if(flat.childElementCount)panel.appendChild(flat);return true}const tree=document.createElement('div');tree.className='execweave-conversation-tree';tree.appendChild(execweaveConversationAgentNode(rootRecord,true));if(rootRecord.entry)tree.appendChild(execweaveConversationThread(rootRecord.entry,rootRecord.path||'/root'));const visited=new Set([rootRecord.key]),children=document.createElement('div');children.className='execweave-conversation-children';const direct=records.filter(record=>record.key!==rootRecord.key&&(record.parent&&String(record.parent)===String(rootRecord.thread)));const unparented=records.filter(record=>record.key!==rootRecord.key&&!record.parent);for(const record of[...direct,...unparented])execweaveAppendConversationBranch(children,record,records,rootRecord.thread,visited);for(const record of records)if(record.key!==rootRecord.key&&!visited.has(record.key))execweaveAppendConversationBranch(children,record,records,rootRecord.thread,visited);if(children.childElementCount)tree.appendChild(children);panel.appendChild(tree);const index=document.createElement('a');index.className='execweave-conversation-index';index.href=location.protocol==='file:'?'conversations.md':`/conversations.md${window.__execweaveToken?`?t=${encodeURIComponent(window.__execweaveToken)}`:''}`;index.target='_blank';index.rel='noreferrer';index.textContent='Open complete conversation index';panel.appendChild(index);return true}""".strip()
39
+ _STATIC_RENDER = r"""function execweaveRenderRichConversationRecords(panel,entries){const threads=execweaveLatestConversationThreads(entries),records=execweaveConversationAgentRecords(threads);if(!threads.length&&!records.length)return false;panel.replaceChildren();const focused=execweaveConversationFocusRecord(records);if(focused){execweaveRenderFocusedConversation(panel,focused);return true}const messageCount=threads.reduce((total,entry)=>total+((entry.conversation_preview?.messages||[]).length),0),summary=document.createElement('div');summary.className='execweave-conversation-summary';summary.textContent=`${records.length} agent${records.length===1?'':'s'} · ${messageCount} visible item${messageCount===1?'':'s'} · provider-neutral run-local evidence`;panel.appendChild(summary);const rootRecord=execweaveConversationRootRecord(records);if(!rootRecord){const notice=document.createElement('div');notice.className='execweave-conversation-unresolved-root';notice.textContent='No root agent identified in this run\u2019s evidence. Agent conversations are listed without a parent.';panel.appendChild(notice);const flat=document.createElement('div');flat.className='execweave-conversation-children';for(const record of records)if(record.entry)flat.appendChild(execweaveConversationThread(record.entry,record.path||record.key));if(flat.childElementCount)panel.appendChild(flat);return true}const tree=document.createElement('div');tree.className='execweave-conversation-tree';tree.appendChild(execweaveConversationAgentNode(rootRecord,true));if(rootRecord.entry)tree.appendChild(execweaveConversationThread(rootRecord.entry,rootRecord.path||'/root'));const visited=new Set([rootRecord.key]),children=document.createElement('div');children.className='execweave-conversation-children';const direct=records.filter(record=>record.key!==rootRecord.key&&(record.parent&&String(record.parent)===String(rootRecord.thread)));const unparented=records.filter(record=>record.key!==rootRecord.key&&!record.parent);for(const record of[...direct,...unparented])execweaveAppendConversationBranch(children,record,records,rootRecord.thread,visited);for(const record of records)if(record.key!==rootRecord.key&&!visited.has(record.key))execweaveAppendConversationBranch(children,record,records,rootRecord.thread,visited);if(children.childElementCount)tree.appendChild(children);panel.appendChild(tree);const index=document.createElement('a');index.className='execweave-conversation-index';index.href=location.protocol==='file:'?'conversations.md':`/conversations.md${window.__execweaveToken?`?t=${encodeURIComponent(window.__execweaveToken)}`:''}`;index.target='_blank';index.rel='noreferrer';index.textContent='Open complete conversation index';panel.appendChild(index);return true}""".strip()
30
40
 
31
41
  _LIVE_HELPERS = r"""
32
42
  const conversationRootIds=new Set(['agent:Claude Code','agent:OpenAI Codex','agent:Codex','agent:Cursor','agent:OpenCode','agent:Gemini CLI','agent:Antigravity']);
33
43
  function conversationPath(entry){const p=entry?.conversation_preview||{},path=String(p.agent_path||'').trim();return path||String(entry?.source_name||entry?.source_id||'agent')}
34
- function conversationRecordFromEntry(entry){const p=entry?.conversation_preview||{},path=conversationPath(entry),thread=String(p.thread_id||`${entry?.provider||'provider'}:${entry?.source_id||path}`),parent=p.parent_thread_id?String(p.parent_thread_id):null,label=String(p.agent_label||p.provider_label||entry?.source_name||path),isRoot=p.is_root===true||path==='/root';return{key:`thread:${thread}`,thread,parent,path,label,provider:String(entry?.provider||''),entry,isRoot}}
35
- function conversationAgentRecords(threads){const records=new Map();for(const entry of threads){const record=conversationRecordFromEntry(entry);records.set(record.key,record)}const graph=core.getGraph?.()||{};for(const node of(graph.nodes||[])){if(node?.type!=='agent'||!node.id)continue;const attrs=node.attributes||{},provider=String(attrs.provider||'').toLowerCase(),agentPath=String(attrs.agent_path||'').trim(),isRoot=conversationRootIds.has(node.id),nativeId=String(attrs.agent_id||attrs.subagent_id||attrs.session_id||''),path=agentPath||(isRoot?'/root':nativeId?`/root/${nativeId}`:''),thread=String(attrs.thread_id||attrs.session_id||node.id),key=`graph:${node.id}`;if([...records.values()].some(record=>record.path&&path&&record.path===path&&record.provider===provider))continue;records.set(key,{key,thread,parent:null,path,label:String(node.name||path||node.id),provider,entry:null,isRoot})}return[...records.values()]}
44
+ function conversationRecordFromEntry(entry){const p=entry?.conversation_preview||{},path=conversationPath(entry),thread=String(p.thread_id||`${entry?.provider||'provider'}:${entry?.source_id||path}`),parent=p.parent_thread_id?String(p.parent_thread_id):null,label=String(p.agent_label||p.provider_label||entry?.source_name||path),isRoot=p.is_root===true||path==='/root';return{key:`thread:${thread}`,thread,parent,path,label,provider:String(entry?.provider||''),entry,isRoot,nodeId:String(entry?.source_id||'')}}
45
+ function conversationAgentRecords(threads){const records=new Map();for(const entry of threads){const record=conversationRecordFromEntry(entry);records.set(record.key,record)}const graph=core.getGraph?.()||{};for(const node of(graph.nodes||[])){if(node?.type!=='agent'||!node.id)continue;const attrs=node.attributes||{},provider=String(attrs.provider||'').toLowerCase(),agentPath=String(attrs.agent_path||'').trim(),isRoot=conversationRootIds.has(node.id),nativeId=String(attrs.agent_id||attrs.subagent_id||attrs.session_id||''),path=agentPath||(isRoot?'/root':nativeId?`/root/${nativeId}`:''),thread=String(attrs.thread_id||attrs.session_id||node.id),key=`graph:${node.id}`;if([...records.values()].some(record=>record.path&&path&&record.path===path&&record.provider===provider))continue;records.set(key,{key,thread,parent:null,path,label:String(node.name||path||node.id),provider,entry:null,isRoot,nodeId:String(node.id)})}return[...records.values()]}
36
46
  function conversationRootRecord(records){return records.find(record=>record.isRoot)||records.find(record=>record.path==='/root')||null}
37
47
  function appendTreeMessage(container,message,currentPath){const row=document.createElement('div');row.className='conversation-live-message';if(message?.phase==='final_answer')row.classList.add('final');if(message?.content_state==='provider_encrypted')row.classList.add('encrypted');const meta=document.createElement('div');meta.className='conversation-live-message-meta';const sender=String(message?.sender||''),recipient=String(message?.recipient||''),kind=String(message?.kind||'message'),phase=message?.phase?String(message.phase):'',route=recipient?`${sender||currentPath} → ${recipient}`:(sender&&sender!==currentPath?sender:'');meta.textContent=[route,kind,phase].filter(Boolean).join(' · ');const body=document.createElement('div');body.className='conversation-live-message-body';body.textContent=message?.content_state==='provider_encrypted'?'Provider-encrypted payload — plaintext is not exposed by the observed provider surface.':String(message?.text||'(no plaintext body exposed)');row.append(meta,body);container.appendChild(row)}
38
48
  function conversationThread(entry,path){const preview=entry.conversation_preview||{},thread=document.createElement('div');thread.className='execweave-conversation-thread';const meta=document.createElement('div');meta.className='conversation-live-meta';meta.textContent=`${preview.provider_label||entry.provider||'provider'} · ${entry.relation||'conversation'} · ${entry.size_bytes||0} bytes`;const messages=document.createElement('div');messages.className='conversation-live-messages';for(const message of(preview.messages||[]).slice(-40))appendTreeMessage(messages,message,path);const raw=document.createElement('a');raw.className='conversation-live-link';raw.href=href(String(entry.path||''));raw.target='_blank';raw.rel='noreferrer';raw.textContent='Open raw conversation evidence';thread.append(meta,messages,raw);return thread}
39
49
  function conversationAgentNode(record,isRoot=false){const node=document.createElement('div');node.className=isRoot?'execweave-conversation-root-node':'execweave-conversation-agent-node';const label=document.createElement('span');label.className='execweave-conversation-agent-label';const nickname=record.entry?.conversation_preview?.agent_nickname;label.textContent=`${record.label||record.path||record.key}${nickname&&nickname!==record.label?` · ${nickname}`:''}`;const badge=document.createElement('span');badge.className='execweave-conversation-agent-badge';badge.textContent=isRoot?'run root':record.entry?'agent':'agent · waiting';node.append(label,badge);return node}
40
50
  function appendConversationBranch(container,record,records,visited){if(visited.has(record.key))return;visited.add(record.key);const branch=document.createElement('div');branch.className='execweave-conversation-branch';branch.appendChild(conversationAgentNode(record,false));if(record.entry)branch.appendChild(conversationThread(record.entry,record.path||record.label));const direct=records.filter(candidate=>candidate.key!==record.key&&!visited.has(candidate.key)&&candidate.parent&&String(candidate.parent)===String(record.thread));if(direct.length){const box=document.createElement('div');box.className='execweave-conversation-children';for(const child of direct)appendConversationBranch(box,child,records,visited);branch.appendChild(box)}container.appendChild(branch)}
51
+ let conversationFocusNodeId=null;
52
+ function conversationFocusRecord(records){if(!conversationFocusNodeId)return null;return records.find(record=>record.nodeId&&String(record.nodeId)===String(conversationFocusNodeId))||null}
53
+ function focusConversationAgent(node){const id=node&&node.type==='agent'&&node.id?String(node.id):null;if(conversationFocusNodeId===id)return;conversationFocusNodeId=id;render()}
54
+ function clearConversationFocus(){if(conversationFocusNodeId===null)return;conversationFocusNodeId=null;render()}
55
+ function renderFocusedConversation(panel,record){const banner=document.createElement('div');banner.className='execweave-conversation-focus';const label=document.createElement('span');label.className='execweave-conversation-focus-label';const count=(record.entry?.conversation_preview?.messages||[]).length;label.textContent=`${record.path||record.label} · ${count} visible item${count===1?'':'s'}`;const clear=document.createElement('button');clear.type='button';clear.className='execweave-conversation-focus-clear';clear.textContent='Show all agents';clear.addEventListener('click',clearConversationFocus);banner.append(label,clear);panel.appendChild(banner);const tree=document.createElement('div');tree.className='execweave-conversation-tree';tree.appendChild(conversationAgentNode(record,record.isRoot===true));if(record.entry)tree.appendChild(conversationThread(record.entry,record.path||record.label));else{const empty=document.createElement('div');empty.className='conversation-live-summary';empty.textContent='No conversation evidence is available for this agent.';tree.appendChild(empty)}panel.appendChild(tree)}
56
+ window.__execweaveFocusConversationAgent=focusConversationAgent;window.__execweaveClearConversationFocus=clearConversationFocus;
41
57
  """.strip()
42
58
 
43
- _LIVE_RENDER = r"""function renderRich(entries){const threads=latestThreads(entries),records=conversationAgentRecords(threads);if(!threads.length&&!records.length)return false;panel.replaceChildren();const count=threads.reduce((n,e)=>n+((e.conversation_preview?.messages||[]).length),0),summary=document.createElement('div');summary.className='conversation-live-summary';summary.textContent=`${records.length} agent${records.length===1?'':'s'} · ${count} visible item${count===1?'':'s'} · provider-neutral run-local record`;panel.appendChild(summary);const rootRecord=conversationRootRecord(records);if(!rootRecord){const notice=document.createElement('div');notice.className='conversation-live-unresolved-root';notice.textContent='No root agent identified in this run\u2019s evidence. Agent conversations are listed without a parent.';panel.appendChild(notice);const flat=document.createElement('div');flat.className='execweave-conversation-children';for(const record of records)if(record.entry)flat.appendChild(conversationThread(record.entry,record.path||record.key));if(flat.childElementCount)panel.appendChild(flat);return true}const tree=document.createElement('div');tree.className='execweave-conversation-tree';tree.appendChild(conversationAgentNode(rootRecord,true));if(rootRecord.entry)tree.appendChild(conversationThread(rootRecord.entry,rootRecord.path||'/root'));const visited=new Set([rootRecord.key]),children=document.createElement('div');children.className='execweave-conversation-children';const direct=records.filter(record=>record.key!==rootRecord.key&&record.parent&&String(record.parent)===String(rootRecord.thread)),unparented=records.filter(record=>record.key!==rootRecord.key&&!record.parent);for(const record of[...direct,...unparented])appendConversationBranch(children,record,records,visited);for(const record of records)if(record.key!==rootRecord.key&&!visited.has(record.key))appendConversationBranch(children,record,records,visited);if(children.childElementCount)tree.appendChild(children);panel.appendChild(tree);const index=document.createElement('a');index.className='conversation-live-index';index.href=`/conversations.md${window.__execweaveToken?`?t=${encodeURIComponent(window.__execweaveToken)}`:''}`;index.target='_blank';index.rel='noreferrer';index.textContent='Open complete conversation index';panel.appendChild(index);return true}""".strip()
59
+ _LIVE_RENDER = r"""function renderRich(entries){const threads=latestThreads(entries),records=conversationAgentRecords(threads);if(!threads.length&&!records.length)return false;panel.replaceChildren();const focused=conversationFocusRecord(records);if(focused){renderFocusedConversation(panel,focused);return true}const count=threads.reduce((n,e)=>n+((e.conversation_preview?.messages||[]).length),0),summary=document.createElement('div');summary.className='conversation-live-summary';summary.textContent=`${records.length} agent${records.length===1?'':'s'} · ${count} visible item${count===1?'':'s'} · provider-neutral run-local record`;panel.appendChild(summary);const rootRecord=conversationRootRecord(records);if(!rootRecord){const notice=document.createElement('div');notice.className='conversation-live-unresolved-root';notice.textContent='No root agent identified in this run\u2019s evidence. Agent conversations are listed without a parent.';panel.appendChild(notice);const flat=document.createElement('div');flat.className='execweave-conversation-children';for(const record of records)if(record.entry)flat.appendChild(conversationThread(record.entry,record.path||record.key));if(flat.childElementCount)panel.appendChild(flat);return true}const tree=document.createElement('div');tree.className='execweave-conversation-tree';tree.appendChild(conversationAgentNode(rootRecord,true));if(rootRecord.entry)tree.appendChild(conversationThread(rootRecord.entry,rootRecord.path||'/root'));const visited=new Set([rootRecord.key]),children=document.createElement('div');children.className='execweave-conversation-children';const direct=records.filter(record=>record.key!==rootRecord.key&&record.parent&&String(record.parent)===String(rootRecord.thread)),unparented=records.filter(record=>record.key!==rootRecord.key&&!record.parent);for(const record of[...direct,...unparented])appendConversationBranch(children,record,records,visited);for(const record of records)if(record.key!==rootRecord.key&&!visited.has(record.key))appendConversationBranch(children,record,records,visited);if(children.childElementCount)tree.appendChild(children);panel.appendChild(tree);const index=document.createElement('a');index.className='conversation-live-index';index.href=`/conversations.md${window.__execweaveToken?`?t=${encodeURIComponent(window.__execweaveToken)}`:''}`;index.target='_blank';index.rel='noreferrer';index.textContent='Open complete conversation index';panel.appendChild(index);return true}""".strip()
44
60
 
45
61
 
46
62
  def _replace_between(html: str, start: str, following: str, replacement: str) -> str: