execweave 0.8.25__tar.gz → 0.8.27__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 (187) hide show
  1. {execweave-0.8.25 → execweave-0.8.27}/PKG-INFO +1 -1
  2. {execweave-0.8.25 → execweave-0.8.27}/pyproject.toml +2 -2
  3. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/__init__.py +1 -1
  4. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/collector.py +9 -1
  5. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/framework_adapters/base.py +1 -1
  6. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/framework_adapters/camel.py +37 -3
  7. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/strace_backend.py +6 -0
  8. {execweave-0.8.25 → execweave-0.8.27}/.gitignore +0 -0
  9. {execweave-0.8.25 → execweave-0.8.27}/LICENSE +0 -0
  10. {execweave-0.8.25 → execweave-0.8.27}/README.md +0 -0
  11. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/__main__.py +0 -0
  12. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/_conversation_records_core.py +0 -0
  13. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/_dashboard_shell_base.py +0 -0
  14. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/_http_proxy_base.py +0 -0
  15. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/_http_proxy_bounded.py +0 -0
  16. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/_http_proxy_stage.py +0 -0
  17. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/agent_bootstrap.py +0 -0
  18. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/agent_topology.py +0 -0
  19. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/agent_trace.py +0 -0
  20. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/agy_preview_sanitize.py +0 -0
  21. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/analysis.py +0 -0
  22. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/anthropic.py +0 -0
  23. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/anthropic_cli.py +0 -0
  24. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/anthropic_full_fidelity.py +0 -0
  25. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/antigravity_adapter.py +0 -0
  26. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/antigravity_adapter_base.py +0 -0
  27. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/antigravity_full_fidelity.py +0 -0
  28. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/antigravity_full_fidelity_base.py +0 -0
  29. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/antigravity_full_fidelity_collaboration_base.py +0 -0
  30. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/antigravity_hook_cli.py +0 -0
  31. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/antigravity_record.py +0 -0
  32. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/antigravity_subagent_linkage.py +0 -0
  33. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/antigravity_trace_capability.py +0 -0
  34. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/auto_specialized.py +0 -0
  35. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/backends.py +0 -0
  36. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/benchmark.py +0 -0
  37. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/claude_adapter.py +0 -0
  38. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/claude_child_transcript.py +0 -0
  39. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/claude_delegation.py +0 -0
  40. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/claude_full_fidelity.py +0 -0
  41. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/claude_hook_cli.py +0 -0
  42. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/claude_hook_contract.py +0 -0
  43. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/claude_model_observer.py +0 -0
  44. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/claude_record.py +0 -0
  45. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/cli.py +0 -0
  46. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/codex_adapter.py +0 -0
  47. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/codex_conversation.py +0 -0
  48. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/codex_full_fidelity.py +0 -0
  49. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/codex_hook_cli.py +0 -0
  50. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/codex_hook_entry.py +0 -0
  51. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/codex_hook_lifecycle.py +0 -0
  52. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/codex_message_diagnostics.py +0 -0
  53. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/codex_message_transport_diagnostics.py +0 -0
  54. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/codex_record.py +0 -0
  55. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/codex_rollout_structures.py +0 -0
  56. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/codex_rollout_trace.py +0 -0
  57. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/codex_rollout_trace_base.py +0 -0
  58. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/command.py +0 -0
  59. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/content_evidence.py +0 -0
  60. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/content_store.py +0 -0
  61. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/conversation_archive.py +0 -0
  62. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/conversation_message_identity.py +0 -0
  63. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/conversation_preview.py +0 -0
  64. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/conversation_preview_antigravity.py +0 -0
  65. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/conversation_preview_claude.py +0 -0
  66. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/conversation_preview_codex.py +0 -0
  67. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/conversation_preview_common.py +0 -0
  68. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/conversation_preview_generic.py +0 -0
  69. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/conversation_preview_lines.py +0 -0
  70. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/conversation_preview_transcript.py +0 -0
  71. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/conversation_records.py +0 -0
  72. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/conversation_records_antigravity.py +0 -0
  73. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/conversation_records_codex.py +0 -0
  74. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/conversation_records_common.py +0 -0
  75. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/conversation_records_ollama.py +0 -0
  76. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/correlation.py +0 -0
  77. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/cursor_adapter.py +0 -0
  78. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/cursor_delegation.py +0 -0
  79. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/cursor_delegation_base.py +0 -0
  80. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/cursor_full_fidelity.py +0 -0
  81. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/cursor_hook_cli.py +0 -0
  82. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/cursor_hook_contract.py +0 -0
  83. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/cursor_lifecycle.py +0 -0
  84. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/cursor_record.py +0 -0
  85. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/dashboard_shell.py +0 -0
  86. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/entry.py +0 -0
  87. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/evidence_availability.py +0 -0
  88. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/evidence_grade.py +0 -0
  89. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/fidelity.py +0 -0
  90. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/filesystem.py +0 -0
  91. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/focus.py +0 -0
  92. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/framework_adapters/__init__.py +0 -0
  93. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/framework_adapters/autogen.py +0 -0
  94. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/framework_adapters/metagpt.py +0 -0
  95. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/framework_adapters/registry.py +0 -0
  96. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/graph.py +0 -0
  97. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/graph_ops.py +0 -0
  98. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/http_proxy.py +0 -0
  99. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/http_proxy_cli.py +0 -0
  100. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/inference_gateway.py +0 -0
  101. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/inference_gateway_cli.py +0 -0
  102. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/inference_gateway_full_fidelity.py +0 -0
  103. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/inference_identity.py +0 -0
  104. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/inference_identity_cli.py +0 -0
  105. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/integrity.py +0 -0
  106. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/integrity_cli.py +0 -0
  107. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/litellm_callback.py +0 -0
  108. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/litellm_callback_cli.py +0 -0
  109. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/live.py +0 -0
  110. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/live_core.py +0 -0
  111. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/live_view.py +0 -0
  112. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/live_view_extra_style.py +0 -0
  113. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/live_view_markup.py +0 -0
  114. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/live_view_process_layout.py +0 -0
  115. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/live_view_readability.py +0 -0
  116. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/live_view_script_a.py +0 -0
  117. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/live_view_script_b.py +0 -0
  118. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/live_view_script_c.py +0 -0
  119. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/live_view_script_d.py +0 -0
  120. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/live_view_style.py +0 -0
  121. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/model_runtime.py +0 -0
  122. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/model_runtime_cli.py +0 -0
  123. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/model_runtime_full_fidelity.py +0 -0
  124. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/openai_compatible.py +0 -0
  125. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/openai_compatible_cli.py +0 -0
  126. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/openai_compatible_full_fidelity.py +0 -0
  127. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/opencode_adapter.py +0 -0
  128. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/opencode_event_contract.py +0 -0
  129. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/opencode_full_fidelity.py +0 -0
  130. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/opencode_hook_cli.py +0 -0
  131. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/opencode_plugin_cli.py +0 -0
  132. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/opencode_record.py +0 -0
  133. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/opencode_task_linkage.py +0 -0
  134. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/overhead_benchmark.py +0 -0
  135. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/provider_capability.py +0 -0
  136. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/provider_lifecycle.py +0 -0
  137. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/provider_record.py +0 -0
  138. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/rule_pack.py +0 -0
  139. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/rule_pack_cli.py +0 -0
  140. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/runtime_endpoint_availability.py +0 -0
  141. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/scalability_benchmark.py +0 -0
  142. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/schema.py +0 -0
  143. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/scope.py +0 -0
  144. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/semantic.py +0 -0
  145. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/sink.py +0 -0
  146. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/stream_assembly.py +0 -0
  147. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/theme.py +0 -0
  148. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/top.py +0 -0
  149. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/top_cli.py +0 -0
  150. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/validate.py +0 -0
  151. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/vendor/dagre.min.js +0 -0
  152. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/view_cli.py +0 -0
  153. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer.py +0 -0
  154. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_agent_panel.py +0 -0
  155. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_agent_panel_antigravity.py +0 -0
  156. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_agent_panel_claude.py +0 -0
  157. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_agent_panel_codex.py +0 -0
  158. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_agent_panel_cursor.py +0 -0
  159. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_agent_panel_default.py +0 -0
  160. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_agent_panel_ollama.py +0 -0
  161. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_agent_panel_opencode.py +0 -0
  162. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_agent_panel_registry.py +0 -0
  163. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_content_inspector.py +0 -0
  164. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_dashboard_clean.py +0 -0
  165. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_dashboard_focus.py +0 -0
  166. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_dashboard_hardening.py +0 -0
  167. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_dashboard_hardening_v2.py +0 -0
  168. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_dashboard_pr70.py +0 -0
  169. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_edge_decross.py +0 -0
  170. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_execution_flow.py +0 -0
  171. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_execution_flow_provider_normalization.py +0 -0
  172. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_execution_flow_safety.py +0 -0
  173. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_external_endpoints.py +0 -0
  174. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_flow_canvas.py +0 -0
  175. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_flow_layout.py +0 -0
  176. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_gif.py +0 -0
  177. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_layout_geometry.py +0 -0
  178. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_layout_v2.py +0 -0
  179. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_layout_v2_detached.py +0 -0
  180. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_limits.py +0 -0
  181. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_live_layout.py +0 -0
  182. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_projection.py +0 -0
  183. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_projection_base.py +0 -0
  184. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_projection_bridges.py +0 -0
  185. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_semantic_projection.py +0 -0
  186. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/viewer_tool_mirror_identity.py +0 -0
  187. {execweave-0.8.25 → execweave-0.8.27}/src/execweave/workflow.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: execweave
