fix: validate serverUrl port before tmux pane spawn (fixes #2729)

This commit is contained in:
YeonGyu-Kim
2026-03-23 18:09:31 +09:00
parent d886ac701f
commit 0810e37240
2 changed files with 33 additions and 2 deletions

View File

@@ -226,6 +226,29 @@ describe('TmuxSessionManager', () => {
// then
expect(manager).toBeDefined()
})
test('falls back to default port when serverUrl has port 0', async () => {
// given
mockIsInsideTmux.mockReturnValue(true)
const { TmuxSessionManager } = await import('./manager')
const ctx = {
...createMockContext(),
serverUrl: new URL('http://127.0.0.1:0/'),
}
const config: TmuxConfig = {
enabled: true,
layout: 'main-vertical',
main_pane_size: 60,
main_pane_min_width: 80,
agent_pane_min_width: 40,
}
// when
const manager = new TmuxSessionManager(ctx, config, mockTmuxDeps)
// then
expect((manager as any).serverUrl).toBe('http://localhost:4096')
})
})
describe('onSessionCreated', () => {

View File

@@ -73,10 +73,18 @@ export class TmuxSessionManager {
this.tmuxConfig = tmuxConfig
this.deps = deps
const defaultPort = process.env.OPENCODE_PORT ?? "4096"
const fallbackUrl = `http://localhost:${defaultPort}`
try {
this.serverUrl = ctx.serverUrl?.toString() ?? `http://localhost:${defaultPort}`
const raw = ctx.serverUrl?.toString()
if (raw) {
const parsed = new URL(raw)
const port = parsed.port || (parsed.protocol === 'https:' ? '443' : '80')
this.serverUrl = port === '0' ? fallbackUrl : raw
} else {
this.serverUrl = fallbackUrl
}
} catch {
this.serverUrl = `http://localhost:${defaultPort}`
this.serverUrl = fallbackUrl
}
this.sourcePaneId = deps.getCurrentPaneId()
this.pollingManager = new TmuxPollingManager(