sbxloop 0.4.2__tar.gz → 0.4.4__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.2 → sbxloop-0.4.4}/PKG-INFO +3 -4
  2. {sbxloop-0.4.2 → sbxloop-0.4.4}/pyproject.toml +2 -3
  3. sbxloop-0.4.2/src/sbxloop/_vendor/sbxloop_worker-0.4.2-py3-none-any.whl → sbxloop-0.4.4/src/sbxloop/_vendor/sbxloop_worker-0.4.4-py3-none-any.whl +0 -0
  4. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/_version.py +2 -2
  5. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/engine/engine.py +3 -1
  6. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/worker/client.py +38 -0
  7. {sbxloop-0.4.2 → sbxloop-0.4.4}/.gitignore +0 -0
  8. {sbxloop-0.4.2 → sbxloop-0.4.4}/README.md +0 -0
  9. {sbxloop-0.4.2 → sbxloop-0.4.4}/hatch_build.py +0 -0
  10. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/__init__.py +0 -0
  11. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/cli/__init__.py +0 -0
  12. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/cli/app.py +0 -0
  13. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/cli/doctor.py +0 -0
  14. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/cli/tui.py +0 -0
  15. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/config.py +0 -0
  16. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/deliver.py +0 -0
  17. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/engine/__init__.py +0 -0
  18. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/engine/model.py +0 -0
  19. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/engine/phases.py +0 -0
  20. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/engine/prompts/__init__.py +0 -0
  21. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/engine/prompts/decompose.md +0 -0
  22. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/engine/prompts/execute.md +0 -0
  23. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/engine/prompts/plan.md +0 -0
  24. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/engine/prompts/scrutinize.md +0 -0
  25. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/engine/prompts/validate.md +0 -0
  26. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/engine/store.py +0 -0
  27. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/errors.py +0 -0
  28. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/events.py +0 -0
  29. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/gh/__init__.py +0 -0
  30. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/gh/ops.py +0 -0
  31. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/gh/reporter.py +0 -0
  32. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/ids.py +0 -0
  33. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/py.typed +0 -0
  34. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/sbx/__init__.py +0 -0
  35. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/sbx/cli.py +0 -0
  36. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/sbx/models.py +0 -0
  37. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/sbx/pair.py +0 -0
  38. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/sbx/parse.py +0 -0
  39. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/sbx/provision.py +0 -0
  40. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/sbx/sandbox.py +0 -0
  41. {sbxloop-0.4.2 → sbxloop-0.4.4}/src/sbxloop/worker/__init__.py +0 -0
  42. {sbxloop-0.4.2 → sbxloop-0.4.4}/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.2
3
+ Version: 0.4.4
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
@@ -11,11 +11,10 @@ Keywords: agents,copilot,docker,orchestration,sandbox
11
11
  Classifier: Development Status :: 3 - Alpha
12
12
  Classifier: Intended Audience :: Developers
13
13
  Classifier: Programming Language :: Python :: 3
14
- Classifier: Programming Language :: Python :: 3.11
15
- Classifier: Programming Language :: Python :: 3.12
16
14
  Classifier: Programming Language :: Python :: 3.13
15
+ Classifier: Programming Language :: Python :: 3.14
17
16
  Classifier: Typing :: Typed
18
- Requires-Python: >=3.11
17
+ Requires-Python: >=3.13
19
18
  Requires-Dist: pydantic>=2.7
20
19
  Requires-Dist: python-dotenv>=1.0
21
20
  Requires-Dist: rich>=13.7
@@ -3,7 +3,7 @@ name = "sbxloop"
3
3
  dynamic = ["version"] # derived from git tags by hatch-vcs (see [tool.hatch.version])
4
4
  description = "Agentic loop orchestration on Docker Sandboxes (sbx) with isolated credential domains"
5
5
  readme = "README.md"
6
- requires-python = ">=3.11"
6
+ requires-python = ">=3.13"
7
7
  license = "MIT"
8
8
  authors = [{ name = "Brett Bergin" }]
9
9
  keywords = ["agents", "sandbox", "docker", "copilot", "orchestration"]
