Skip to content

Commit bfd59d6

Browse files
authored
fix(codeagent): fix multi ai login (#165)
1 parent 6c7c948 commit bfd59d6

File tree

4 files changed

+32
-25
lines changed

4 files changed

+32
-25
lines changed

internal/agent/agent.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func (a *Agent) cleanupExpiredResouces() {
7373
// 清理过期的工作空间 和 code session
7474
for _, ws := range expiredWorkspaces {
7575
log.Infof("Cleaning up expired workspace: %s (AI model: %s, PR: %d)", ws.Path, ws.AIModel, ws.PRNumber)
76-
76+
7777
// 关闭 code session
7878
err := a.sessionManager.CloseSession(ws)
7979
if err != nil {
@@ -139,8 +139,14 @@ func (a *Agent) ProcessIssueCommentWithAI(ctx context.Context, event *github.Iss
139139
ws.PRNumber = pr.GetNumber()
140140

141141
// 5. 创建 session 目录
142-
suffix := strings.TrimPrefix(filepath.Base(ws.Path), fmt.Sprintf("%s-pr-%d-", ws.Repo, pr.GetNumber()))
143-
sessionPath, err := a.workspace.CreateSessionPath(filepath.Dir(ws.Path), ws.Repo, pr.GetNumber(), suffix)
142+
// 从PR目录名中提取suffix
143+
prDirName := filepath.Base(ws.Path)
144+
var suffix string
145+
// 目录格式:{aiModel}-{repo}-pr-{prNumber}-{timestamp}
146+
expectedPrefix := fmt.Sprintf("%s-%s-pr-%d-", ws.AIModel, ws.Repo, pr.GetNumber())
147+
suffix = strings.TrimPrefix(prDirName, expectedPrefix)
148+
149+
sessionPath, err := a.workspace.CreateSessionPath(filepath.Dir(ws.Path), ws.AIModel, ws.Repo, pr.GetNumber(), suffix)
144150
if err != nil {
145151
log.Errorf("Failed to create session directory: %v", err)
146152
return err
@@ -952,7 +958,7 @@ func (a *Agent) CleanupAfterPRMerged(ctx context.Context, pr *github.PullRequest
952958
// 清理所有工作空间
953959
for _, ws := range workspaces {
954960
log.Infof("Cleaning up workspace: %s (AI model: %s)", ws.Path, ws.AIModel)
955-
961+
956962
// 清理执行的 code session
957963
log.Infof("Closing code session for AI model: %s", ws.AIModel)
958964
err := a.sessionManager.CloseSession(ws)

internal/code/code.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ func New(workspace *models.Workspace, cfg *config.Config) (Code, error) {
3030
} else {
3131
provider = cfg.CodeProvider
3232
}
33-
33+
3434
// 根据 code provider 和 use_docker 配置创建相应的代码提供者
3535
switch provider {
3636
case ProviderClaude:

internal/webhook/handler.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ func NewHandler(cfg *config.Config, agent *agent.Agent) *Handler {
2929
func parseCommandArgs(comment, command string, defaultAIModel string) (aiModel, args string) {
3030
// 提取命令参数
3131
commandArgs := strings.TrimSpace(strings.TrimPrefix(comment, command))
32-
32+
3333
// 检查是否包含AI模型参数
3434
if strings.HasPrefix(commandArgs, "-claude") {
3535
aiModel = "claude"
@@ -42,7 +42,7 @@ func parseCommandArgs(comment, command string, defaultAIModel string) (aiModel,
4242
aiModel = defaultAIModel
4343
args = commandArgs
4444
}
45-
45+
4646
return aiModel, args
4747
}
4848

internal/workspace/manager.go

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,10 @@ func (m *Manager) ExtractAIModelFromBranch(branchName string) string {
4040
if !strings.HasPrefix(branchName, BranchPrefix+"/") {
4141
return ""
4242
}
43-
43+
4444
// 移除 codeagent/ 前缀
4545
branchWithoutPrefix := strings.TrimPrefix(branchName, BranchPrefix+"/")
46-
46+
4747
// 分割获取 aimodel 部分
4848
parts := strings.Split(branchWithoutPrefix, "/")
4949
if len(parts) >= 2 {
@@ -53,7 +53,7 @@ func (m *Manager) ExtractAIModelFromBranch(branchName string) string {
5353
return aiModel
5454
}
5555
}
56-
56+
5757
return ""
5858
}
5959

@@ -289,16 +289,14 @@ func (m *Manager) recoverExistingWorkspaces() {
289289
func (m *Manager) recoverPRWorkspace(org, repo, worktreePath, remoteURL string, prNumber int, aiModel string) error {
290290
// 从 worktree 路径提取 PR 信息
291291
worktreeDir := filepath.Base(worktreePath)
292-
var timestamp, sessionSuffix string
293-
292+
var timestamp string
293+
294294
if aiModel != "" {
295295
// 有AI模型的情况: aimodel-repo-pr-number-timestamp
296296
timestamp = strings.TrimPrefix(worktreeDir, aiModel+"-"+repo+"-pr-"+strconv.Itoa(prNumber)+"-")
297-
sessionSuffix = strings.TrimPrefix(worktreeDir, aiModel+"-"+repo+"-pr-")
298297
} else {
299298
// 没有AI模型的情况: repo-pr-number-timestamp
300299
timestamp = strings.TrimPrefix(worktreeDir, repo+"-pr-"+strconv.Itoa(prNumber)+"-")
301-
sessionSuffix = strings.TrimPrefix(worktreeDir, repo+"-pr-")
302300
}
303301

304302
// 将 timestamp 字符串转换为时间
@@ -311,7 +309,8 @@ func (m *Manager) recoverPRWorkspace(org, repo, worktreePath, remoteURL string,
311309
}
312310

313311
// 创建对应的 session 目录(与 repo 同级)
314-
sessionPath := filepath.Join(m.baseDir, org, fmt.Sprintf("%s-session-%s", repo, sessionSuffix))
312+
// 新的session目录格式:{aiModel}-{repo}-session-{prNumber}-{timestamp}
313+
sessionPath := filepath.Join(m.baseDir, org, fmt.Sprintf("%s-%s-session-%d-%s", aiModel, repo, prNumber, timestamp))
315314

316315
// 恢复工作空间对象
317316
ws := &models.Workspace{
@@ -488,8 +487,10 @@ func (m *Manager) GetWorktreeCount() int {
488487
return total
489488
}
490489

491-
func (m *Manager) CreateSessionPath(underPath, repo string, prNumber int, suffix string) (string, error) {
492-
sessionPath := filepath.Join(underPath, fmt.Sprintf("%s-session-%d-%s", repo, prNumber, suffix))
490+
func (m *Manager) CreateSessionPath(underPath, aiModel, repo string, prNumber int, suffix string) (string, error) {
491+
// 新的session目录格式:{aiModel}-{repo}-session-{prNumber}-{timestamp}
492+
// 只保留时间戳部分,避免重复信息
493+
sessionPath := filepath.Join(underPath, fmt.Sprintf("%s-%s-session-%d-%s", aiModel, repo, prNumber, suffix))
493494
if err := os.MkdirAll(sessionPath, 0755); err != nil {
494495
log.Errorf("Failed to create session directory: %v", err)
495496
return "", err
@@ -616,21 +617,21 @@ func (m *Manager) GetWorkspaceByPR(pr *github.PullRequest) *models.Workspace {
616617
func (m *Manager) GetAllWorkspacesByPR(pr *github.PullRequest) []*models.Workspace {
617618
orgRepoPath := fmt.Sprintf("%s/%s", pr.GetBase().GetRepo().GetOwner().GetLogin(), pr.GetBase().GetRepo().GetName())
618619
prNumber := pr.GetNumber()
619-
620+
620621
var workspaces []*models.Workspace
621-
622+
622623
m.mutex.RLock()
623624
defer m.mutex.RUnlock()
624-
625+
625626
// 遍历所有工作空间,找到与该PR相关的
626-
for key, ws := range m.workspaces {
627+
for _, ws := range m.workspaces {
627628
// 检查是否是该PR的工作空间
628-
if ws.PRNumber == prNumber &&
629-
fmt.Sprintf("%s/%s", ws.Org, ws.Repo) == orgRepoPath {
629+
if ws.PRNumber == prNumber &&
630+
fmt.Sprintf("%s/%s", ws.Org, ws.Repo) == orgRepoPath {
630631
workspaces = append(workspaces, ws)
631632
}
632633
}
633-
634+
634635
return workspaces
635636
}
636637

@@ -693,7 +694,7 @@ func (m *Manager) CreateWorkspaceFromPRWithAI(pr *github.PullRequest, aiModel st
693694

694695
// 创建 session 目录
695696
suffix := strings.TrimPrefix(filepath.Base(worktree.Worktree), fmt.Sprintf("%s-pr-%d-", repo, pr.GetNumber()))
696-
sessionPath, err := m.CreateSessionPath(filepath.Dir(repoManager.GetRepoPath()), repo, pr.GetNumber(), suffix)
697+
sessionPath, err := m.CreateSessionPath(filepath.Dir(repoManager.GetRepoPath()), aiModel, repo, pr.GetNumber(), suffix)
697698
if err != nil {
698699
log.Errorf("Failed to create session directory: %v", err)
699700
return nil

0 commit comments

Comments
 (0)