fix(lxc102): sbt nu mai lansează agent implicit + fix warning docker hub lock
- fără agent implicit: ambele pane-uri sunt shell în sandbox, agentul se pornește manual; argumentul 3 rămâne pentru lansare explicită - al doilea pane intră în sandbox cu 4s întârziere (SBT_PANE_DELAY): două `sbx exec` simultane se calcă pe lock-ul de refresh Docker Hub și scot "could not acquire docker hub refresh lock" Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -82,17 +82,19 @@ Trei scripturi în `/home/work/.local/bin/`, copii versionate în `scripts/` din
|
|||||||
|
|
||||||
### `sbt` — tmux + sandbox + agent
|
### `sbt` — tmux + sandbox + agent
|
||||||
|
|
||||||
|
**Nu lansează niciun agent** — deschide shell-uri în sandbox, agentul îl pornești manual
|
||||||
|
(`claude`, `opencode`, `jcode`…).
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sbt # sesiune 1, /home/workspace, claude în pane-ul stâng
|
sbt # sesiune 1, shell în /home/workspace
|
||||||
sbt 2 proiect-a # sesiune 2, /home/workspace/proiect-a
|
sbt 2 proiect-a # sesiune 2, shell în /home/workspace/proiect-a
|
||||||
sbt 1 proiect-a opencode # alt agent (orice binar din sandbox: opencode, jcode…)
|
sbt 1 proiect-a opencode # opțional: lansează explicit un agent în pane-ul stâng
|
||||||
sbt 1 proiect-a shell # doar shell, fără agent
|
|
||||||
sbt list | sbt kill 2 | sbt detach 2
|
sbt list | sbt kill 2 | sbt detach 2
|
||||||
```
|
```
|
||||||
|
|
||||||
Sesiunile se numesc `sbx1`, `sbx2`, `sbx3`. Layout: 2 pane-uri pe orizontală — stânga cu
|
Sesiunile se numesc `sbx1`, `sbx2`, `sbx3`. Layout: 2 pane-uri pe orizontală, ambele shell în
|
||||||
agentul, dreapta shell. Când agentul se oprește, pane-ul rămâne cu un shell în sandbox
|
sandbox, în directorul proiectului. Dacă ceri explicit un agent (argumentul 3), acesta rulează
|
||||||
(`exec bash -l`), deci sesiunea nu moare.
|
în pane-ul stâng și, la ieșire, pane-ul rămâne cu un shell (`exec bash -l`) — sesiunea nu moare.
|
||||||
|
|
||||||
**tmux rulează pe host (LXC 102), nu în sandbox** — în imaginea sandbox-ului nu există tmux
|
**tmux rulează pe host (LXC 102), nu în sandbox** — în imaginea sandbox-ului nu există tmux
|
||||||
(și nici `git`). Fiecare pane e un `sbx exec -it -w <dir> <sandbox> bash -l`. Consecința utilă:
|
(și nici `git`). Fiecare pane e un `sbx exec -it -w <dir> <sandbox> bash -l`. Consecința utilă:
|
||||||
@@ -101,6 +103,20 @@ deci sandbox-ul e pornit chiar dacă nu era.
|
|||||||
|
|
||||||
Prefixul tmux e `Ctrl+A` (cu `Ctrl+B` ca secundar) — vezi `/home/work/.tmux.conf`.
|
Prefixul tmux e `Ctrl+A` (cu `Ctrl+B` ca secundar) — vezi `/home/work/.tmux.conf`.
|
||||||
|
|
||||||
|
**`WARN: could not acquire docker hub refresh lock … context deadline exceeded`** — apare când
|
||||||
|
două procese `sbx exec` pornesc simultan (cele două pane-uri) și se calcă pe lock-ul de refresh
|
||||||
|
al credențialelor Docker Hub. E inofensiv (`proceeding without cross-process lock`), dar zgomotos.
|
||||||
|
Reprodus determinist:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
for i in 1 2 3; do sbx exec claude-workspace true & done; wait # 3 warning-uri
|
||||||
|
sbx exec claude-workspace true # curat
|
||||||
|
```
|
||||||
|
|
||||||
|
De aceea `sbt` pornește al doilea pane cu 4 secunde întârziere (`SBT_PANE_DELAY`) — la ≥4s
|
||||||
|
lock-ul e liber și warning-ul dispare. Atașarea nu e întârziată, doar intrarea în sandbox a
|
||||||
|
pane-ului din dreapta.
|
||||||
|
|
||||||
### Statusline Claude Code în sandbox
|
### Statusline Claude Code în sandbox
|
||||||
|
|
||||||
Același statusline ca pe LXC 171 (model, context, cote 5h / weekly / sonnet din API-ul OAuth
|
Același statusline ca pe LXC 171 (model, context, cote 5h / weekly / sonnet din API-ul OAuth
|
||||||
|
|||||||
@@ -5,15 +5,16 @@
|
|||||||
# prin `sbx exec -it`. În sandbox nu există tmux, deci sesiunea supraviețuiește
|
# prin `sbx exec -it`. În sandbox nu există tmux, deci sesiunea supraviețuiește
|
||||||
# oricărei reporniri a agentului.
|
# oricărei reporniri a agentului.
|
||||||
#
|
#
|
||||||
# sbt sesiune 1, /home/workspace, claude în pane-ul stâng
|
# NU lansează niciun agent — deschide shell-uri în sandbox, agentul îl pornești tu.
|
||||||
# sbt 2 proiect-a sesiune 2, /home/workspace/proiect-a
|
#
|
||||||
# sbt 1 proiect-a opencode lansează opencode
|
# sbt sesiune 1, shell în /home/workspace
|
||||||
# sbt 1 proiect-a shell doar shell în sandbox, fără agent
|
# sbt 2 proiect-a sesiune 2, shell în /home/workspace/proiect-a
|
||||||
|
# sbt 1 proiect-a opencode opțional: lansează explicit un agent în pane-ul stâng
|
||||||
# sbt list listează sesiunile tmux
|
# sbt list listează sesiunile tmux
|
||||||
# sbt kill [N] omoară sesiunea N
|
# sbt kill [N] omoară sesiunea N
|
||||||
# sbt detach [N] detașează clienții de la sesiunea N
|
# sbt detach [N] detașează clienții de la sesiunea N
|
||||||
#
|
#
|
||||||
# Variabile: SANDBOX (implicit claude-workspace)
|
# Variabile: SANDBOX (implicit claude-workspace), SBT_PANE_DELAY (implicit 4s)
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
SANDBOX="${SANDBOX:-claude-workspace}"
|
SANDBOX="${SANDBOX:-claude-workspace}"
|
||||||
@@ -33,7 +34,7 @@ session_name() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# ---- Parsare argumente ----
|
# ---- Parsare argumente ----
|
||||||
ACTION="start"; NUM="1"; PROJ=""; AGENT="claude"
|
ACTION="start"; NUM="1"; PROJ=""; AGENT="shell"
|
||||||
|
|
||||||
case "${1:-}" in
|
case "${1:-}" in
|
||||||
list)
|
list)
|
||||||
@@ -47,7 +48,7 @@ case "${1:-}" in
|
|||||||
usage
|
usage
|
||||||
;;
|
;;
|
||||||
1|2|3)
|
1|2|3)
|
||||||
NUM="$1"; PROJ="${2:-}"; AGENT="${3:-claude}"
|
NUM="$1"; PROJ="${2:-}"; AGENT="${3:-shell}"
|
||||||
;;
|
;;
|
||||||
"")
|
"")
|
||||||
: # implicite
|
: # implicite
|
||||||
@@ -117,6 +118,11 @@ echo "Sesiune nouă: $SESSION (sandbox=$SANDBOX dir=$DIR agent=${AGENT:-shell
|
|||||||
|
|
||||||
tmux new-session -d -s "$SESSION" -c "$ROOT" "$(sandbox_pane "$INNER")"
|
tmux new-session -d -s "$SESSION" -c "$ROOT" "$(sandbox_pane "$INNER")"
|
||||||
tmux set-option -t "$SESSION" -g mouse on
|
tmux set-option -t "$SESSION" -g mouse on
|
||||||
tmux split-window -h -t "$SESSION:0" -c "$ROOT" "$(sandbox_pane "")"
|
|
||||||
|
# Al doilea pane intră în sandbox cu întârziere: două `sbx exec` pornite simultan
|
||||||
|
# se calcă pe lock-ul de refresh Docker Hub al lui sbx și scot
|
||||||
|
# „could not acquire docker hub refresh lock". Warning inofensiv, dar zgomotos.
|
||||||
|
tmux split-window -h -t "$SESSION:0" -c "$ROOT" \
|
||||||
|
"sh -c $(printf '%q' "sleep ${SBT_PANE_DELAY:-4}; exec $(sandbox_pane "")")"
|
||||||
tmux select-pane -t "$SESSION:0.0"
|
tmux select-pane -t "$SESSION:0.0"
|
||||||
exec tmux attach-session -t "$SESSION"
|
exec tmux attach-session -t "$SESSION"
|
||||||
|
|||||||
Reference in New Issue
Block a user