omo 中明确写到支持 tmux 集成,即会在启动多个子 agent 的时候自动在 tmux 中新开几个 pane,这样的好处是能让用户直观地看见后台任务是否已经完成。

但是一般启动情况下,tmux 的新 pane 会一片空白,没有任何内容。很多证据表明,是 omo 在 attach 的时候没有获取到 opencode 使用的端口导致传递出错,解决办法是启动 opencode 的时候显式指明使用的端口:

opencode --port xxxx

然而这种启动方式比较麻烦,尤其是在多开 opencode 的情况下,因此我在终端配置中编辑了如下两个函数:

oc() {
  local port=""
 
  if [[ "${1:-}" == <-> ]]; then
    port="$1"
    shift
  else
    port="$({
      python3 - <<'PY'
import socket
 
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
    sock.bind(("127.0.0.1", 0))
    print(sock.getsockname()[1])
PY
    })" || return 1
  fi
 
  if [[ -z "$port" ]]; then
    printf 'Failed to choose a port\n' >&2
    return 1
  fi
 
  printf '[oc] starting opencode on port %s\n' "$port" >&2
  OPENCODE_PORT="$port" command opencode --port "$port" "$@"
}
 
ocp() {
  if command -v lsof >/dev/null 2>&1; then
    lsof -nP -iTCP -sTCP:LISTEN | awk 'NR==1 || /opencode/'
  else
    ss -ltnp | awk 'NR==1 || /opencode/'
  fi
}

输入 oc 自动启动一个指定端口的 opencode,输入 ocp 查看当前运行的所有指定端口的 opencode 实例。