refactor: identify and freeze messages at creation
This commit is contained in:
@@ -123,6 +123,7 @@ function readReplayState(value: unknown): PiAiReplayState {
|
||||
|
||||
/** Convert provider-neutral blocks without trusting them as same-model replay. */
|
||||
function foreignAssistant(message: Message): AssistantMessage {
|
||||
const source = message.source.kind === 'model' ? message.source : undefined
|
||||
const content: AssistantMessage['content'] = []
|
||||
for (const block of message.content) {
|
||||
switch (block.type) {
|
||||
@@ -143,10 +144,10 @@ function foreignAssistant(message: Message): AssistantMessage {
|
||||
role: 'assistant',
|
||||
content,
|
||||
// Deliberately never equals a catalog API: absent replay state is foreign
|
||||
// even if provenance names the same provider/model as this request.
|
||||
// even if source names the same provider/model as this request.
|
||||
api: 'dsh-foreign',
|
||||
provider: message.provenance?.provider ?? 'dsh-foreign',
|
||||
model: message.provenance?.model ?? 'dsh-foreign',
|
||||
provider: source?.provider ?? 'dsh-foreign',
|
||||
model: source?.model ?? 'dsh-foreign',
|
||||
usage: emptyPiUsage(),
|
||||
stopReason: content.some(piece => piece.type === 'toolCall') ? 'toolUse' : 'stop',
|
||||
timestamp: 0,
|
||||
@@ -156,9 +157,10 @@ function foreignAssistant(message: Message): AssistantMessage {
|
||||
/** Recombine durable Harness content with validated pi-ai replay metadata. */
|
||||
function replayedAssistant(message: Message, rawState: unknown): AssistantMessage {
|
||||
const state = readReplayState(rawState)
|
||||
const provenance = message.provenance
|
||||
if (state.provider !== provenance?.provider) return invalidReplay('provider does not match assistant provenance')
|
||||
if (state.model !== provenance.model) return invalidReplay('model does not match assistant provenance')
|
||||
const source = message.source
|
||||
if (source.kind !== 'model') return invalidReplay('assistant message lacks model source')
|
||||
if (state.provider !== source.provider) return invalidReplay('provider does not match assistant source')
|
||||
if (state.model !== source.model) return invalidReplay('model does not match assistant source')
|
||||
if (state.blocks.length !== message.content.length) return invalidReplay('block count does not match assistant content')
|
||||
const content: AssistantMessage['content'] = message.content.map((block, index) => {
|
||||
const replay = state.blocks[index]
|
||||
@@ -202,10 +204,10 @@ function replayedAssistant(message: Message, rawState: unknown): AssistantMessag
|
||||
|
||||
/**
|
||||
* Convert one durable Harness assistant message into pi-ai history.
|
||||
* @param message - assistant content with optional adapter-owned replay metadata.
|
||||
* @param message - assistant content with required source and optional adapter-owned replay metadata.
|
||||
* @returns a native pi-ai assistant message reconstructed from durable content.
|
||||
*/
|
||||
export function toPiAssistant(message: Message): AssistantMessage {
|
||||
const replayState = message.provenance?.replayState
|
||||
const replayState = message.source.kind === 'model' ? message.source.replayState : undefined
|
||||
return replayState === undefined ? foreignAssistant(message) : replayedAssistant(message, replayState)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user