Commit Graph

18 Commits

Author SHA1 Message Date
YeonGyu-Kim e824115a2f Merge pull request #4063 from PeterPonyu/fix/3963-server-url-port-zero
fix(team-mode): surface port-0 fallback and silent layout skip (#3963)
2026-05-21 00:42:20 +09:00
ZeyuFu e25f3ca736 fix(tmux-subagent): drain terminal probe replies during delegated pane startup (#2887)
When oh-my-opencode created a delegated tmux pane, terminal
capability/color probe replies emitted by tmux or the freshly
attaching opencode session could end up in the caller pane's
input buffer instead of being consumed by the delegated pane,
appearing as literal text in the main OpenCode chat (e.g.
"414/21212a2/...").

Root cause: buildSplitArgs in team-layout-tmux/layout.ts called
split-window without the -d (detached/don't-switch-focus) flag.
Without -d, tmux briefly grants focus to the new pane during
creation; the outer terminal then sends DA1/DA2 and OSC color
probe replies into what it believes is the active pane, but the
focus handoff races and those bytes land in the caller pane's
stdin buffer instead.

Fix: add -d to every split-window call in buildSplitArgs, matching
the same flag already used in pane-spawn.ts for inline subagent
panes. This keeps the caller pane focused throughout the delegated
pane lifecycle so probe replies are consumed by the correct target.

Existing tests pass; one new test asserts -d is present on every
split-window call to guard this invariant.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 01:41:25 -04:00
ZeyuFu ced95c4bfa fix(team-mode): surface port-0 fallback and silent layout skip (#3963)
When ctx.serverUrl had a port string of "0", TmuxSessionManager
silently replaced it with the localhost:4096 fallback and
createTeamLayout subsequently skipped pane creation without any
user-visible signal. The two-step silent failure made team_mode
tmux_visualization look broken in default TUI mode.

Surface the failure path:

- TmuxSessionManager now retains ctx.serverUrl on the instance and
  exposes it via getCtxServerUrl(), and emits a structured warning
  log on the port-0 fallback branch naming both the discarded URL
  and the fallback it landed on.
- createTeamLayout's "opencode server not reachable" log is
  upgraded to a structured warning including ctxServerUrl and a
  hint to launch with --port N + OPENCODE_PORT=N.

No behavior change to the fallback resolution itself - only the
silence. Existing port-0 fallback tests still pass; two new tests
assert the warning fires on port 0 and is absent for real ports.
2026-05-16 01:23:25 -04:00
YeonGyu-Kim d8f52aae7f test: run suite without split runner 2026-05-15 16:26:57 +09:00
YeonGyu-Kim ee938aa097 fix full-suite isolation regressions 2026-05-07 18:36:03 +09:00
YeonGyu-Kim b4791c85ca fix(team-mode): keep tmux visualization in caller window
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-06 17:36:03 +09:00
YeonGyu-Kim 675f7880fe fix(team-mode): resolve caller tmux window target
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-06 17:36:03 +09:00
YeonGyu-Kim 2d37df48c1 refactor(team-mode): use dedicated focus and grid windows for team layout
Replace in-window pane splitting with two purpose-built windows
(focus: main-vertical, grid: tiled) created off the target session,
so leader pane is never disturbed and layouts no longer collapse
under teammate count.

🤖 Generated with assistance of [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)
2026-05-06 14:20:50 +09:00
YeonGyu-Kim cb819307ff fix(team-mode): stop tmux freeze when many teammates spawn
Drop the per-pane select-pane title shuffle and the cyan border styling that leaked to window scope, then switch from main-vertical to tiled when there are 4 or more teammates so each pane keeps a usable height for the opencode TUI.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-06 14:20:50 +09:00
YeonGyu-Kim e6cd50cc15 fix(team-mode): preserve tmux focus during layout
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-06 14:20:50 +09:00
YeonGyu-Kim 51382c1082 test(team-mode): add live tmux smoke test for team layout 2026-05-06 14:19:39 +09:00
YeonGyu-Kim f78b1e62d7 feat(team-mode): add sweep-stale-team-sessions with tests 2026-05-06 14:19:39 +09:00
YeonGyu-Kim 2b8096fc06 feat(team-mode): add resolve-caller-tmux-session helper with tests 2026-05-06 14:19:38 +09:00
YeonGyu-Kim eb61091f6d feat(team-mode): add rebalance-team-window command with tests 2026-05-06 14:19:38 +09:00
YeonGyu-Kim a13ef03f82 feat(team-mode): add close-team-member-pane command with tests 2026-05-06 14:19:38 +09:00
YeonGyu-Kim c5df781029 feat(team-mode): add tmux team layout creation and removal 2026-05-06 14:19:38 +09:00
YeonGyu-Kim f8a1a11bb7 fix(team-mode): refactor layout to use testable spawn-process helper
The existing layout.test.ts relied on mock.module("bun", ...) registered
at the top level, but test-setup.ts calls mock.restore() + restoreModuleMocks()
in afterEach, so every test except the first one lost its mocks. CI has
been red on this file since e303feef.

Two changes:

1. layout.ts now imports spawn from the existing spawn-process helper
   instead of "bun" directly, matching the pattern established for
   closeTmuxPane and killTmuxSessionIfExists. This does not change
   runtime behavior - spawn-process just re-exports Bun's spawn.

2. layout.test.ts registers module mocks inside beforeEach and uses the
   ?test=UUID cache-busting dynamic-import pattern so the mocks apply
   on every test run, not just the first.

All 4 layout.test.ts cases now pass.
2026-04-18 19:42:19 +09:00
YeonGyu-Kim e303feefd2 feat(team-mode): add team-layout-tmux for focus+grid pane visualization
Introduce a dedicated module that builds the two-window tmux layout team-mode relies on:
- "focus" window uses main-vertical for the lead-centric view
- "grid" window uses tiled so every member pane is visible at once

createTeamLayout spawns omo-team-<teamRunId>, registers pane titles with
color-coded labels, and returns the focus/grid window IDs plus a
pane-by-member map. removeTeamLayout tears the session down idempotently.
canVisualize short-circuits when TMUX is unset so callers degrade
gracefully outside a tmux context.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-04-18 18:33:58 +09:00