fix(agent-session): preserve handoff launch arguments

This commit is contained in:
Merge Sim
2026-09-01 01:27:31 -07:00
parent 7ac26e506d
commit 75c9de3671
4 changed files with 71 additions and 6 deletions
@@ -0,0 +1,33 @@
import { describe, expect, it } from 'vitest'
import { resolveAgentSessionResumeArgs } from './agent-session-resume-args'
describe('agent session resume arguments', () => {
it('keeps the session creation arguments after mutable defaults change', () => {
expect(
resolveAgentSessionResumeArgs({
persistedArgs: ['--model', 'claude-created'],
defaultArgs: '--model claude-current',
shell: 'posix'
})
).toBe("'--model' 'claude-created'")
})
it('keeps an explicit empty snapshot when defaults are toggled off', () => {
expect(
resolveAgentSessionResumeArgs({
persistedArgs: [],
defaultArgs: '--dangerously-skip-permissions',
shell: 'posix'
})
).toBe('')
})
it('uses current defaults for legacy records without a snapshot', () => {
expect(
resolveAgentSessionResumeArgs({
defaultArgs: '--dangerously-skip-permissions',
shell: 'posix'
})
).toBe('--dangerously-skip-permissions')
})
})
@@ -0,0 +1,17 @@
import type { AgentSessionLaunchArgs } from '../../shared/agent-session-record'
import { quoteStartupArg, type AgentStartupShell } from '../../shared/tui-agent-startup-shell'
export function resolveAgentSessionResumeArgs(input: {
requestArgs?: string | null
persistedArgs?: AgentSessionLaunchArgs
defaultArgs?: string | null
shell: AgentStartupShell
}): string | null | undefined {
if (input.requestArgs !== undefined) {
return input.requestArgs
}
if (input.persistedArgs !== undefined) {
return input.persistedArgs.map((arg) => quoteStartupArg(arg, input.shell)).join(' ')
}
return input.defaultArgs
}
@@ -562,6 +562,7 @@ describe('structured TUI launch tab binding', () => {
sessionId: 'session-1',
location: { workspaceId: WORKTREE_ID, executionHostId: 'local' },
accountHome: { variable: 'CODEX_HOME', path: '/tmp/codex-home' },
launchArgs: ['--search'],
options: { model: 'gpt-5.6-terra', effort: 'medium' },
providerHandleChain: [
{ handle: { provider: 'codex', threadId: 'thread-1' }, observedAt: 1 }
@@ -601,6 +602,7 @@ describe('structured TUI launch tab binding', () => {
const launchCommand = spawn.mock.calls[0]?.[0]?.command
expect(launchCommand).toContain("'-m' 'gpt-5.6-terra'")
expect(launchCommand).toContain("'-c' 'model_reasoning_effort=medium'")
expect(launchCommand).toContain("'--search'")
expect(launchCommand).not.toContain('gpt-5.6-sol')
expect(launchCommand).not.toContain('model_reasoning_effort=high')
+19 -6
View File
@@ -652,6 +652,7 @@ import {
resolveTuiAgentLaunchEnv
} from '../../shared/tui-agent-launch-defaults'
import { resolveStartupShell, tokenizeStartupCommand } from '../../shared/tui-agent-startup-shell'
import { resolveAgentSessionResumeArgs } from './agent-session-resume-args'
import { resolveCodexStructuredAppServerArgs } from '../codex/codex-structured-app-server-args'
import { resolveLocalWindowsAgentStartupShell } from '../../shared/windows-terminal-shell'
import {
@@ -11390,7 +11391,12 @@ export class OrcaRuntimeService {
presentation: 'background'
},
{},
{ spawnToken, providerRoot: record.accountHome.path, sessionId: record.sessionId }
{
spawnToken,
providerRoot: record.accountHome.path,
sessionId: record.sessionId,
...(record.launchArgs !== undefined ? { launchArgs: record.launchArgs } : {})
}
)
const terminal = launched.terminal
let spawnedOwner: StructuredTuiOwner | null = null
@@ -30088,7 +30094,12 @@ export class OrcaRuntimeService {
async ensureAgentSession(
request: RuntimeEnsureAgentSessionRequest,
_caller: RuntimeAgentSessionRpcCaller = {},
handoffAuthority?: { spawnToken: string; providerRoot: string; sessionId: string }
handoffAuthority?: {
spawnToken: string
providerRoot: string
sessionId: string
launchArgs?: NonNullable<AgentSessionRecord['launchArgs']>
}
): Promise<RuntimeEnsureAgentSessionResult> {
if (request.kind === 'automatic') {
// Legacy renderer sleep records are migration evidence, not host authority.
@@ -30132,10 +30143,12 @@ export class OrcaRuntimeService {
agent: request.agent,
providerSession: identity.providerSession,
cmdOverrides: settings.agentCmdOverrides ?? {},
agentArgs:
request.agentArgs !== undefined
? request.agentArgs
: resolveTuiAgentLaunchArgs(request.agent, settings.agentDefaultArgs),
agentArgs: resolveAgentSessionResumeArgs({
requestArgs: request.agentArgs,
persistedArgs: handoffAuthority?.launchArgs,
defaultArgs: resolveTuiAgentLaunchArgs(request.agent, settings.agentDefaultArgs),
shell: resolveStartupShell(platform, shell)
}),
agentEnv: {
...resolveTuiAgentLaunchEnv(request.agent, settings.agentDefaultEnv),
...(handoffAuthority && request.agent === 'codex'