execweave 0.8.5__tar.gz → 0.8.6__tar.gz

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