( input: unknown, field: 'blockedReason' | 'failureReason' | 'completionEvidence', )
| 284 | } |
| 285 | |
| 286 | export function normalizeTaskEvidenceText( |
| 287 | input: unknown, |
| 288 | field: 'blockedReason' | 'failureReason' | 'completionEvidence', |
| 289 | ): TaskLedgerNormalizeResult<string> { |
| 290 | if (typeof input !== 'string') { |
| 291 | return invalid(evidenceReason(field), `${field} must be a string`); |
| 292 | } |
| 293 | const value = input.normalize('NFC').replace(/\s+/g, ' ').trim(); |
| 294 | if (value.length === 0) { |
| 295 | return invalid(evidenceReason(field), `${field} cannot be empty`); |
| 296 | } |
| 297 | if (Array.from(value).length > TASK_EVIDENCE_MAX_CHARS) { |
| 298 | return invalid( |
| 299 | evidenceReason(field), |
| 300 | `${field} must be ${TASK_EVIDENCE_MAX_CHARS} characters or fewer`, |
| 301 | ); |
| 302 | } |
| 303 | return { ok: true, value }; |
| 304 | } |
| 305 | |
| 306 | export function normalizeCreateTaskInput( |
| 307 | input: unknown, |
no test coverage detected