flowproof 0.4.1__tar.gz → 0.6.0__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 (96) hide show
  1. {flowproof-0.4.1 → flowproof-0.6.0}/Cargo.lock +7 -7
  2. {flowproof-0.4.1 → flowproof-0.6.0}/Cargo.toml +1 -1
  3. {flowproof-0.4.1 → flowproof-0.6.0}/PKG-INFO +1 -1
  4. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-adapters/src/agent_proxy.rs +44 -6
  5. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-adapters/src/web.rs +528 -11
  6. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-agent/src/author.rs +1 -0
  7. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-agent/src/recorder.rs +686 -36
  8. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-agent/src/rules.rs +1415 -52
  9. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-agent/src/spec.rs +87 -8
  10. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-cli/src/agent_flow.rs +199 -71
  11. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-cli/src/lib.rs +538 -159
  12. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-cli/tests/agent_flow_e2e.rs +18 -3
  13. flowproof-0.6.0/crates/flowproof-cli/tests/api_pipeline.rs +883 -0
  14. flowproof-0.6.0/crates/flowproof-cli/tests/audit_record_e2e.rs +218 -0
  15. flowproof-0.6.0/crates/flowproof-cli/tests/cookie_e2e.rs +176 -0
  16. flowproof-0.6.0/crates/flowproof-cli/tests/iframe_e2e.rs +158 -0
  17. flowproof-0.6.0/crates/flowproof-cli/tests/page_title_e2e.rs +117 -0
  18. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-cli/tests/suite_flow_isolation.rs +11 -1
  19. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-cli/tests/web_e2e.rs +945 -20
  20. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-driver/src/app.rs +370 -0
  21. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-driver/src/lib.rs +8 -6
  22. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-driver/src/mock.rs +22 -0
  23. flowproof-0.6.0/crates/flowproof-driver/src/oob.rs +744 -0
  24. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-replay/src/lib.rs +594 -14
  25. flowproof-0.6.0/crates/flowproof-replay/src/runrecord.rs +643 -0
  26. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-replay/tests/replay_calc.rs +3 -1
  27. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-trace/schema/trace-v1.schema.json +55 -0
  28. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-trace/src/format.rs +47 -0
  29. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-trace/src/lib.rs +1 -0
  30. flowproof-0.6.0/crates/flowproof-trace/src/secret_scan.rs +190 -0
  31. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-trace/src/toolcalls.rs +7 -2
  32. {flowproof-0.4.1 → flowproof-0.6.0}/flowproof/__init__.py +1 -1
  33. {flowproof-0.4.1 → flowproof-0.6.0}/pyproject.toml +1 -1
  34. flowproof-0.4.1/crates/flowproof-cli/tests/api_pipeline.rs +0 -252
  35. flowproof-0.4.1/crates/flowproof-driver/src/oob.rs +0 -237
  36. {flowproof-0.4.1 → flowproof-0.6.0}/README.md +0 -0
  37. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-adapters/Cargo.toml +0 -0
  38. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-adapters/src/agent_runner.rs +0 -0
  39. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-adapters/src/egress.rs +0 -0
  40. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-adapters/src/egress_linux.rs +0 -0
  41. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-adapters/src/lib.rs +0 -0
  42. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-adapters/src/mcp_core.rs +0 -0
  43. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-adapters/src/mcp_http.rs +0 -0
  44. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-adapters/src/mcp_stdio.rs +0 -0
  45. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-adapters/src/sap_com.rs +0 -0
  46. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-adapters/src/vision.rs +0 -0
  47. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-agent/Cargo.toml +0 -0
  48. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-agent/src/agent_steps.rs +0 -0
  49. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-agent/src/clarify.rs +0 -0
  50. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-agent/src/heal.rs +0 -0
  51. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-agent/src/lib.rs +0 -0
  52. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-agent/src/llm.rs +0 -0
  53. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-cli/Cargo.toml +0 -0
  54. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-cli/src/capture.rs +0 -0
  55. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-cli/src/main.rs +0 -0
  56. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-cli/tests/calc_e2e.rs +0 -0
  57. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-cli/tests/clock_e2e.rs +0 -0
  58. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-cli/tests/egress_e2e.rs +0 -0
  59. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-cli/tests/examples_resolve.rs +0 -0
  60. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-cli/tests/grid_cell_e2e.rs +0 -0
  61. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-cli/tests/llm_author_e2e.rs +0 -0
  62. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-cli/tests/mcp_stdio_e2e.rs +0 -0
  63. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-cli/tests/notepad_author_e2e.rs +0 -0
  64. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-cli/tests/notepad_e2e.rs +0 -0
  65. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-cli/tests/sap_e2e.rs +0 -0
  66. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-cli/tests/sap_pipeline.rs +0 -0
  67. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-cli/tests/sap_sim_e2e.rs +0 -0
  68. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-cli/tests/scoped_container_e2e.rs +0 -0
  69. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-cli/tests/skip_unless_env.rs +0 -0
  70. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-cli/tests/suite_env_from.rs +0 -0
  71. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-cli/tests/suite_missing_trace.rs +0 -0
  72. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-cli/tests/support/sap_simulator.py +0 -0
  73. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-cli/tests/vision_pipeline.rs +0 -0
  74. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-driver/Cargo.toml +0 -0
  75. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-driver/src/backend.rs +0 -0
  76. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-driver/src/gdi.rs +0 -0
  77. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-driver/src/recording.rs +0 -0
  78. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-driver/src/redact.rs +0 -0
  79. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-driver/src/visual.rs +0 -0
  80. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-driver/src/window.rs +0 -0
  81. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-python/Cargo.toml +0 -0
  82. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-python/src/lib.rs +0 -0
  83. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-replay/Cargo.toml +0 -0
  84. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-replay/src/report.rs +0 -0
  85. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-trace/Cargo.toml +0 -0
  86. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-trace/src/cassette.rs +0 -0
  87. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-trace/src/cassette_diff.rs +0 -0
  88. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-trace/src/egress.rs +0 -0
  89. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-trace/src/secret.rs +0 -0
  90. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-trace/src/substitution.rs +0 -0
  91. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-trace/tests/fixtures/sample.trace.jsonl +0 -0
  92. {flowproof-0.4.1 → flowproof-0.6.0}/crates/flowproof-trace/tests/schema_conformance.rs +0 -0
  93. {flowproof-0.4.1 → flowproof-0.6.0}/flowproof/cli.py +0 -0
  94. {flowproof-0.4.1 → flowproof-0.6.0}/flowproof/flow.py +0 -0
  95. {flowproof-0.4.1 → flowproof-0.6.0}/flowproof/mcp_server.py +0 -0
  96. {flowproof-0.4.1 → flowproof-0.6.0}/flowproof/py.typed +0 -0
