CompleteRun marks one running task run as completed and reconciles task state.
( ctx context.Context, runID string, result RunResult, actor ActorContext, )
| 2095 | |
| 2096 | // CompleteRun marks one running task run as completed and reconciles task state. |
| 2097 | func (m *Service) CompleteRun( |
| 2098 | ctx context.Context, |
| 2099 | runID string, |
| 2100 | result RunResult, |
| 2101 | actor ActorContext, |
| 2102 | ) (*Run, error) { |
| 2103 | if err := requireWriteAuthority(actor); err != nil { |
| 2104 | return nil, err |
| 2105 | } |
| 2106 | |
| 2107 | normalizedResult, err := normalizeRunResult(result) |
| 2108 | if err != nil { |
| 2109 | return nil, err |
| 2110 | } |
| 2111 | |
| 2112 | run, taskRecord, err := m.loadRunWithTask(ctx, runID) |
| 2113 | if err != nil { |
| 2114 | return nil, err |
| 2115 | } |
| 2116 | if strings.TrimSpace(run.ClaimTokenHash) != "" { |
| 2117 | return nil, fmt.Errorf("%w: task run %q requires token-fenced completion", ErrInvalidClaimToken, run.ID) |
| 2118 | } |
| 2119 | if err := requireRunTransition(run, TaskRunStatusCompleted); err != nil { |
| 2120 | return nil, err |
| 2121 | } |
| 2122 | |
| 2123 | run.Status = TaskRunStatusCompleted |
| 2124 | run.Result = cloneRawJSON(normalizedResult.Value) |
| 2125 | run.Error = "" |
| 2126 | run.ClaimToken = "" |
| 2127 | run.LeaseUntil = time.Time{} |
| 2128 | run.HeartbeatAt = time.Time{} |
| 2129 | run.EndedAt = m.now().UTC() |
| 2130 | if err := m.stopTerminalRunSession(ctx, run, StopReasonCompleted); err != nil { |
| 2131 | return nil, err |
| 2132 | } |
| 2133 | if err := m.store.UpdateTaskRun(ctx, run); err != nil { |
| 2134 | return nil, err |
| 2135 | } |
| 2136 | |
| 2137 | reconciledTask, err := m.reconcileTaskCascade(ctx, taskRecord.ID) |
| 2138 | if err != nil { |
| 2139 | return nil, err |
| 2140 | } |
| 2141 | if err := m.recordTaskEvent(ctx, run.TaskID, run.ID, taskEventRunCompleted, actor, completedRunPayload{ |
| 2142 | Status: run.Status, |
| 2143 | TaskStatus: reconciledTask.Status, |
| 2144 | Result: cloneRawJSON(run.Result), |
| 2145 | }); err != nil { |
| 2146 | return nil, err |
| 2147 | } |
| 2148 | m.dispatchTerminalWake(ctx, reconciledTask, run, actor) |
| 2149 | |
| 2150 | return &run, nil |
| 2151 | } |
| 2152 | |
| 2153 | // FailRun marks one starting or running task run as failed and reconciles task state. |
| 2154 | func (m *Service) FailRun( |
nothing calls this directly
no test coverage detected