flowproof 0.23.7__tar.gz → 0.23.8__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 (169) hide show
  1. {flowproof-0.23.7 → flowproof-0.23.8}/Cargo.lock +7 -7
  2. {flowproof-0.23.7 → flowproof-0.23.8}/Cargo.toml +1 -1
  3. {flowproof-0.23.7 → flowproof-0.23.8}/PKG-INFO +1 -1
  4. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/web.rs +17 -1
  5. flowproof-0.23.8/crates/flowproof-adapters/tests/password_recording_e2e.rs +53 -0
  6. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/src/agent_flow.rs +103 -39
  7. flowproof-0.23.8/crates/flowproof-cli/src/doctor.rs +545 -0
  8. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/src/lib.rs +9 -4
  9. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/doctor_ai_e2e.rs +42 -0
  10. {flowproof-0.23.7 → flowproof-0.23.8}/flowproof/__init__.py +1 -1
  11. {flowproof-0.23.7 → flowproof-0.23.8}/pyproject.toml +1 -1
  12. flowproof-0.23.7/crates/flowproof-cli/src/doctor.rs +0 -277
  13. {flowproof-0.23.7 → flowproof-0.23.8}/README.md +0 -0
  14. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/Cargo.toml +0 -0
  15. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/agent_proxy.rs +0 -0
  16. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/agent_runner.rs +0 -0
  17. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/egress.rs +0 -0
  18. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/egress_linux.rs +0 -0
  19. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/egress_windows/audit.rs +0 -0
  20. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/egress_windows/capture.rs +0 -0
  21. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/egress_windows/env_block.rs +0 -0
  22. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/egress_windows/filters.rs +0 -0
  23. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/egress_windows/identity.rs +0 -0
  24. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/egress_windows/logon.rs +0 -0
  25. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/egress_windows/netevents.rs +0 -0
  26. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/egress_windows/run.rs +0 -0
  27. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/egress_windows/spawn.rs +0 -0
  28. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/egress_windows/wfp.rs +0 -0
  29. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/egress_windows.rs +0 -0
  30. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/fiori.rs +0 -0
  31. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/fs_observe.rs +0 -0
  32. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/lib.rs +0 -0
  33. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/mcp_core.rs +0 -0
  34. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/mcp_http.rs +0 -0
  35. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/mcp_stdio.rs +0 -0
  36. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/sap_com.rs +0 -0
  37. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/vision.rs +0 -0
  38. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/tests/a11y_capture.rs +0 -0
  39. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/tests/drag_spike.rs +0 -0
  40. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/tests/fs_observation_e2e.rs +0 -0
  41. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/tests/grid_scene_e2e.rs +0 -0
  42. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/tests/list_scene_e2e.rs +0 -0
  43. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/tests/network_idle_e2e.rs +0 -0
  44. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/tests/shared_browser_shutdown_e2e.rs +0 -0
  45. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/tests/side_effect_http_e2e.rs +0 -0
  46. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/tests/static_area_e2e.rs +0 -0
  47. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/tests/visibility_detach_e2e.rs +0 -0
  48. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/tests/windows_containment_e2e.rs +0 -0
  49. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/Cargo.toml +0 -0
  50. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/agent_steps.rs +0 -0
  51. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/author.rs +0 -0
  52. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/clarify.rs +0 -0
  53. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/doc_author.rs +0 -0
  54. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/doc_formats/hp_alm.rs +0 -0
  55. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/doc_formats.rs +0 -0
  56. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/draft_assembly.rs +0 -0
  57. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/heal.rs +0 -0
  58. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/lib.rs +0 -0
  59. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/llm.rs +0 -0
  60. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/recorder.rs +0 -0
  61. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/repair.rs +0 -0
  62. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/rules.rs +0 -0
  63. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/spec.rs +0 -0
  64. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/tests/model_client_http.rs +0 -0
  65. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/Cargo.toml +0 -0
  66. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/skills/flowproof-config/SKILL.md +0 -0
  67. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/src/capture.rs +0 -0
  68. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/src/config.rs +0 -0
  69. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/src/main.rs +0 -0
  70. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/src/suite.rs +0 -0
  71. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/src/suite_checkpoint.rs +0 -0
  72. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/src/suite_inputs.rs +0 -0
  73. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/src/suite_journal.rs +0 -0
  74. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/src/update_check.rs +0 -0
  75. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/a11y_selector_e2e.rs +0 -0
  76. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/agent_conversation_anthropic_e2e.rs +0 -0
  77. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/agent_conversation_streaming_e2e.rs +0 -0
  78. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/agent_flow_e2e.rs +0 -0
  79. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/agent_url_record_e2e.rs +0 -0
  80. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/api_pipeline.rs +0 -0
  81. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/audit_record_e2e.rs +0 -0
  82. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/calc_e2e.rs +0 -0
  83. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/clock_e2e.rs +0 -0
  84. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/config_cli_e2e.rs +0 -0
  85. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/config_seed_e2e.rs +0 -0
  86. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/config_skill_e2e.rs +0 -0
  87. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/cookie_e2e.rs +0 -0
  88. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/doctor_e2e.rs +0 -0
  89. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/documented_flags.rs +0 -0
  90. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/egress_e2e.rs +0 -0
  91. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/examples_resolve.rs +0 -0
  92. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/falsifiability_arg_matchers.rs +0 -0
  93. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/falsifiability_audit_since.rs +0 -0
  94. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/falsifiability_call_order.rs +0 -0
  95. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/falsifiability_capability_regression.rs +0 -0
  96. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/falsifiability_control_verdict.rs +0 -0
  97. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/falsifiability_mcp_kill.rs +0 -0
  98. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/falsifiability_no_tool_call.rs +0 -0
  99. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/falsifiability_reply_contains.rs +0 -0
  100. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/falsifiability_side_effect.rs +0 -0
  101. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/fiori_field_commit_e2e.rs +0 -0
  102. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/grid_cell_e2e.rs +0 -0
  103. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/iframe_e2e.rs +0 -0
  104. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/llm_author_e2e.rs +0 -0
  105. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/mcp_http_e2e.rs +0 -0
  106. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/mcp_stdio_e2e.rs +0 -0
  107. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/notepad_author_e2e.rs +0 -0
  108. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/notepad_e2e.rs +0 -0
  109. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/page_title_e2e.rs +0 -0
  110. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/pinned_random_e2e.rs +0 -0
  111. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/sap_e2e.rs +0 -0
  112. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/sap_pipeline.rs +0 -0
  113. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/sap_sim_e2e.rs +0 -0
  114. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/scoped_container_e2e.rs +0 -0
  115. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/select_missing_option_e2e.rs +0 -0
  116. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/sigterm_shared_browser_e2e.rs +0 -0
  117. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/skip_unless_env.rs +0 -0
  118. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/suite_checkpoint.rs +0 -0
  119. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/suite_env_from.rs +0 -0
  120. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/suite_flow_isolation.rs +0 -0
  121. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/suite_missing_trace.rs +0 -0
  122. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/suite_policy.rs +0 -0
  123. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/support/sap_simulator.py +0 -0
  124. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/visibility_e2e.rs +0 -0
  125. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/vision_pipeline.rs +0 -0
  126. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/web_e2e.rs +0 -0
  127. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-driver/Cargo.toml +0 -0
  128. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-driver/src/app.rs +0 -0
  129. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-driver/src/backend.rs +0 -0
  130. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-driver/src/gdi.rs +0 -0
  131. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-driver/src/lib.rs +0 -0
  132. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-driver/src/mock.rs +0 -0
  133. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-driver/src/oob.rs +0 -0
  134. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-driver/src/recording.rs +0 -0
  135. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-driver/src/redact.rs +0 -0
  136. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-driver/src/surface.rs +0 -0
  137. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-driver/src/visual.rs +0 -0
  138. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-driver/src/window.rs +0 -0
  139. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-python/Cargo.toml +0 -0
  140. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-python/src/lib.rs +0 -0
  141. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-replay/Cargo.toml +0 -0
  142. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-replay/src/lib.rs +0 -0
  143. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-replay/src/report.rs +0 -0
  144. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-replay/src/runrecord.rs +0 -0
  145. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-replay/tests/replay_calc.rs +0 -0
  146. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/Cargo.toml +0 -0
  147. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/schema/cassette-v1.schema.json +0 -0
  148. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/schema/side-effect-v1.schema.json +0 -0
  149. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/schema/trace-v1.schema.json +0 -0
  150. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/src/captures.rs +0 -0
  151. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/src/cassette.rs +0 -0
  152. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/src/cassette_diff.rs +0 -0
  153. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/src/egress.rs +0 -0
  154. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/src/format.rs +0 -0
  155. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/src/lib.rs +0 -0
  156. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/src/secret.rs +0 -0
  157. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/src/secret_scan.rs +0 -0
  158. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/src/side_effect.rs +0 -0
  159. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/src/substitution.rs +0 -0
  160. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/src/toolcalls.rs +0 -0
  161. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/tests/cassette_conformance.rs +0 -0
  162. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/tests/fixtures/multi.trace.jsonl +0 -0
  163. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/tests/fixtures/sample.trace.jsonl +0 -0
  164. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/tests/schema_conformance.rs +0 -0
  165. {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/tests/side_effect_conformance.rs +0 -0
  166. {flowproof-0.23.7 → flowproof-0.23.8}/flowproof/cli.py +0 -0
  167. {flowproof-0.23.7 → flowproof-0.23.8}/flowproof/flow.py +0 -0
  168. {flowproof-0.23.7 → flowproof-0.23.8}/flowproof/mcp_server.py +0 -0
  169. {flowproof-0.23.7 → flowproof-0.23.8}/flowproof/py.typed +0 -0
@@ -930,7 +930,7 @@ dependencies = [
930
930
 
931
931
  [[package]]
932
932
  name = "flowproof-adapters"
933
- version = "0.23.7"
933
+ version = "0.23.8"
934
934
  dependencies = [
935
935
  "anyhow",
936
936
  "flowproof-driver",
@@ -949,7 +949,7 @@ dependencies = [
949
949
 
950
950
  [[package]]
951
951
  name = "flowproof-agent"
952
- version = "0.23.7"
952
+ version = "0.23.8"
953
953
  dependencies = [
954
954
  "chrono",
955
955
  "flowproof-driver",
@@ -967,7 +967,7 @@ dependencies = [
967
967
 
968
968
  [[package]]
969
969
  name = "flowproof-cli"
970
- version = "0.23.7"
970
+ version = "0.23.8"
971
971
  dependencies = [
972
972
  "ab_glyph",
973
973
  "chrono",
@@ -992,7 +992,7 @@ dependencies = [
992
992
 
993
993
  [[package]]
994
994
  name = "flowproof-driver"
995
- version = "0.23.7"
995
+ version = "0.23.8"
996
996
  dependencies = [
997
997
  "calamine",
998
998
  "flowproof-trace",
@@ -1008,7 +1008,7 @@ dependencies = [
1008
1008
 
1009
1009
  [[package]]
1010
1010
  name = "flowproof-python"
1011
- version = "0.23.7"
1011
+ version = "0.23.8"
1012
1012
  dependencies = [
1013
1013
  "flowproof-agent",
1014
1014
  "flowproof-cli",
@@ -1020,7 +1020,7 @@ dependencies = [
1020
1020
 
1021
1021
  [[package]]
1022
1022
  name = "flowproof-replay"
1023
- version = "0.23.7"
1023
+ version = "0.23.8"
1024
1024
  dependencies = [
1025
1025
  "chrono",
1026
1026
  "flowproof-agent",
@@ -1034,7 +1034,7 @@ dependencies = [
1034
1034
 
1035
1035
  [[package]]
1036
1036
  name = "flowproof-trace"
1037
- version = "0.23.7"
1037
+ version = "0.23.8"
1038
1038
  dependencies = [
1039
1039
  "jsonschema",
1040
1040
  "regex",
@@ -22,7 +22,7 @@ members = ["crates/flowproof-driver", "crates/flowproof-trace", "crates/flowproo
22
22
  exclude = ["spike/windows-containment"]
23
23
 
24
24
  [workspace.package]
25
- version = "0.23.7"
25
+ version = "0.23.8"
26
26
  edition = "2021"
27
27
  license = "Apache-2.0"
28
28
  repository = "https://github.com/automators-com/flowproof"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flowproof
3
- Version: 0.23.7
3
+ Version: 0.23.8
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: Programming Language :: Python :: 3
@@ -5524,9 +5524,25 @@ impl AppDriver for WebAppDriver {
5524
5524
  let tab = self.tab()?;
5525
5525
  let fields = tab
5526
5526
  .find_elements("input[type=password]")
5527
- .unwrap_or_default();
5527
+ .map_err(|e| web_err("finding password fields", e))?;
5528
5528
  let mut rects = Vec::new();
5529
5529
  for field in fields {
5530
+ // Hidden wizard pages still contain password inputs, but have no
5531
+ // layout box. Only positively identified non-rendered fields may
5532
+ // be skipped; failed visibility probes must still drop the frame.
5533
+ let rendered = field
5534
+ .call_js_fn(
5535
+ "function() { return this.getClientRects().length > 0; }",
5536
+ vec![],
5537
+ false,
5538
+ )
5539
+ .map_err(|e| web_err("checking password field layout", e))?
5540
+ .value
5541
+ .and_then(|v| v.as_bool())
5542
+ .ok_or_else(|| DriverError::Browser("password field layout unavailable".into()))?;
5543
+ if !rendered {
5544
+ continue;
5545
+ }
5530
5546
  let quad = field
5531
5547
  .get_box_model()
5532
5548
  .map_err(|e| web_err("box model of password field", e))?
@@ -0,0 +1,53 @@
1
+ //! Hidden password fields must not discard otherwise safe screenshots.
2
+ use flowproof_driver::{AppDriver, UiaSelector};
3
+ #[test]
4
+ fn hidden_password_inputs_do_not_drop_frames_and_visible_passwords_stay_masked() {
5
+ if std::env::var("FLOWPROOF_E2E").as_deref() != Ok("1") {
6
+ return;
7
+ }
8
+ let _guard = flowproof_adapters::SharedBrowserGuard::new();
9
+ let html = r#"<html><body><input type='password' value='visible-secret' style='width:200px;height:40px'><section id='later' style='display:none'><input type='password' value='hidden-secret'></section><button id='reveal' onclick="document.getElementById('later').style.display='block'">Reveal</button></body></html>"#;
10
+ let listener = std::net::TcpListener::bind("127.0.0.1:0").expect("fixture listener");
11
+ let port = listener.local_addr().expect("fixture address").port();
12
+ std::thread::spawn(move || {
13
+ use std::io::{Read, Write};
14
+ for mut stream in listener.incoming().flatten() {
15
+ let mut request = [0; 2048];
16
+ let _ = stream.read(&mut request);
17
+ let _ = write!(stream, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: {}\r\nConnection: close\r\n\r\n{}", html.len(), html);
18
+ }
19
+ });
20
+ let mut driver = flowproof_adapters::WebAppDriver::new().expect("Chrome launches");
21
+ driver
22
+ .launch(
23
+ &format!("http://127.0.0.1:{port}"),
24
+ "",
25
+ std::time::Duration::from_secs(30),
26
+ )
27
+ .expect("fixture loads");
28
+
29
+ let rects = flowproof_driver::redact::resolve_rects(&mut driver, &[])
30
+ .expect("hidden inputs are safe to skip");
31
+ assert_eq!(rects.len(), 1);
32
+ let mut frame = driver
33
+ .capture()
34
+ .expect("screenshot captured")
35
+ .expect("web screenshots supported");
36
+ flowproof_driver::redact::apply(&mut frame, &rects);
37
+ let (x, y, w, h) = rects[0];
38
+ assert!(w > 0 && h > 0);
39
+ for py in y.max(0) as u32..((y.max(0) as u32 + h).min(frame.height())) {
40
+ for px in x.max(0) as u32..((x.max(0) as u32 + w).min(frame.width())) {
41
+ assert_eq!(frame.get_pixel(px, py).0, [0, 0, 0, 255]);
42
+ }
43
+ }
44
+ driver
45
+ .invoke(&UiaSelector::css("#reveal"))
46
+ .expect("reveal password field");
47
+ assert_eq!(
48
+ flowproof_driver::redact::resolve_rects(&mut driver, &[])
49
+ .expect("visible password rectangles resolved")
50
+ .len(),
51
+ 2
52
+ );
53
+ }
@@ -1721,7 +1721,12 @@ fn require_progress(run: &AgentRun, cassette: &Cassette, plan: &Plan) -> Result<
1721
1721
  /// the proxy - not that all of them did. Reporting the observation and
1722
1722
  /// letting the reader judge is the honest shape, and the same reason the
1723
1723
  /// zero-capture guard names causes as possibilities rather than facts.
1724
- pub fn cmd_doctor_agent(command: &str, timeout_secs: u64, prompt: &str) -> Result<u8, String> {
1724
+ pub fn cmd_doctor_agent(
1725
+ command: &str,
1726
+ timeout_secs: u64,
1727
+ prompt: &str,
1728
+ json: bool,
1729
+ ) -> Result<u8, String> {
1725
1730
  use flowproof_trace::cassette::{Cassette, Message, Turn, TurnRequest, TurnResponse};
1726
1731
 
1727
1732
  // One canned turn. Anything the agent sends is answered from this, so no
@@ -1752,11 +1757,13 @@ pub fn cmd_doctor_agent(command: &str, timeout_secs: u64, prompt: &str) -> Resul
1752
1757
  ..Default::default()
1753
1758
  };
1754
1759
 
1760
+ let mut report = crate::doctor::DoctorReport::new("agent");
1761
+
1755
1762
  let proxy = AgentProxy::start(probe, Mocks::new(), 0)
1756
1763
  .map_err(|e| format!("starting the probe proxy: {e}"))?;
1757
1764
  let base = proxy.base_url();
1758
- println!("proxy listening on {base}");
1759
- println!("running: {command}");
1765
+ report.note(json, "ok", "proxy", format!("proxy listening on {base}"));
1766
+ report.note(json, "ok", "command", format!("running: {command}"));
1760
1767
 
1761
1768
  let mut env = BTreeMap::new();
1762
1769
  env.insert(PROMPT_VAR.to_string(), prompt.to_string());
@@ -1768,61 +1775,118 @@ pub fn cmd_doctor_agent(command: &str, timeout_secs: u64, prompt: &str) -> Resul
1768
1775
  let arrived = log.served + usize::from(log.divergence.is_some());
1769
1776
  drop(log);
1770
1777
 
1771
- println!();
1772
- println!("model requests that reached the proxy: {arrived}");
1778
+ if !json {
1779
+ println!();
1780
+ }
1781
+ report.note(
1782
+ json,
1783
+ if arrived > 0 { "ok" } else { "fail" },
1784
+ "traffic",
1785
+ format!("model requests that reached the proxy: {arrived}"),
1786
+ );
1773
1787
  if run.timed_out {
1774
- println!(
1775
- "the agent was still running after {timeout_secs}s and was stopped. That is an \
1776
- observation, not a wiring failure: an agent waiting for a useful reply will hang \
1777
- against a canned one."
1788
+ report.note(
1789
+ json,
1790
+ "warn",
1791
+ "timeout",
1792
+ format!(
1793
+ "the agent was still running after {timeout_secs}s and was stopped. That is an \
1794
+ observation, not a wiring failure: an agent waiting for a useful reply will hang \
1795
+ against a canned one."
1796
+ ),
1778
1797
  );
1779
1798
  // Found while testing this command: the deadline kills the process
1780
1799
  // flowproof started, but a GRANDCHILD holding the inherited stdout
1781
1800
  // pipe keeps the read blocking, so the wall-clock wait can exceed
1782
1801
  // the timeout by a lot. Say so rather than let it look like a hang
1783
1802
  // with no explanation.
1784
- println!(
1785
- " (if this took much longer than {timeout_secs}s, the agent spawned a child that \
1786
- outlived it and kept the output pipe open. flowproof stops the process it started, \
1787
- not the tree.)"
1803
+ report.note(
1804
+ json,
1805
+ "warn",
1806
+ "timeout",
1807
+ format!(
1808
+ "(if this took much longer than {timeout_secs}s, the agent spawned a child that \
1809
+ outlived it and kept the output pipe open. flowproof stops the process it \
1810
+ started, not the tree.)"
1811
+ ),
1788
1812
  );
1789
1813
  } else {
1790
- println!(
1791
- "the agent exited {}",
1792
- run.exit_code
1793
- .map(|c| c.to_string())
1794
- .unwrap_or_else(|| "with no code".into())
1814
+ report.note(
1815
+ json,
1816
+ "ok",
1817
+ "exit",
1818
+ format!(
1819
+ "the agent exited {}",
1820
+ run.exit_code
1821
+ .map(|c| c.to_string())
1822
+ .unwrap_or_else(|| "with no code".into())
1823
+ ),
1795
1824
  );
1796
1825
  }
1797
1826
 
1798
1827
  if arrived == 0 {
1799
- println!();
1800
- println!("NOTHING reached the proxy. The client is not honouring the base URL flowproof");
1801
- println!("injected (OPENAI_BASE_URL, OPENAI_API_BASE, OPENAI_BASE, ANTHROPIC_BASE_URL,");
1802
- println!("FLOWPROOF_LLM_PROXY). If it reads a different variable, or builds its base URL");
1803
- println!("from a config object, map it in `agent.env`:");
1804
- println!();
1805
- println!(" env:");
1806
- println!(" YOUR_VARIABLE: \"${{flowproof.proxy_url}}\" # includes /v1");
1807
- println!(
1808
- " OR: \"${{flowproof.proxy_url_no_v1}}\" # client appends its own"
1828
+ if !json {
1829
+ println!();
1830
+ println!(
1831
+ "NOTHING reached the proxy. The client is not honouring the base URL flowproof"
1832
+ );
1833
+ println!(
1834
+ "injected (OPENAI_BASE_URL, OPENAI_API_BASE, OPENAI_BASE, ANTHROPIC_BASE_URL,"
1835
+ );
1836
+ println!(
1837
+ "FLOWPROOF_LLM_PROXY). If it reads a different variable, or builds its base URL"
1838
+ );
1839
+ println!("from a config object, map it in `agent.env`:");
1840
+ println!();
1841
+ println!(" env:");
1842
+ println!(" YOUR_VARIABLE: \"${{flowproof.proxy_url}}\" # includes /v1");
1843
+ println!(
1844
+ " OR: \"${{flowproof.proxy_url_no_v1}}\" # client appends its own"
1845
+ );
1846
+ println!();
1847
+ println!("If the model call happens in a CHILD process, check that it inherits the");
1848
+ println!("environment - that is the usual cause when the command itself looks right.");
1849
+ }
1850
+ report.note(
1851
+ json,
1852
+ "fail",
1853
+ "wiring",
1854
+ "NOTHING reached the proxy. The client is not honouring the base URL flowproof \
1855
+ injected (OPENAI_BASE_URL, OPENAI_API_BASE, OPENAI_BASE, ANTHROPIC_BASE_URL, \
1856
+ FLOWPROOF_LLM_PROXY); map it in `agent.env` via `${{flowproof.proxy_url}}` or \
1857
+ `${{flowproof.proxy_url_no_v1}}`, and check a child-process model call inherits the \
1858
+ environment.",
1809
1859
  );
1810
- println!();
1811
- println!("If the model call happens in a CHILD process, check that it inherits the");
1812
- println!("environment - that is the usual cause when the command itself looks right.");
1813
1860
  if !run.stderr.trim().is_empty() {
1814
- println!();
1815
- println!("stderr:\n{}", run.stderr.trim());
1861
+ if !json {
1862
+ println!();
1863
+ println!("stderr:\n{}", run.stderr.trim());
1864
+ }
1865
+ report.note(json, "warn", "stderr", run.stderr.trim());
1816
1866
  }
1867
+ report.emit(json)?;
1817
1868
  return Ok(crate::EXIT_FAIL);
1818
1869
  }
1819
1870
 
1820
- println!();
1821
- println!("At least one client reached the proxy, so recording can capture that traffic.");
1822
- println!("This does NOT prove every model call goes through flowproof: an agent with more");
1823
- println!("than one client can reach the proxy with one and the real provider with another.");
1824
- println!("`record` is the check that settles it - it fails and writes no trace if nothing");
1825
- println!("is captured.");
1871
+ if !json {
1872
+ println!();
1873
+ println!("At least one client reached the proxy, so recording can capture that traffic.");
1874
+ println!("This does NOT prove every model call goes through flowproof: an agent with more");
1875
+ println!(
1876
+ "than one client can reach the proxy with one and the real provider with another."
1877
+ );
1878
+ println!("`record` is the check that settles it - it fails and writes no trace if nothing");
1879
+ println!("is captured.");
1880
+ }
1881
+ report.note(
1882
+ json,
1883
+ "ok",
1884
+ "verdict",
1885
+ "At least one client reached the proxy, so recording can capture that traffic. This does \
1886
+ NOT prove every model call goes through flowproof.",
1887
+ );
1888
+ report.pass = true;
1889
+ report.emit(json)?;
1826
1890
  Ok(crate::EXIT_PASS)
1827
1891
  }
1828
1892