Merge remote-tracking branch 'origin/master' into xtr/react-loop-simplification
Resolve translation-pairing hashes after the merge and adapt the math-rendering e2e fixture to the simplified turn/start event shape.
This commit is contained in:
@@ -17,6 +17,7 @@ import type {
|
||||
TrajectoryCellProps,
|
||||
TrajectorySourceBlock,
|
||||
} from './trajectory-record.ts'
|
||||
import { formatElapsedSeconds } from './trajectory-record.ts'
|
||||
|
||||
/** One Message or Step group inside a turn. */
|
||||
export interface TrajectoryGroupModel {
|
||||
@@ -473,6 +474,67 @@ export function deriveTrajectoryLayout(input: TrajectoryLayoutInput): readonly T
|
||||
].sort((left, right) => firstCellIndex(left) - firstCellIndex(right))
|
||||
}
|
||||
|
||||
/**
|
||||
* Append the changing in-flight assistant cells to a stable finalized layout.
|
||||
* @param turns - Finalized layout derived with an empty-block partial anchor.
|
||||
* @param partial - Current in-flight assistant projection.
|
||||
* @param lastIndex - Highest cell index in the finalized layout.
|
||||
* @returns The original layout without a partial, otherwise a layout sharing every unaffected turn.
|
||||
*/
|
||||
export function appendTrajectoryPartialLayout(
|
||||
turns: readonly TrajectoryTurnModel[],
|
||||
partial: ConversationSnapshot['partial'],
|
||||
lastIndex: number,
|
||||
): readonly TrajectoryTurnModel[] {
|
||||
if (partial === null) return turns
|
||||
const partialTurn = deriveTrajectoryLayout({
|
||||
nodes: [],
|
||||
partial,
|
||||
runningCalls: [],
|
||||
codeDispatches: new Map(),
|
||||
}).at(0)
|
||||
if (partialTurn === undefined) return turns
|
||||
const streamed: TrajectoryTurnModel = {
|
||||
...partialTurn,
|
||||
groups: partialTurn.groups.map(group => ({
|
||||
...group,
|
||||
cells: group.cells.map(cell => ({ ...cell, index: cell.index + lastIndex })),
|
||||
})),
|
||||
}
|
||||
const turnIndex = turns.findIndex(turn => turn.turn === streamed.turn)
|
||||
if (turnIndex === -1) return [...turns, streamed]
|
||||
const current = turns[turnIndex]
|
||||
/* v8 ignore next -- findIndex proved the dense array position exists. */
|
||||
if (current === undefined) return turns
|
||||
const groups = [...current.groups]
|
||||
for (const streamedGroup of streamed.groups) {
|
||||
const groupIndex = groups.findIndex(group => group.title === streamedGroup.title)
|
||||
if (groupIndex === -1) {
|
||||
groups.push(streamedGroup)
|
||||
continue
|
||||
}
|
||||
const group = groups[groupIndex]
|
||||
/* v8 ignore next -- findIndex proved the dense array position exists. */
|
||||
if (group === undefined) continue
|
||||
const streamedCallIds = new Set(
|
||||
streamedGroup.cells.flatMap(cell => cell.callId === undefined ? [] : [cell.callId]),
|
||||
)
|
||||
groups[groupIndex] = {
|
||||
...streamedGroup,
|
||||
cells: [
|
||||
...group.cells.filter(cell =>
|
||||
cell.requestOnly !== true
|
||||
&& (cell.callId === undefined || !streamedCallIds.has(cell.callId)),
|
||||
),
|
||||
...streamedGroup.cells,
|
||||
],
|
||||
}
|
||||
}
|
||||
const updated = [...turns]
|
||||
updated[turnIndex] = { ...current, groups }
|
||||
return updated
|
||||
}
|
||||
|
||||
function attachToolSchema(
|
||||
laid: LaidCell,
|
||||
callSchemas: RequestInspectionSnapshot['callSchemas'] | undefined,
|
||||
@@ -540,9 +602,7 @@ function groupDescription(laid: readonly LaidCell[]): string | undefined {
|
||||
|
||||
function formatGroupDuration(seconds: number): string | undefined {
|
||||
if (!Number.isFinite(seconds)) return undefined
|
||||
const rounded = Math.round(seconds * 10) / 10
|
||||
if (Number.isInteger(rounded)) return `${rounded} s`
|
||||
return `${rounded.toFixed(1)} s`
|
||||
return formatElapsedSeconds(seconds)
|
||||
}
|
||||
|
||||
/** Own-duration seconds from two epoch-ms stamps; null when either is unusable. */
|
||||
@@ -564,6 +624,7 @@ function expandAssistant(
|
||||
callStarts: ReadonlyMap<string, number>,
|
||||
opts?: { streaming?: boolean },
|
||||
): LaidCell[] {
|
||||
if (opts?.streaming === true && node.blocks.length === 0) return []
|
||||
const out: LaidCell[] = []
|
||||
let index = startIndex - 1
|
||||
const usage = node.usage as UsageLike | undefined
|
||||
@@ -583,6 +644,7 @@ function expandAssistant(
|
||||
.join('\n\n')
|
||||
const message: TrajectoryCellProps = {
|
||||
index: ++index,
|
||||
recordId: `assistant\u0000${node.turn}\u0000${node.step}`,
|
||||
kind: 'message',
|
||||
sourceSeq: node.seq,
|
||||
text: messageText !== ''
|
||||
|
||||
Reference in New Issue
Block a user