@tanstack/ai
Version:
Core TanStack AI library - Open source AI SDK
145 lines (144 loc) • 4.13 kB
JavaScript
function updateTextPart(messages, messageId, content) {
return messages.map((msg) => {
if (msg.id !== messageId) {
return msg;
}
const parts = [...msg.parts];
const lastPart = parts.length > 0 ? parts[parts.length - 1] : null;
if (lastPart && lastPart.type === "text") {
parts[parts.length - 1] = { type: "text", content };
} else {
parts.push({ type: "text", content });
}
return { ...msg, parts };
});
}
function updateToolCallPart(messages, messageId, toolCall) {
return messages.map((msg) => {
if (msg.id !== messageId) {
return msg;
}
const parts = [...msg.parts];
const existing = parts.find(
(p) => p.type === "tool-call" && p.id === toolCall.id
);
const toolCallPart = {
type: "tool-call",
id: toolCall.id,
name: toolCall.name,
arguments: toolCall.arguments,
state: toolCall.state,
// Carry forward approval and output from the existing part
...existing?.approval && { approval: { ...existing.approval } },
...existing?.output !== void 0 && { output: existing.output }
};
if (existing) {
parts[parts.indexOf(existing)] = toolCallPart;
} else {
parts.push(toolCallPart);
}
return { ...msg, parts };
});
}
function updateToolResultPart(messages, messageId, toolCallId, content, state, error) {
return messages.map((msg) => {
if (msg.id !== messageId) {
return msg;
}
const parts = [...msg.parts];
const resultPartIndex = parts.findIndex(
(p) => p.type === "tool-result" && p.toolCallId === toolCallId
);
const toolResultPart = {
type: "tool-result",
toolCallId,
content,
state,
...error && { error }
};
if (resultPartIndex >= 0) {
parts[resultPartIndex] = toolResultPart;
} else {
parts.push(toolResultPart);
}
return { ...msg, parts };
});
}
function updateToolCallApproval(messages, messageId, toolCallId, approvalId) {
return messages.map((msg) => {
if (msg.id !== messageId) {
return msg;
}
const parts = [...msg.parts];
const toolCallPart = parts.find(
(p) => p.type === "tool-call" && p.id === toolCallId
);
if (toolCallPart) {
toolCallPart.state = "approval-requested";
toolCallPart.approval = {
id: approvalId,
needsApproval: true
};
}
return { ...msg, parts };
});
}
function updateToolCallWithOutput(messages, toolCallId, output, state, errorText) {
return messages.map((msg) => {
const parts = [...msg.parts];
const toolCallPart = parts.find(
(p) => p.type === "tool-call" && p.id === toolCallId
);
if (toolCallPart) {
toolCallPart.output = errorText ? { error: errorText } : output;
if (state) {
toolCallPart.state = state;
} else {
toolCallPart.state = "input-complete";
}
}
return { ...msg, parts };
});
}
function updateToolCallApprovalResponse(messages, approvalId, approved) {
return messages.map((msg) => {
const parts = [...msg.parts];
const toolCallPart = parts.find(
(p) => p.type === "tool-call" && p.approval?.id === approvalId
);
if (toolCallPart && toolCallPart.approval) {
toolCallPart.approval.approved = approved;
toolCallPart.state = "approval-responded";
}
return { ...msg, parts };
});
}
function updateThinkingPart(messages, messageId, content) {
return messages.map((msg) => {
if (msg.id !== messageId) {
return msg;
}
const parts = [...msg.parts];
const thinkingPartIndex = parts.findIndex((p) => p.type === "thinking");
const thinkingPart = {
type: "thinking",
content
};
if (thinkingPartIndex >= 0) {
parts[thinkingPartIndex] = thinkingPart;
} else {
parts.push(thinkingPart);
}
return { ...msg, parts };
});
}
export {
updateTextPart,
updateThinkingPart,
updateToolCallApproval,
updateToolCallApprovalResponse,
updateToolCallPart,
updateToolCallWithOutput,
updateToolResultPart
};
//# sourceMappingURL=message-updaters.js.map