( task: DiscoveryTaskType, result: DiscoverySurfaceResultType, elapsedMs?: number )
| 170 | } |
| 171 | |
| 172 | function evaluateDiscoveryTask( |
| 173 | task: DiscoveryTaskType, |
| 174 | result: DiscoverySurfaceResultType, |
| 175 | elapsedMs?: number |
| 176 | ): DiscoveryTaskResultEval { |
| 177 | const { matchedSignals, missingSignals, forbiddenHits, usefulnessScore } = matchSignals( |
| 178 | result.payload, |
| 179 | task.expectedSignals, |
| 180 | task.forbiddenSignals |
| 181 | ); |
| 182 | const payloadBytes = countUtf8Bytes(result.payload); |
| 183 | const estimatedTokens = estimateTokenCountFromBytes(payloadBytes); |
| 184 | const firstRelevantHit = matchPatterns(result.topFiles ?? [], task.expectedFilePatterns); |
| 185 | const bestExampleUseful = |
| 186 | task.expectedBestExamplePatterns && task.expectedBestExamplePatterns.length > 0 |
| 187 | ? task.expectedBestExamplePatterns.some((pattern) => |
| 188 | normalizeText(result.bestExample ?? '').includes(normalizeText(pattern)) |
| 189 | ) |
| 190 | : undefined; |
| 191 | |
| 192 | return { |
| 193 | taskId: task.id, |
| 194 | title: task.title, |
| 195 | job: task.job, |
| 196 | surface: task.surface, |
| 197 | usefulnessScore, |
| 198 | matchedSignals, |
| 199 | missingSignals, |
| 200 | forbiddenHits, |
| 201 | payloadBytes, |
| 202 | estimatedTokens, |
| 203 | ...(firstRelevantHit !== null ? { firstRelevantHit } : {}), |
| 204 | ...(typeof bestExampleUseful === 'boolean' ? { bestExampleUseful } : {}), |
| 205 | ...(typeof elapsedMs === 'number' ? { elapsedMs, toolCallCount: 1 } : {}) |
| 206 | }; |
| 207 | } |
| 208 | |
| 209 | function summarizeDiscoveryResults(results: DiscoveryTaskResultEval[]): DiscoverySummaryType { |
| 210 | const totalTasks = results.length; |
no test coverage detected