3
- Version: 0.8.25
3
+ Version: 0.8.27
4
4
  Summary: Turn AI-agent runtime behavior into a local interactive execution graph.
5
5
  Project-URL: Homepage, https://github.com/Irish-kw/ExecWeave
6
6
  Project-URL: Repository, https://github.com/Irish-kw/ExecWeave
@@ -4,8 +4,8 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "execweave"
7
- # ExecWeave v0.8.25 release metadata
8
- version = "0.8.25"
7
+ # ExecWeave v0.8.27 release metadata
8
+ version = "0.8.27"
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.25"
3
+ __version__ = "0.8.27"
@@ -75,7 +75,15 @@ def _safe_process_snapshot(proc: psutil.Process) -> ProcessSnapshot | None:
75
75
  exe=exe,
76
76
  create_time=proc.create_time(),
77
77
  )
78
- except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
78
+ except (
79
+ psutil.NoSuchProcess,
80
+ psutil.AccessDenied,
81
+ psutil.ZombieProcess,
82
+ # macOS can surface protected-process cmdline denial as a SystemError
83
+ # from psutil's C extension instead of AccessDenied. Treat that process
84
+ # as unobservable, just like the other permission-race cases.
85
+ SystemError,
86
+ ):
79
87
  return None
80
88
 
