( ctx context.Context, sessions taskBridgeSessionManager, sessionID string, )
| 723 | } |
| 724 | |
| 725 | func inspectTaskSessionRecovery( |
| 726 | ctx context.Context, |
| 727 | sessions taskBridgeSessionManager, |
| 728 | sessionID string, |
| 729 | ) (taskSessionRecoveryEvidence, error) { |
| 730 | trimmedID := strings.TrimSpace(sessionID) |
| 731 | if trimmedID == "" { |
| 732 | return taskSessionRecoveryEvidence{ |
| 733 | state: taskRecoverySessionMissing, |
| 734 | classification: taskRecoveryClassificationMissing, |
| 735 | detail: "run has no bound session", |
| 736 | }, nil |
| 737 | } |
| 738 | |
| 739 | info, err := sessions.Status(ctx, trimmedID) |
| 740 | if err != nil { |
| 741 | if errors.Is(err, session.ErrSessionNotFound) { |
| 742 | return taskSessionRecoveryEvidence{ |
| 743 | state: taskRecoverySessionMissing, |
| 744 | classification: taskRecoveryClassificationMissing, |
| 745 | detail: "bound session metadata is missing", |
| 746 | }, nil |
| 747 | } |
| 748 | return taskSessionRecoveryEvidence{}, err |
| 749 | } |
| 750 | if info == nil { |
| 751 | return taskSessionRecoveryEvidence{ |
| 752 | state: taskRecoverySessionMissing, |
| 753 | classification: taskRecoveryClassificationMissing, |
| 754 | detail: "bound session metadata is missing", |
| 755 | }, nil |
| 756 | } |
| 757 | |
| 758 | evidence := taskSessionRecoveryEvidence{ |
| 759 | live: isTaskSessionStateLive(info.State), |
| 760 | state: string(info.State), |
| 761 | } |
| 762 | if evidence.state == "" { |
| 763 | evidence.state = taskRecoverySessionMissing |
| 764 | } |
| 765 | if evidence.live { |
| 766 | evidence.classification = taskRecoveryClassificationLive |
| 767 | return evidence, nil |
| 768 | } |
| 769 | |
| 770 | evidence.classification, evidence.detail = classifyRecoveredTaskSession(info, time.Now().UTC()) |
| 771 | return evidence, nil |
| 772 | } |
| 773 | |
| 774 | func classifyRecoveredTaskSession(info *session.Info, now time.Time) (string, string) { |
| 775 | if info == nil { |
no test coverage detected