(state: CLIParseState)
| 131 | } |
| 132 | |
| 133 | function flushTurn(state: CLIParseState): void { |
| 134 | const turn = state.turn; |
| 135 | if (!turn || (turn.responseChunks.length === 0 && turn.toolNames.size === 0 && !turn.isCanceled)) return; |
| 136 | |
| 137 | const msgTs = turn.userTs ? new Date(turn.userTs).getTime() : null; |
| 138 | const respTs = turn.lastAssistantTs ? new Date(turn.lastAssistantTs).getTime() : null; |
| 139 | const firstProgress = turn.firstToolTs && msgTs ? turn.firstToolTs - msgTs : null; |
| 140 | const responseText = turn.responseChunks.filter(Boolean).join('\n\n'); |
| 141 | |
| 142 | state.requests.push(createRequest({ |
| 143 | requestId: turn.lastAssistantId || `cli-${state.requests.length}`, |
| 144 | timestamp: msgTs, |
| 145 | messageText: turn.userMsg, |
| 146 | responseText, |
| 147 | agentName: harnessName(state), |
| 148 | agentMode: turn.agentMode || 'agent', |
| 149 | modelId: turn.modelId || state.currentModelId, |
| 150 | toolsUsed: [...turn.toolNames], |
| 151 | editedFiles: [...turn.editedFiles], |
| 152 | referencedFiles: [...turn.referencedFiles], |
| 153 | skillsUsed: [...turn.skillsUsed], |
| 154 | variableKinds: turn.imageCount > 0 ? { image: turn.imageCount } : {}, |
| 155 | firstProgress: firstProgress !== null && firstProgress >= 0 ? firstProgress : null, |
| 156 | totalElapsed: msgTs && respTs ? respTs - msgTs : null, |
| 157 | completionTokens: turn.totalOutputTokens || null, |
| 158 | isCanceled: turn.isCanceled, |
| 159 | compaction: turn.compaction, |
| 160 | // Reasoning effort: prefer the value captured at user.message time |
| 161 | // (carried forward from session.start / model_change). Fall back to |
| 162 | // model-id suffix inference for sessions that pre-date the explicit |
| 163 | // event field. |
| 164 | reasoningEffort: turn.reasoningEffort |
| 165 | ?? extractReasoningEffortFromModelId(turn.modelId || state.currentModelId), |
| 166 | endState: getTurnEndState(turn), |
| 167 | })); |
| 168 | } |
| 169 | |
| 170 | function addAttachmentReferences(turn: TurnState, attachments: unknown): void { |
| 171 | for (const attachment of recordArrayValue(attachments)) { |
no test coverage detected