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.
- {flowproof-0.23.7 → flowproof-0.23.8}/Cargo.lock +7 -7
- {flowproof-0.23.7 → flowproof-0.23.8}/Cargo.toml +1 -1
- {flowproof-0.23.7 → flowproof-0.23.8}/PKG-INFO +1 -1
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/web.rs +17 -1
- flowproof-0.23.8/crates/flowproof-adapters/tests/password_recording_e2e.rs +53 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/src/agent_flow.rs +103 -39
- flowproof-0.23.8/crates/flowproof-cli/src/doctor.rs +545 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/src/lib.rs +9 -4
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/doctor_ai_e2e.rs +42 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/flowproof/__init__.py +1 -1
- {flowproof-0.23.7 → flowproof-0.23.8}/pyproject.toml +1 -1
- flowproof-0.23.7/crates/flowproof-cli/src/doctor.rs +0 -277
- {flowproof-0.23.7 → flowproof-0.23.8}/README.md +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/Cargo.toml +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/agent_proxy.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/agent_runner.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/egress.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/egress_linux.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/egress_windows/audit.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/egress_windows/capture.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/egress_windows/env_block.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/egress_windows/filters.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/egress_windows/identity.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/egress_windows/logon.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/egress_windows/netevents.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/egress_windows/run.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/egress_windows/spawn.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/egress_windows/wfp.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/egress_windows.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/fiori.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/fs_observe.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/lib.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/mcp_core.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/mcp_http.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/mcp_stdio.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/sap_com.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/src/vision.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/tests/a11y_capture.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/tests/drag_spike.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/tests/fs_observation_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/tests/grid_scene_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/tests/list_scene_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/tests/network_idle_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/tests/shared_browser_shutdown_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/tests/side_effect_http_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/tests/static_area_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/tests/visibility_detach_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-adapters/tests/windows_containment_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/Cargo.toml +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/agent_steps.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/author.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/clarify.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/doc_author.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/doc_formats/hp_alm.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/doc_formats.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/draft_assembly.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/heal.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/lib.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/llm.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/recorder.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/repair.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/rules.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/src/spec.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-agent/tests/model_client_http.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/Cargo.toml +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/skills/flowproof-config/SKILL.md +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/src/capture.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/src/config.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/src/main.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/src/suite.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/src/suite_checkpoint.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/src/suite_inputs.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/src/suite_journal.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/src/update_check.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/a11y_selector_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/agent_conversation_anthropic_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/agent_conversation_streaming_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/agent_flow_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/agent_url_record_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/api_pipeline.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/audit_record_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/calc_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/clock_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/config_cli_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/config_seed_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/config_skill_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/cookie_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/doctor_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/documented_flags.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/egress_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/examples_resolve.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/falsifiability_arg_matchers.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/falsifiability_audit_since.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/falsifiability_call_order.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/falsifiability_capability_regression.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/falsifiability_control_verdict.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/falsifiability_mcp_kill.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/falsifiability_no_tool_call.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/falsifiability_reply_contains.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/falsifiability_side_effect.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/fiori_field_commit_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/grid_cell_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/iframe_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/llm_author_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/mcp_http_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/mcp_stdio_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/notepad_author_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/notepad_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/page_title_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/pinned_random_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/sap_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/sap_pipeline.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/sap_sim_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/scoped_container_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/select_missing_option_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/sigterm_shared_browser_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/skip_unless_env.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/suite_checkpoint.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/suite_env_from.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/suite_flow_isolation.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/suite_missing_trace.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/suite_policy.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/support/sap_simulator.py +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/visibility_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/vision_pipeline.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-cli/tests/web_e2e.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-driver/Cargo.toml +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-driver/src/app.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-driver/src/backend.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-driver/src/gdi.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-driver/src/lib.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-driver/src/mock.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-driver/src/oob.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-driver/src/recording.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-driver/src/redact.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-driver/src/surface.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-driver/src/visual.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-driver/src/window.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-python/Cargo.toml +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-python/src/lib.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-replay/Cargo.toml +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-replay/src/lib.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-replay/src/report.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-replay/src/runrecord.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-replay/tests/replay_calc.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/Cargo.toml +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/schema/cassette-v1.schema.json +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/schema/side-effect-v1.schema.json +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/schema/trace-v1.schema.json +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/src/captures.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/src/cassette.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/src/cassette_diff.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/src/egress.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/src/format.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/src/lib.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/src/secret.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/src/secret_scan.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/src/side_effect.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/src/substitution.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/src/toolcalls.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/tests/cassette_conformance.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/tests/fixtures/multi.trace.jsonl +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/tests/fixtures/sample.trace.jsonl +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/tests/schema_conformance.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/crates/flowproof-trace/tests/side_effect_conformance.rs +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/flowproof/cli.py +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/flowproof/flow.py +0 -0
- {flowproof-0.23.7 → flowproof-0.23.8}/flowproof/mcp_server.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
25
|
+
version = "0.23.8"
|
|
26
26
|
edition = "2021"
|
|
27
27
|
license = "Apache-2.0"
|
|
28
28
|
repository = "https://github.com/automators-com/flowproof"
|
|
@@ -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
|
-
.
|
|
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(
|
|
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
|
-
|
|
1759
|
-
|
|
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
|
-
|
|
1772
|
-
|
|
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
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
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
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
1787
|
-
|
|
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
|
-
|
|
1791
|
-
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
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
|
-
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
|
|
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
|
-
|
|
1815
|
-
|
|
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
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
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
|
|