diff --git a/components/reasoning-workspace.jsx b/components/reasoning-workspace.jsx index a631010..3ee8e19 100644 --- a/components/reasoning-workspace.jsx +++ b/components/reasoning-workspace.jsx @@ -250,6 +250,89 @@ function LoadingOverlay({ isLoading, elapsed, currentMessage, variant }) { ); } +// ── Update acknowledgement ──────────────────────────────────── +function UpdateAcknowledgement({ answer, updateResult }) { + if (!updateResult || !answer?.trim()) return null; + + const hasResolvedNodes = + updateResult.resolvedUnknownNodeIds && updateResult.resolvedUnknownNodeIds.length > 0; + const hasAffectedNodes = + updateResult.affectedNodeIds && updateResult.affectedNodeIds.length > 0; + const graph = updateResult.updatedSituationGraph; + + function getNodeText(nodeId) { + if (!graph?.nodes) return String(nodeId); + const node = graph.nodes.find((n) => n.id === nodeId); + if (node) { + const parts = [node.label]; + if (node.status !== "resolved") { + parts.push(node.status); + } + return parts.join(" "); + } + return String(nodeId); + } + + let changedText; + if (hasResolvedNodes || hasAffectedNodes) { + const items = []; + if (hasResolvedNodes) { + for (const id of updateResult.resolvedUnknownNodeIds.slice(0, 5)) { + items.push(getNodeText(id)); + } + if (updateResult.resolvedUnknownNodeIds.length > 5) { + items.push(`and ${updateResult.resolvedUnknownNodeIds.length - 5} more resolved`); + } + } + if (hasAffectedNodes && !hasResolvedNodes) { + for (const id of updateResult.affectedNodeIds.slice(0, 5)) { + items.push(getNodeText(id)); + } + if (updateResult.affectedNodeIds.length > 5) { + items.push(`and ${updateResult.affectedNodeIds.length - 5} more affected`); + } + } + if (items.length === 0 && updateResult.changesApplied) { + const parts = []; + const ca = updateResult.changesApplied; + if (ca.addedNodeCount) parts.push(`${ca.addedNodeCount} node(s) added`); + if (ca.updatedNodeCount) parts.push(`${ca.updatedNodeCount} node(s) updated`); + if (ca.resolvedUnknownCount) parts.push(`${ca.resolvedUnknownCount} unknown(s) resolved`); + changedText = parts.join(", "); + } else { + changedText = items.join(". ") + "."; + } + } else if (updateResult.changesApplied) { + const ca = updateResult.changesApplied; + const parts = []; + if (ca.addedNodeCount) parts.push(`${ca.addedNodeCount} node(s) added`); + if (ca.updatedNodeCount) parts.push(`${ca.updatedNodeCount} node(s) updated`); + if (ca.addedEdgeCount) parts.push(`${ca.addedEdgeCount} edge(s) added`); + if (ca.removedEdgeCount) parts.push(`${ca.removedEdgeCount} edge(s) removed`); + changedText = parts.length > 0 ? parts.join(", ") : null; + } + + const summary = updateResult.summary || null; + const displayChanged = summary || changedText || "Your answer has been added to the investigation."; + + return ( +
{answer}
+{displayChanged}
+There is no further question the engine can justify at the moment.
More evidence may be needed before a next step is clear.