@@ -11,9 +11,8 @@ classifiers = [
11
11
  "Development Status :: 3 - Alpha",
12
12
  "Intended Audience :: Developers",
13
13
  "Programming Language :: Python :: 3",
14
- "Programming Language :: Python :: 3.11",
15
- "Programming Language :: Python :: 3.12",
16
14
  "Programming Language :: Python :: 3.13",
15
+ "Programming Language :: Python :: 3.14",
17
16
  "Typing :: Typed",
18
17
  ]
19
18
  dependencies = [
@@ -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.2'
22
- __version_tuple__ = version_tuple = (0, 4, 2)
21
+ __version__ = version = '0.4.4'
22
+ __version_tuple__ = version_tuple = (0, 4, 4)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -134,7 +134,9 @@ class LoopEngine:
134
134
  else None
135
135
  )
136
136
  if self.install_workers:
137
- agent.install(extras="copilot")
137
+ # ensure_dev_tools: the agent builds projects in this VM
138
+ # (venvs, pip) — the github sandbox only runs API ops.
139
+ agent.install(extras="copilot", ensure_dev_tools=True)
138
140
  if github is not None:
139
141
  github.install(extras="")
140
142
  detach = self._attach_reporter(github, run_id)
@@ -79,6 +79,7 @@ class WorkerClient:
79
79
  timeout: float = 600.0,
80
80
  no_deps: bool = False,
81
81
  system_site_packages: bool = False,
82
+ ensure_dev_tools: bool = False,
82
83
  ) -> None:
83
84
  """Install sbxloop-worker into the sandbox, venv-first with fallbacks.
84
85
 
@@ -98,7 +99,13 @@ class WorkerClient:
98
99
  ``no_deps``/``system_site_packages`` are test seams for hermetic
99
100
  installs; production uses full dependency resolution (PyPI is
100
101
  reachable under the balanced network policy).
102
+
103
+ ``ensure_dev_tools`` additionally makes the sandbox dev-ready for
104
+ the AGENT's own work (see _ensure_dev_tools) — the engine sets it
105
+ for the agent sandbox only.
101
106
  """
107
+ if ensure_dev_tools:
108
+ self._ensure_dev_tools(timeout)
102
109
  wheel = wheel if wheel is not None else resolve_worker_wheel()
103
110
  if wheel is not None:
104
111
  staged = f"{STAGED_WHEEL_DIR}/{wheel.name}"
@@ -153,6 +160,37 @@ class WorkerClient:
153
160
  f"(rc={smoke.returncode}, expected 64): {_output_tail(smoke)}"
154
161
  )
155
162
 
163
+ def _ensure_dev_tools(self, timeout: float) -> None:
164
+ """Best-effort: make the sandbox dev-ready for the agent's own work.
165
+
166
+ Field failure (0.4.0): templates ship a system python without
167
+ ensurepip. The worker self-heals its OWN venv (the ladder below),
168
+ but when that apt heal silently fails the worker still succeeds via
169
+ the user-site fallback — leaving python3-venv missing, so the
170
+ AGENT's `python3 -m venv` for the project it is building dies with
171
+ "ensurepip is not available" on every revision until the budget
172
+ exhausts. Install the venv/pip packages up front, unconditionally
173
+ (a fast no-op when the template already has them), and WARN loudly
174
+ on failure instead of ignoring it. Never fatal: worker installation
175
+ has its own ladder, and the agent may not need venvs at all.
176
+ """
177
+ result = self.sandbox.exec(
178
+ [
179
+ "sh",
180
+ "-c",
181
+ "sudo -n apt-get update -q && "
182
+ "sudo -n apt-get install -y -q python3-venv python3-pip",
183
+ ],
184
+ timeout=timeout,
185
+ )
186
+ if not result.ok:
187
+ logger.warning(
188
+ "dev-tools ensure failed (rc=%s) — the agent's own venv/pip use "
189
+ "may fail with 'ensurepip is not available': %s",
190
+ result.returncode,
191
+ _output_tail(result),
192
+ )
193
+
156
194
  def _create_venv(self, timeout: float, system_site_packages: bool) -> bool:
157
195
  venv_cmd = ["python3", "-m", "venv"]
158
196
  if system_site_packages:
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