fix: SetWorkDir uses session touch_dir for bootstrap file resolution

EffectiveWorkspace only returns worktree paths, defaulting to workspace
root when no worktree is active. This meant project-scoped bootstrap
files (AGENTS.md, IDENTITY.md) were always loaded from workspace root.

Now uses the tool-detected project directory (touch_dir) from the session
tracker, resolved as absolute path under workspace. Falls back to
EffectiveWorkspace for the first turn before any tools have run.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
dj-oyu 2026-02-24 17:56:33 +09:00
parent d81282b1a6
commit c24e4d3d62

View file

@ -811,8 +811,14 @@ func (al *AgentLoop) runAgentLoop(ctx context.Context, agent *AgentInstance, opt
// 1. Update tool contexts // 1. Update tool contexts
al.updateToolContexts(agent, opts.Channel, opts.ChatID) al.updateToolContexts(agent, opts.Channel, opts.ChatID)
// 1a. Set session-specific working directory for bootstrap file lookup // 1a. Set session-specific working directory for bootstrap file lookup.
agent.ContextBuilder.SetWorkDir(agent.EffectiveWorkspace(opts.SessionKey)) // Prefer the tool-detected project directory (touch_dir) from the session tracker,
// resolved as an absolute path under workspace. Fall back to worktree or workspace.
if active := al.sessions.ListActive(); len(active) > 0 && active[0].SessionKey == opts.SessionKey && active[0].TouchDir != "" {
agent.ContextBuilder.SetWorkDir(filepath.Join(agent.Workspace, active[0].TouchDir))
} else {
agent.ContextBuilder.SetWorkDir(agent.EffectiveWorkspace(opts.SessionKey))
}
// 1b. Inject peer session awareness into system prompt // 1b. Inject peer session awareness into system prompt
projectPath := agent.ContextBuilder.GetPlanWorkDir() projectPath := agent.ContextBuilder.GetPlanWorkDir()