@@ -19,6 +19,8 @@ import (
1919 "github.com/samber/do"
2020
2121 gituc "github.com/chaitin/MonkeyCode/backend/biz/git/usecase"
22+ "github.com/chaitin/MonkeyCode/backend/biz/task/service"
23+ vmidle "github.com/chaitin/MonkeyCode/backend/biz/vmidle/usecase"
2224 "github.com/chaitin/MonkeyCode/backend/config"
2325 "github.com/chaitin/MonkeyCode/backend/consts"
2426 "github.com/chaitin/MonkeyCode/backend/db"
@@ -36,40 +38,44 @@ import (
3638
3739// TaskUsecase 任务业务逻辑实现
3840type TaskUsecase struct {
39- cfg * config.Config
40- repo domain.TaskRepo
41- modelRepo domain.ModelRepo
42- logger * slog.Logger
43- taskflow taskflow.Clienter
44- loki * loki.Client
45- redis * redis.Client
46- notifyDispatcher * dispatcher.Dispatcher
47- taskHook domain.TaskHook
48- privilegeChecker domain.PrivilegeChecker
49- modelHook domain.ModelHook
50- taskLifecycle * lifecycle.Manager [uuid.UUID , consts.TaskStatus , lifecycle.TaskMetadata ]
51- vmLifecycle * lifecycle.Manager [string , lifecycle.VMState , lifecycle.VMMetadata ]
52- girepo domain.GitIdentityRepo
53- tokenProvider * gituc.TokenProvider
54- projectRepo domain.ProjectRepo
41+ cfg * config.Config
42+ repo domain.TaskRepo
43+ modelRepo domain.ModelRepo
44+ logger * slog.Logger
45+ taskflow taskflow.Clienter
46+ loki * loki.Client
47+ redis * redis.Client
48+ notifyDispatcher * dispatcher.Dispatcher
49+ taskHook domain.TaskHook
50+ privilegeChecker domain.PrivilegeChecker
51+ modelHook domain.ModelHook
52+ taskLifecycle * lifecycle.Manager [uuid.UUID , consts.TaskStatus , lifecycle.TaskMetadata ]
53+ vmLifecycle * lifecycle.Manager [string , lifecycle.VMState , lifecycle.VMMetadata ]
54+ girepo domain.GitIdentityRepo
55+ tokenProvider * gituc.TokenProvider
56+ projectRepo domain.ProjectRepo
57+ taskActivityRefresher service.TaskActivityRefresher
58+ idleRefresher vmidle.VMIdleRefresher
5559}
5660
5761// NewTaskUsecase 创建任务业务逻辑实例
5862func NewTaskUsecase (i * do.Injector ) (domain.TaskUsecase , error ) {
5963 u := & TaskUsecase {
60- cfg : do.MustInvoke [* config.Config ](i ),
61- repo : do.MustInvoke [domain.TaskRepo ](i ),
62- modelRepo : do.MustInvoke [domain.ModelRepo ](i ),
63- logger : do.MustInvoke [* slog.Logger ](i ).With ("module" , "usecase.TaskUsecase" ),
64- taskflow : do.MustInvoke [taskflow.Clienter ](i ),
65- loki : do.MustInvoke [* loki.Client ](i ),
66- redis : do.MustInvoke [* redis.Client ](i ),
67- notifyDispatcher : do.MustInvoke [* dispatcher.Dispatcher ](i ),
68- taskLifecycle : do.MustInvoke [* lifecycle.Manager [uuid.UUID , consts.TaskStatus , lifecycle.TaskMetadata ]](i ),
69- vmLifecycle : do.MustInvoke [* lifecycle.Manager [string , lifecycle.VMState , lifecycle.VMMetadata ]](i ),
70- girepo : do.MustInvoke [domain.GitIdentityRepo ](i ),
71- tokenProvider : do.MustInvoke [* gituc.TokenProvider ](i ),
72- projectRepo : do.MustInvoke [domain.ProjectRepo ](i ),
64+ cfg : do.MustInvoke [* config.Config ](i ),
65+ repo : do.MustInvoke [domain.TaskRepo ](i ),
66+ modelRepo : do.MustInvoke [domain.ModelRepo ](i ),
67+ logger : do.MustInvoke [* slog.Logger ](i ).With ("module" , "usecase.TaskUsecase" ),
68+ taskflow : do.MustInvoke [taskflow.Clienter ](i ),
69+ loki : do.MustInvoke [* loki.Client ](i ),
70+ redis : do.MustInvoke [* redis.Client ](i ),
71+ notifyDispatcher : do.MustInvoke [* dispatcher.Dispatcher ](i ),
72+ taskLifecycle : do.MustInvoke [* lifecycle.Manager [uuid.UUID , consts.TaskStatus , lifecycle.TaskMetadata ]](i ),
73+ vmLifecycle : do.MustInvoke [* lifecycle.Manager [string , lifecycle.VMState , lifecycle.VMMetadata ]](i ),
74+ girepo : do.MustInvoke [domain.GitIdentityRepo ](i ),
75+ tokenProvider : do.MustInvoke [* gituc.TokenProvider ](i ),
76+ projectRepo : do.MustInvoke [domain.ProjectRepo ](i ),
77+ taskActivityRefresher : do.MustInvoke [service.TaskActivityRefresher ](i ),
78+ idleRefresher : do.MustInvoke [vmidle.VMIdleRefresher ](i ),
7379 }
7480
7581 // 可选注入 TaskHook
@@ -450,6 +456,11 @@ func (a *TaskUsecase) Create(ctx context.Context, user *domain.User, req domain.
450456 if err := a .IncrUserInputCount (ctx , user .ID , pt .Edges .Task .ID ); err != nil {
451457 a .logger .WarnContext (ctx , "failed to incr user input count on create" , "error" , err )
452458 }
459+ vmID := ""
460+ if createdVm != nil {
461+ vmID = createdVm .ID
462+ }
463+ a .refreshCreatedTaskState (ctx , pt .TaskID , vmID )
453464
454465 result := cvt .From (pt , & domain.ProjectTask {})
455466
@@ -463,6 +474,18 @@ func (a *TaskUsecase) Create(ctx context.Context, user *domain.User, req domain.
463474 return result , nil
464475}
465476
477+ func (a * TaskUsecase ) refreshCreatedTaskState (ctx context.Context , taskID uuid.UUID , vmID string ) {
478+ if err := a .taskActivityRefresher .ForceRefresh (ctx , taskID ); err != nil {
479+ a .logger .WarnContext (ctx , "failed to refresh task last active on create" , "task_id" , taskID , "error" , err )
480+ }
481+ if vmID == "" {
482+ return
483+ }
484+ if err := a .idleRefresher .Refresh (ctx , vmID ); err != nil {
485+ a .logger .WarnContext (ctx , "failed to refresh vm idle timers on create" , "task_id" , taskID , "vm_id" , vmID , "error" , err )
486+ }
487+ }
488+
466489func (a * TaskUsecase ) buildMCPConfigs (taskID uuid.UUID , token string ) []taskflow.McpServerConfig {
467490 mcps := []taskflow.McpServerConfig {
468491 {
0 commit comments