sbxloop 0.4.6__tar.gz → 0.5.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. {sbxloop-0.4.6 → sbxloop-0.5.1}/PKG-INFO +1 -1
  2. sbxloop-0.4.6/src/sbxloop/_vendor/sbxloop_worker-0.4.6-py3-none-any.whl → sbxloop-0.5.1/src/sbxloop/_vendor/sbxloop_worker-0.5.1-py3-none-any.whl +0 -0
  3. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/_version.py +2 -2
  4. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/sbx/cli.py +26 -4
  5. {sbxloop-0.4.6 → sbxloop-0.5.1}/.gitignore +0 -0
  6. {sbxloop-0.4.6 → sbxloop-0.5.1}/README.md +0 -0
  7. {sbxloop-0.4.6 → sbxloop-0.5.1}/hatch_build.py +0 -0
  8. {sbxloop-0.4.6 → sbxloop-0.5.1}/pyproject.toml +0 -0
  9. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/__init__.py +0 -0
  10. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/cli/__init__.py +0 -0
  11. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/cli/app.py +0 -0
  12. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/cli/doctor.py +0 -0
  13. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/cli/tui.py +0 -0
  14. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/config.py +0 -0
  15. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/deliver.py +0 -0
  16. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/engine/__init__.py +0 -0
  17. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/engine/engine.py +0 -0
  18. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/engine/model.py +0 -0
  19. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/engine/phases.py +0 -0
  20. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/engine/prompts/__init__.py +0 -0
  21. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/engine/prompts/decompose.md +0 -0
  22. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/engine/prompts/execute.md +0 -0
  23. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/engine/prompts/plan.md +0 -0
  24. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/engine/prompts/scrutinize.md +0 -0
  25. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/engine/prompts/validate.md +0 -0
  26. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/engine/store.py +0 -0
  27. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/errors.py +0 -0
  28. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/events.py +0 -0
  29. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/gh/__init__.py +0 -0
  30. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/gh/ops.py +0 -0
  31. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/gh/reporter.py +0 -0
  32. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/ids.py +0 -0
  33. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/py.typed +0 -0
  34. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/sbx/__init__.py +0 -0
  35. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/sbx/models.py +0 -0
  36. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/sbx/pair.py +0 -0
  37. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/sbx/parse.py +0 -0
  38. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/sbx/provision.py +0 -0
  39. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/sbx/sandbox.py +0 -0
  40. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/worker/__init__.py +0 -0
  41. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/worker/client.py +0 -0
  42. {sbxloop-0.4.6 → sbxloop-0.5.1}/src/sbxloop/worker/wheel.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sbxloop
3
- Version: 0.4.6
3
+ Version: 0.5.1
4
4
  Summary: Agentic loop orchestration on Docker Sandboxes (sbx) with isolated credential domains
5
5
  Project-URL: Homepage, https://github.com/brettbergin/sbxloop
6
6
  Project-URL: Repository, https://github.com/brettbergin/sbxloop
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.4.6'
22
- __version_tuple__ = version_tuple = (0, 4, 6)
21
+ __version__ = version = '0.5.1'
22
+ __version_tuple__ = version_tuple = (0, 5, 1)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -17,6 +17,24 @@ from sbxloop.sbx.parse import parse_ls, parse_version
17
17
 
18
18
  _NOT_FOUND_MARKERS = ("not found", "no such sandbox", "does not exist", "unknown sandbox")
19
19
 
20
+ # Flags whose values are secrets. ExecResult/SbxError carry argv into error
21
+ # messages, logs, and events — secret values must never travel with them.
22
+ _SECRET_FLAGS = frozenset({"--value"})
23
+ _REDACTED = "***"
24
+
25
+
26
+ def redacted_argv(argv: Sequence[str]) -> list[str]:
27
+ """A copy of argv safe to embed in errors/logs: secret flag values masked."""
28
+ safe = list(argv)
29
+ for i, arg in enumerate(safe):
30
+ if arg in _SECRET_FLAGS and i + 1 < len(safe):
31
+ safe[i + 1] = _REDACTED
32
+ else:
33
+ flag = arg.split("=", 1)[0]
34
+ if "=" in arg and flag in _SECRET_FLAGS:
35
+ safe[i] = f"{flag}={_REDACTED}"
36
+ return safe
37
+
20
38
 
21
39
  class SbxCLI:
22
40
  """Blocking, typed access to the sbx CLI."""
@@ -45,6 +63,10 @@ class SbxCLI:
45
63
  stdin: str | None = None,
46
64
  ) -> ExecResult:
47
65
  argv = self.argv(*args)
66
+ # The real argv reaches the subprocess only; everything observable
67
+ # (ExecResult, exceptions, and therefore logs/events) gets the
68
+ # redacted copy so secret values can never leak through error text.
69
+ safe_argv = redacted_argv(argv)
48
70
  started = time.monotonic()
49
71
  try:
50
72
  proc = subprocess.run(
@@ -59,17 +81,17 @@ class SbxCLI:
59
81
  raise SbxNotFoundError(
60
82
  f"sbx binary {self.binary!r} not found on PATH — install Docker Sandboxes "
61
83
  "(https://docs.docker.com/ai/sandboxes/) and run `sbx login`",
62
- argv=argv,
84
+ argv=safe_argv,
63
85
  ) from exc
64
86
  except subprocess.TimeoutExpired as exc:
65
87
  raise SbxError(
66
88
  f"sbx invocation timed out after {timeout or self.default_timeout:.0f}s",
67
- argv=argv,
89
+ argv=safe_argv,
68
90
  stderr=(exc.stderr or b"").decode() if isinstance(exc.stderr, bytes) else "",
69
91
  ) from exc
70
92
 
71
93
  result = ExecResult(
72
- argv=argv,
94
+ argv=safe_argv,
73
95
  returncode=proc.returncode,
74
96
  stdout=proc.stdout,
75
97
  stderr=proc.stderr,
@@ -93,7 +115,7 @@ class SbxCLI:
93
115
  except FileNotFoundError as exc:
94
116
  raise SbxNotFoundError(
95
117
  f"sbx binary {self.binary!r} not found on PATH",
96
- argv=argv,
118
+ argv=redacted_argv(argv),
97
119
  ) from exc
98
120
 
99
121
  def _error_for(self, result: ExecResult) -> SbxError:
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes