Files
Agent-System/internal/projectinstance/terminate.go
T
weichenandCursor f07178fa73 feat(service): enforce three-workflow governance and instance lifecycle
Wire catalog policy, v2 manifests, stage access, activation metadata fixes, and coordinator instance advance around frozen workflow snapshots.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-13 02:50:23 +00:00

44 lines
1.3 KiB
Go

package projectinstance
import "context"
// TerminateInput 受控终止输入。
type TerminateInput struct {
Reason string `json:"reason"`
Confirm bool `json:"confirm"`
ExpectedConfigRevision int `json:"expected_config_revision"`
}
// TerminateResult 终止结果。
type TerminateResult struct {
Instance WorkflowInstance `json:"instance"`
Reason string `json:"reason"`
}
func (s *Service) TerminateInstance(ctx context.Context, instanceID int64, projectID int64, userID int64, isCreator bool, in TerminateInput) (*TerminateResult, error) {
if !isCreator {
return nil, ErrForbiddenNotCreator
}
if !in.Confirm {
return nil, ErrTerminationNotAllowed
}
if in.Reason == "" {
return nil, ErrValidationFailed
}
if !s.Available() {
return nil, ErrNotAvailable
}
live, err := s.store.GetLiveInstance(ctx, projectID)
if err != nil || live == nil || live.ID != instanceID {
return nil, ErrInstanceNotFound
}
if in.ExpectedConfigRevision > 0 && live.ConfigRevision != in.ExpectedConfigRevision {
return nil, ErrInstanceRevisionConflict
}
inst, err := s.store.TerminateInstance(ctx, instanceID, projectID, userID, in.Reason)
if err != nil {
return nil, err
}
return &TerminateResult{Instance: *inst, Reason: in.Reason}, nil
}