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.
Files changed (61) hide show
  1. {sbxloop-0.6.2 → sbxloop-0.6.4}/PKG-INFO +1 -1
  2. 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
  3. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/_version.py +2 -2
  4. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/cli/app.py +16 -2
  5. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/config.py +6 -0
  6. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/daemon/discord.py +353 -170
  7. sbxloop-0.6.4/src/sbxloop/daemon/discord_format.py +752 -0
  8. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/daemon/loop.py +11 -4
  9. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/daemon/store.py +91 -44
  10. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/sbx/cli.py +18 -3
  11. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/sbx/pair.py +18 -2
  12. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/sbx/prune.py +29 -1
  13. {sbxloop-0.6.2 → sbxloop-0.6.4}/.gitignore +0 -0
  14. {sbxloop-0.6.2 → sbxloop-0.6.4}/README.md +0 -0
  15. {sbxloop-0.6.2 → sbxloop-0.6.4}/hatch_build.py +0 -0
  16. {sbxloop-0.6.2 → sbxloop-0.6.4}/pyproject.toml +0 -0
  17. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/__init__.py +0 -0
  18. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/cli/__init__.py +0 -0
  19. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/cli/doctor.py +0 -0
  20. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/cli/models.py +0 -0
  21. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/cli/tui.py +0 -0
  22. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/daemon/__init__.py +0 -0
  23. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/daemon/backlog.py +0 -0
  24. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/daemon/github.py +0 -0
  25. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/daemon/model.py +0 -0
  26. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/daemon/sources.py +0 -0
  27. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/deliver.py +0 -0
  28. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/engine/__init__.py +0 -0
  29. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/engine/engine.py +0 -0
  30. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/engine/model.py +0 -0
  31. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/engine/phases.py +0 -0
  32. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/engine/prompts/__init__.py +0 -0
  33. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/engine/prompts/decompose.md +0 -0
  34. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/engine/prompts/execute.md +0 -0
  35. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/engine/prompts/plan.md +0 -0
  36. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/engine/prompts/scrutinize.md +0 -0
  37. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/engine/prompts/steer.md +0 -0
  38. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/engine/prompts/validate.md +0 -0
  39. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/engine/store.py +0 -0
  40. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/errors.py +0 -0
  41. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/events.py +0 -0
  42. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/gh/__init__.py +0 -0
  43. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/gh/ops.py +0 -0
  44. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/gh/reporter.py +0 -0
  45. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/hostgit.py +0 -0
  46. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/ids.py +0 -0
  47. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/policy.py +0 -0
  48. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/py.typed +0 -0
  49. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/sbx/__init__.py +0 -0
  50. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/sbx/bake.py +0 -0
  51. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/sbx/conformance.py +0 -0
  52. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/sbx/models.py +0 -0
  53. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/sbx/parse.py +0 -0
  54. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/sbx/provision.py +0 -0
  55. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/sbx/sandbox.py +0 -0
  56. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/sbx/secretstate.py +0 -0
  57. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/toolchains.py +0 -0
  58. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/verifylint.py +0 -0
  59. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/worker/__init__.py +0 -0
  60. {sbxloop-0.6.2 → sbxloop-0.6.4}/src/sbxloop/worker/client.py +0 -0
  61. {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.2
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
@@ -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.2'
22
- __version_tuple__ = version_tuple = (0, 6, 2)
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 classify_sandboxes, format_age, remove_sandbox
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
- remove_sandbox(cli, v.name)
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: