Hosts
Pulse-laptop V3 A2A upgrade guide
Pulse-laptop V3 A2A upgrade guide
Why
Pulse agents (eva/eve/tam) use V2-style A2A (POST / with message/send). LAB agents use V3 (GET /.well-known/agent-card.json + message/send + tasks/get). Full interoperability requires V3 serve.py on pulse-laptop.
Prerequisites
- Pulse-laptop has opencode v2.0.27 at
/home/lab/.opencode/bin/opencode(confirmed) - Reverse tunnels 18441-18443 already forward A2A ports to LAB
- Python 3.12+ available
Step 1: Install Python deps on pulse-laptop
pip install --break-system-packages a2a-sdk starlette protobuf sse-starlette uvicorn
Step 2: Copy V3 code to pulse-laptop
From LAB, the files are at /home/lab/.solos/. Copy these to pulse-laptop's .solos/:
operation/runtime/a2a_server.py
operation/runtime/serve.py
operation/runtime/wire_route.py
operation/runtime/run_a2a.sh
operation/runtime/seam.py (from core/protocol/)
operation/runtime/wire.py (from core/protocol/)
operation/runtime/readout.py (from core/harness/)
operation/runtime/paths.py (from core/)
cortex/registry/agents.yaml
cortex/registry/__init__.py
core/protocol/card.py
Step 3: Create systemd units for eva/eve/tam
# On pulse-laptop
for agent in eva eve tam; do
case $agent in
eva) port=8441 ;;
eve) port=8442 ;;
tam) port=8443 ;;
esac
cat > ~/.config/systemd/user/solos-v3-a2a-${agent}.service <<EOF
[Unit]
Description=SolOS V3 A2A listener — $agent (:$port)
After=network.target
Wants=network.target
[Service]
Type=simple
WorkingDirectory=/home/lab/.solos
Environment=SOLOS_V3_HOME=/home/lab/.solos
Environment=PYTHONPATH=/home/lab/.solos
Environment=PYTHONUNBUFFERED=1
ExecStart=/home/lab/.solos/operation/runtime/run_a2a.sh $agent $port
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=default.target
EOF
systemctl --user daemon-reload
systemctl --user enable solos-v3-a2a-${agent}.service
systemctl --user start solos-v3-a2a-${agent}.service
done
Step 4: Verify
# On pulse-laptop
for p in 8441 8442 8443; do
curl -s http://127.0.0.1:$p/.well-known/agent-card.json | python3 -c "import sys,json; print(json.load(sys.stdin)['name'])"
done
Step 5: Verify from LAB
# On LAB (via reverse tunnel)
for p in 18441 18442 18443; do
curl -s http://127.0.0.1:$p/.well-known/agent-card.json | python3 -c "import sys,json; print(json.load(sys.stdin)['name'])"
done
Notes
- The reverse tunnels (18441-18443) already forward these ports to LAB
- No SSH access needed from LAB — Tam runs this on pulse-laptop directly
- The V3 code is identical to what runs on LAB and prod
- The
run_a2a.shwrapper is needed because the python path contains****

