sbxloop 0.6.2__tar.gz → 0.6.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.
- {sbxloop-0.6.2 → sbxloop-0.6.4}/PKG-INFO +1 -1
- sbxloop-0.6.2/src/sbxloop/_vendor/sbxloop_worker-0.6.2-py3-none-any.whl → sbxloop-0.6.4/src/sbxloop/_vendor/sbxloop_worker-0.6.4-py3-none-any.whl +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/_version.py +2 -2
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/cli/app.py +16 -2
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/config.py +6 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/daemon/discord.py +353 -170
- sbxloop-0.6.4/src/sbxloop/daemon/discord_format.py +752 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/daemon/loop.py +11 -4
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/daemon/store.py +91 -44
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/sbx/cli.py +18 -3
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/sbx/pair.py +18 -2
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/sbx/prune.py +29 -1
- {sbxloop-0.6.2 → sbxloop-0.6.4}/.gitignore +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/README.md +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/hatch_build.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/pyproject.toml +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/__init__.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/cli/__init__.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/cli/doctor.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/cli/models.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/cli/tui.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/daemon/__init__.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/daemon/backlog.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/daemon/github.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/daemon/model.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/daemon/sources.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/deliver.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/engine/__init__.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/engine/engine.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/engine/model.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/engine/phases.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/engine/prompts/__init__.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/engine/prompts/decompose.md +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/engine/prompts/execute.md +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/engine/prompts/plan.md +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/engine/prompts/scrutinize.md +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/engine/prompts/steer.md +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/engine/prompts/validate.md +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/engine/store.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/errors.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/events.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/gh/__init__.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/gh/ops.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/gh/reporter.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/hostgit.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/ids.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/policy.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/py.typed +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/sbx/__init__.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/sbx/bake.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/sbx/conformance.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/sbx/models.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/sbx/parse.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/sbx/provision.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/sbx/sandbox.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/sbx/secretstate.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/toolchains.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/verifylint.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/worker/__init__.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/worker/client.py +0 -0
- {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/worker/wheel.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: sbxloop
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.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
|
|
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.6.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 6,
|
|
21
|
+
__version__ = version = '0.6.4'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 6, 4)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|
|
@@ -42,7 +42,12 @@ from sbxloop.sbx.cli import SbxCLI
|
|
|
42
42
|
from sbxloop.sbx.models import SandboxRole
|
|
43
43
|
from sbxloop.sbx.pair import cleanup_registry
|
|
44
44
|
from sbxloop.sbx.provision import sandbox_name
|
|
45
|
-
from sbxloop.sbx.prune import
|
|
45
|
+
from sbxloop.sbx.prune import (
|
|
46
|
+
classify_sandboxes,
|
|
47
|
+
format_age,
|
|
48
|
+
remove_run_sandbox,
|
|
49
|
+
remove_sandbox,
|
|
50
|
+
)
|
|
46
51
|
from sbxloop.sbx.secretstate import (
|
|
47
52
|
COPILOT_TOKEN_ENV,
|
|
48
53
|
SANDBOX_SCOPE_PREFIX,
|
|
@@ -1084,7 +1089,13 @@ def sandbox_prune(
|
|
|
1084
1089
|
failures = 0
|
|
1085
1090
|
for v in orphans:
|
|
1086
1091
|
try:
|
|
1087
|
-
|
|
1092
|
+
if v.role in ("agent", "github"):
|
|
1093
|
+
# A pruned run sandbox takes its secret registrations with
|
|
1094
|
+
# it; otherwise a later run under the same name (resume)
|
|
1095
|
+
# cannot replace them and comes up with the proxy sentinel.
|
|
1096
|
+
remove_run_sandbox(cli, v.name, v.role) # type: ignore[arg-type]
|
|
1097
|
+
else:
|
|
1098
|
+
remove_sandbox(cli, v.name)
|
|
1088
1099
|
except SbxloopError as exc:
|
|
1089
1100
|
failures += 1
|
|
1090
1101
|
console.print(f"[yellow]skip {v.name}:[/] {exc}")
|
|
@@ -1637,6 +1648,9 @@ mem_warn = 90.0
|
|
|
1637
1648
|
# thread_per_run = true
|
|
1638
1649
|
# chronology_level = "normal" # quiet | normal | verbose
|
|
1639
1650
|
# max_message_chars = 1900
|
|
1651
|
+
# embeds = true # headline / finished / status as embed cards
|
|
1652
|
+
# status_line = true # one per-run message edited as tasks progress
|
|
1653
|
+
# tool_batch_lines = 8 # consecutive tool calls per code block
|
|
1640
1654
|
"""
|
|
1641
1655
|
|
|
1642
1656
|
|
|
@@ -365,6 +365,12 @@ class DiscordConfig(_ConfigModel):
|
|
|
365
365
|
chronology_level: ChronologyLevel = "normal"
|
|
366
366
|
# Discord's hard cap is 2000; leave headroom for wrappers.
|
|
367
367
|
max_message_chars: int = Field(default=1900, ge=200, le=2000)
|
|
368
|
+
# Rich output: embed cards for the run headline, finished report and
|
|
369
|
+
# `!sbx status`; a per-run status message edited in place as tasks
|
|
370
|
+
# progress; consecutive tool calls batched into one code block.
|
|
371
|
+
embeds: bool = True
|
|
372
|
+
status_line: bool = True
|
|
373
|
+
tool_batch_lines: int = Field(default=8, ge=1, le=40)
|
|
368
374
|
|
|
369
375
|
@property
|
|
370
376
|
def enabled(self) -> bool:
|