execweave 0.7.0__tar.gz → 0.7.1__tar.gz

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