81
89
 
@@ -34,7 +34,7 @@ CANONICAL_EVENT_TYPES = frozenset(
34
34
  "AGENT_CREATED", "AGENT_STARTED", "AGENT_STOPPED",
35
35
  "TASK_CREATED", "TASK_ASSIGNED", "TASK_STARTED", "TASK_UPDATED",
36
36
  "TASK_COMPLETED", "TASK_FAILED",
37
- "MESSAGE_SENT", "MESSAGE_RECEIVED",
37
+ "MESSAGE_SENT", "MESSAGE_RECEIVED", "MESSAGE_UNROUTED",
38
38
  "MODEL_REQUEST", "MODEL_RESPONSE", "MODEL_FAILURE",
39
39
  "TOOL_CALL", "TOOL_RESULT", "TOOL_FAILURE",
40
40
  "MESSAGE_CONTENT_RECORDED", "MODEL_CONTENT_RECORDED", "TOOL_CONTENT_RECORDED",
@@ -11,10 +11,10 @@ from .base import AdapterCapabilities, AdapterContext, AgentRecord, EntityRef, F
11
11
  class CAMELAdapter(FrameworkAdapter):
12
12
  framework_name = "camel"
13
13
  capabilities = AdapterCapabilities(
14
- events=("AGENT_CREATED", "AGENT_STARTED", "AGENT_STOPPED", "TASK_CREATED", "TASK_ASSIGNED", "TASK_STARTED", "TASK_UPDATED", "TASK_COMPLETED", "TASK_FAILED", "MESSAGE_SENT", "MESSAGE_RECEIVED", "MODEL_REQUEST", "MODEL_RESPONSE", "MODEL_FAILURE"),
14
+ events=("AGENT_CREATED", "AGENT_STARTED", "AGENT_STOPPED", "TASK_CREATED", "TASK_ASSIGNED", "TASK_STARTED", "TASK_UPDATED", "TASK_COMPLETED", "TASK_FAILED", "MESSAGE_SENT", "MESSAGE_RECEIVED", "MESSAGE_UNROUTED", "MODEL_REQUEST", "MODEL_RESPONSE", "MODEL_FAILURE"),
15
15
  content_modes=("metadata_only", "content_ref_only", "prompt_only", "prompt_and_response"),
16
16
  authoritative_surfaces=("camel.societies.workforce.WorkforceCallback", "camel.models.BaseModelBackend.run", "camel.models.BaseModelBackend.arun"),
17
- known_limitations=("WorkforceCallback LogEvent does not expose the emitting worker or recipient; those log messages remain explicitly unrouted unless a stream-chunk or model/message hook supplies the boundary.", "A created worker is not treated as assigned until CAMEL reports a task assignment."),
17
+ known_limitations=("WorkforceCallback LogEvent does not expose the emitting worker or recipient; those log messages are explicitly marked MESSAGE_UNROUTED and correlated to the observed process instead of being assigned to a guessed agent.", "A created worker is not treated as assigned until CAMEL reports a task assignment."),
18
18
  )
19
19
 
20
20
  def __init__(self, context: AdapterContext) -> None:
@@ -73,6 +73,32 @@ class CAMELAdapter(FrameworkAdapter):
73
73
  self.context.record_message(MessageRecord(message, source, target, role=role, task=task, content=content, direction="received" if received else "sent", attributes=attributes))
74
74
  return message
75
75
 
76
+ def message_unrouted(self, message: EntityRef, *, callback_name: str, missing_sender: bool, missing_recipient: bool, reason: str = "callback_payload_missing_agent_boundary") -> None:
77
+ """Keep callback messages visible without inventing an agent route.
78
+
79
+ CAMEL's WorkforceCallback log surface can emit a message without a
80
+ worker or recipient. The process is the only authoritative boundary
81
+ available in that case, so record that boundary explicitly rather
82
+ than leaving the message looking like a dropped graph node.
83
+ """
84
+ process = self.context.process
85
+ if process is None:
86
+ return
87
+ self.emit(
88
+ "MESSAGE_UNROUTED",
89
+ "OBSERVED_AT_PROCESS",
90
+ source=message,
91
+ target=process.to_entity(),
92
+ attributes={
93
+ "callback_name": callback_name,
94
+ "routing_status": "unrouted",
95
+ "routing_reason": reason,
96
+ "missing_sender": missing_sender,
97
+ "missing_recipient": missing_recipient,
98
+ "routing_basis": "authoritative_process_boundary",
99
+ },
100
+ )
101
+
76
102
  def model_call(self, call_id: str | int, agent: EntityRef | None, model_id: str | int, *, model_name: str | None = None, request: Any | None = None, response: Any | None = None, status: str = "request", task: EntityRef | None = None, **attributes: Any) -> EntityRef:
77
103
  model = self.model(model_id, name=model_name, provider="camel", **attributes)
78
104
  call = self.entity("model_call", call_id, name="CAMEL model call", attributes={"provider": "camel"})
@@ -103,7 +129,7 @@ class CAMELAdapter(FrameworkAdapter):
103
129
  source = self._agents.get(str(worker_id)) if worker_id is not None else None
104
130
  target_id = _value(payload, "target_worker_id", "recipient_worker_id", "target_agent_id", "recipient_agent_id", "receiver_id")
105
131
  target = self._agents.get(str(target_id)) if target_id is not None else None
106
- return self.message(
132
+ message = self.message(
107
133
  message_id,
108
134
  source,
109
135
  target,
@@ -116,6 +142,14 @@ class CAMELAdapter(FrameworkAdapter):
116
142
  "message_id_source": "provider" if native_message_id is not None else "execweave_derived",
117
143
  },
118
144
  )
145
+ if source is None or target is None:
146
+ self.message_unrouted(
147
+ message,
148
+ callback_name=name,
149
+ missing_sender=source is None,
150
+ missing_recipient=target is None,
151
+ )
152
+ return message
119
153
  if name == "log_task_decomposed":
120
154
  parent_key = _native(payload, "parent_task_id", "task_id", "id")
121
155
  parent = self._tasks.get(str(parent_key)) or self.task_created(parent_key)
@@ -49,6 +49,12 @@ def _iso_timestamp(value: float) -> str:
49
49
 
50
50
 
51
51
  def _decode_quoted(value: str) -> str:
52
+ # Synthetic Windows traces carry native drive paths with single
53
+ # backslashes (for example ``C:\\tmp``). Treating those as Python string
54
+ # escapes turns ``\\t`` into a tab and corrupts the observed path. Real
55
+ # Linux strace paths still use the normal C-style decoding below.
56
+ if re.match(r"^[A-Za-z]:[\\/]", value):
57
+ return value.replace(r'\"', '"').replace(r"\\", "\\")
52
58
  try:
53
59
  return str(ast.literal_eval(f'"{value}"'))
54
60
  except (SyntaxError, ValueError):
File without changes
File without changes
File without changes