@@ -760,7 +760,7 @@ dependencies = [
760
760
 
761
761
  [[package]]
762
762
  name = "flowproof-adapters"
763
- version = "0.4.1"
763
+ version = "0.6.0"
764
764
  dependencies = [
765
765
  "anyhow",
766
766
  "flowproof-driver",
@@ -779,7 +779,7 @@ dependencies = [
779
779
 
780
780
  [[package]]
781
781
  name = "flowproof-agent"
782
- version = "0.4.1"
782
+ version = "0.6.0"
783
783
  dependencies = [
784
784
  "chrono",
785
785
  "flowproof-driver",
@@ -795,7 +795,7 @@ dependencies = [
795
795
 
796
796
  [[package]]
797
797
  name = "flowproof-cli"
798
- version = "0.4.1"
798
+ version = "0.6.0"
799
799
  dependencies = [
800
800
  "ab_glyph",
801
801
  "chrono",
@@ -816,7 +816,7 @@ dependencies = [
816
816
 
817
817
  [[package]]
818
818
  name = "flowproof-driver"
819
- version = "0.4.1"
819
+ version = "0.6.0"
820
820
  dependencies = [
821
821
  "image",
822
822
  "postgres",
@@ -830,7 +830,7 @@ dependencies = [
830
830
 
831
831
  [[package]]
832
832
  name = "flowproof-python"
833
- version = "0.4.1"
833
+ version = "0.6.0"
834
834
  dependencies = [
835
835
  "flowproof-agent",
836
836
  "flowproof-cli",
@@ -842,7 +842,7 @@ dependencies = [
842
842
 
843
843
  [[package]]
844
844
  name = "flowproof-replay"
845
- version = "0.4.1"
845
+ version = "0.6.0"
846
846
  dependencies = [
847
847
  "chrono",
848
848
  "flowproof-agent",
@@ -856,7 +856,7 @@ dependencies = [
856
856
 
857
857
  [[package]]
858
858
  name = "flowproof-trace"
859
- version = "0.4.1"
859
+ version = "0.6.0"
860
860
  dependencies = [
861
861
  "jsonschema",
862
862
  "regex",
@@ -3,7 +3,7 @@ resolver = "2"
3
3
  members = ["crates/flowproof-driver", "crates/flowproof-trace", "crates/flowproof-replay", "crates/flowproof-agent", "crates/flowproof-adapters", "crates/flowproof-cli", "crates/flowproof-python"]
4
4
 
5
5
  [workspace.package]
6
- version = "0.4.1"
6
+ version = "0.6.0"
7
7
  edition = "2021"
8
8
  license = "Apache-2.0"
9
9
  repository = "https://github.com/automators-com/flowproof"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flowproof
3
- Version: 0.4.1
3
+ Version: 0.6.0
4
4
  Classifier: Development Status :: 2 - Pre-Alpha
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: Programming Language :: Python :: 3
@@ -1916,15 +1916,52 @@ mod tests {
1916
1916
 
1917
1917
  /// A local fake model, so record mode can be exercised without a real
1918
1918
  /// API or any tokens - the same bet the SAP simulator makes.
1919
+ /// Read an HTTP/1.1 request to the END of its declared body.
1920
+ ///
1921
+ /// A single `read` is not enough and the difference is not cosmetic: a
1922
+ /// POST body can arrive across several TCP segments, and responding then
1923
+ /// closing with bytes still unread makes the stack RST the client. ureq
1924
+ /// surfaces that reset as a send failure, the proxy turns it into a 502,
1925
+ /// and the test fails an `assert_eq!(status, 200)` that has nothing to
1926
+ /// do with what it meant to prove. It is timing-dependent, so it shows up
1927
+ /// on the Windows runner and almost never locally.
1928
+ ///
1929
+ /// `agent_flow_e2e.rs` already carries this helper for the same reason;
1930
+ /// these in-crate fakes never got it.
1931
+ fn read_http_request(stream: &mut std::net::TcpStream) -> String {
1932
+ use std::io::{BufRead, Read};
1933
+ let mut reader = std::io::BufReader::new(stream);
1934
+ let mut head = String::new();
1935
+ let mut length = 0usize;
1936
+ loop {
1937
+ let mut line = String::new();
1938
+ if reader.read_line(&mut line).unwrap_or(0) == 0 {
1939
+ break;
1940
+ }
1941
+ if let Some(v) = line.to_ascii_lowercase().strip_prefix("content-length:") {
1942
+ length = v.trim().parse().unwrap_or(0);
1943
+ }
1944
+ let done = line == "\r\n" || line == "\n";
1945
+ head.push_str(&line);
1946
+ if done {
1947
+ break;
1948
+ }
1949
+ }
1950
+ let mut body = vec![0u8; length];
1951
+ if length > 0 {
1952
+ let _ = reader.read_exact(&mut body);
1953
+ }
1954
+ head + &String::from_utf8_lossy(&body)
1955
+ }
1956
+
1919
1957
  fn fake_model(reply: serde_json::Value) -> String {
1920
- use std::io::{Read, Write};
1958
+ use std::io::Write;
1921
1959
  let listener = std::net::TcpListener::bind("127.0.0.1:0").expect("bind");
1922
1960
  let port = listener.local_addr().expect("addr").port();
1923
1961
  std::thread::spawn(move || {
1924
1962
  for stream in listener.incoming() {
1925
1963
  let Ok(mut stream) = stream else { continue };
1926
- let mut buf = [0u8; 8192];
1927
- let _ = stream.read(&mut buf);
1964
+ let _ = read_http_request(&mut stream);
1928
1965
  let body = reply.to_string();
1929
1966
  let _ = stream.write_all(
1930
1967
  format!(
@@ -2004,9 +2041,10 @@ mod tests {
2004
2041
  std::thread::spawn(move || {
2005
2042
  if let Some(stream) = listener.incoming().next() {
2006
2043
  let mut stream = stream.expect("accept");
2007
- let mut buf = vec![0u8; 8192];
2008
- let n = std::io::Read::read(&mut stream, &mut buf).unwrap_or(0);
2009
- let req = String::from_utf8_lossy(&buf[..n]).to_string();
2044
+ // Drained in full for the reset reason above, and because
2045
+ // this fake READS the request: a header split across
2046
+ // segments would otherwise read as "(none)".
2047
+ let req = read_http_request(&mut stream);
2010
2048
  let seen = req
2011
2049
  .lines()
2012
2050
  .find(|l| l.to_ascii_lowercase().starts_with("authorization:"))