sbxloop 0.5.0__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.
- {sbxloop-0.5.0 → sbxloop-0.5.1}/PKG-INFO +1 -1
- sbxloop-0.5.0/src/sbxloop/_vendor/sbxloop_worker-0.5.0-py3-none-any.whl → sbxloop-0.5.1/src/sbxloop/_vendor/sbxloop_worker-0.5.1-py3-none-any.whl +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/_version.py +2 -2
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/sbx/cli.py +26 -4
- {sbxloop-0.5.0 → sbxloop-0.5.1}/.gitignore +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/README.md +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/hatch_build.py +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/pyproject.toml +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/__init__.py +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/cli/__init__.py +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/cli/app.py +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/cli/doctor.py +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/cli/tui.py +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/config.py +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/deliver.py +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/engine/__init__.py +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/engine/engine.py +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/engine/model.py +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/engine/phases.py +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/engine/prompts/__init__.py +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/engine/prompts/decompose.md +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/engine/prompts/execute.md +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/engine/prompts/plan.md +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/engine/prompts/scrutinize.md +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/engine/prompts/validate.md +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/engine/store.py +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/errors.py +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/events.py +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/gh/__init__.py +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/gh/ops.py +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/gh/reporter.py +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/ids.py +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/py.typed +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/sbx/__init__.py +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/sbx/models.py +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/sbx/pair.py +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/sbx/parse.py +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/sbx/provision.py +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/sbx/sandbox.py +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/worker/__init__.py +0 -0
- {sbxloop-0.5.0 → sbxloop-0.5.1}/src/sbxloop/worker/client.py +0 -0
- {sbxloop-0.5.0 → 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.5.
|
|
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
|
|
Binary file
|
|
@@ -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.5.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 5,
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|