feat(confidence-engine): add focused finding handoff plumbing
This commit is contained in:
@@ -33,7 +33,7 @@ export async function submitScenarioForStartCase(fetchImpl, scenario) {
|
||||
|
||||
export async function submitAnswerForUpdateCase(
|
||||
fetchImpl,
|
||||
{ situationGraph, previousQuestion, answer },
|
||||
{ situationGraph, previousQuestion, answer, findings },
|
||||
) {
|
||||
if (!answer?.trim()) {
|
||||
return {
|
||||
@@ -47,10 +47,15 @@ export async function submitAnswerForUpdateCase(
|
||||
};
|
||||
}
|
||||
|
||||
const body = { situationGraph, previousQuestion, answer };
|
||||
if (findings && findings.length > 0) {
|
||||
body.findings = findings;
|
||||
}
|
||||
|
||||
const response = await fetchImpl("/api/cases/update", {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ situationGraph, previousQuestion, answer }),
|
||||
body: JSON.stringify(body),
|
||||
});
|
||||
|
||||
return {
|
||||
@@ -255,6 +260,15 @@ export default function ScenarioForm() {
|
||||
/* ── RTO.31: focused contributions ownership ─────────────── */
|
||||
const [focusedContributions, setFocusedContributions] = useState([]);
|
||||
|
||||
/* ── v2 findings from focused contributions ─────────────── */
|
||||
const [findings, setFindings] = useState([]);
|
||||
|
||||
function appendFinding(finding) {
|
||||
setFindings((prev) => {
|
||||
return [...prev, finding];
|
||||
});
|
||||
}
|
||||
|
||||
function appendFocusedContribution(contribution) {
|
||||
setFocusedContributions((prev) => {
|
||||
const seq = prev.length + 1;
|
||||
@@ -280,6 +294,7 @@ export default function ScenarioForm() {
|
||||
setResult(hasGraph ? { ...saved, situationGraph: saved.situationGraph } : null);
|
||||
setCurrentUnderstanding(saved.summary || null);
|
||||
setFocusedContributions(saved.focusedContributions || []);
|
||||
setFindings(saved.findings || []);
|
||||
|
||||
// Partial sessions (present but no graph) must NOT suppress the
|
||||
// scenario-entry form. Only promote to success when there is actual
|
||||
@@ -364,7 +379,7 @@ export default function ScenarioForm() {
|
||||
setCurrentUnderstanding(data.summary ?? null);
|
||||
const normalised = normaliseStartResult(data);
|
||||
setResult(normalised);
|
||||
saveSession({ scenario, situationGraph: normalised.situationGraph, selectedQuestion: normalised.selectedQuestion, summary: data.summary ?? null, updatedAt: new Date().toISOString(), focusedContributions });
|
||||
saveSession({ scenario, situationGraph: normalised.situationGraph, selectedQuestion: normalised.selectedQuestion, summary: data.summary ?? null, updatedAt: new Date().toISOString(), focusedContributions, findings: [] });
|
||||
} else {
|
||||
setStatus("error");
|
||||
setCurrentUnderstanding(data.summary ?? null);
|
||||
@@ -397,6 +412,7 @@ export default function ScenarioForm() {
|
||||
situationGraph: result?.situationGraph,
|
||||
previousQuestion: result?.selectedQuestion,
|
||||
answer,
|
||||
findings,
|
||||
});
|
||||
|
||||
if (submission.skipped) {
|
||||
@@ -409,6 +425,12 @@ export default function ScenarioForm() {
|
||||
const outcome = submission.data;
|
||||
|
||||
if (submission.ok && outcome.success) {
|
||||
// Merge server-returned findings with local state
|
||||
let newFindings = [...findings];
|
||||
if (outcome.appendedFindings && Array.isArray(outcome.appendedFindings)) {
|
||||
newFindings = [...newFindings, ...outcome.appendedFindings];
|
||||
}
|
||||
|
||||
setUpdateStatus("success");
|
||||
setCurrentUnderstanding(
|
||||
outcome.summary ? outcome.summary : currentUnderstanding,
|
||||
@@ -429,8 +451,8 @@ export default function ScenarioForm() {
|
||||
diagnostics: outcome.diagnostics,
|
||||
}));
|
||||
setAnswer("");
|
||||
// Persist after successful update turn
|
||||
saveSession({ scenario, situationGraph: outcome.updatedSituationGraph, selectedQuestion: normaliseUpdateSelectedQuestion(outcome.selectedQuestion), summary: outcome.summary ?? currentUnderstanding, updatedAt: new Date().toISOString(), focusedContributions });
|
||||
// Persist after successful update turn — include findings
|
||||
saveSession({ scenario, situationGraph: outcome.updatedSituationGraph, selectedQuestion: normaliseUpdateSelectedQuestion(outcome.selectedQuestion), summary: outcome.summary ?? currentUnderstanding, updatedAt: new Date().toISOString(), focusedContributions, findings: newFindings });
|
||||
} else {
|
||||
setUpdateStatus("error");
|
||||
setUpdateError(outcome);
|
||||
@@ -588,6 +610,7 @@ export default function ScenarioForm() {
|
||||
lastSubmittedAnswer={lastSubmittedAnswer}
|
||||
focusedContributions={focusedContributions}
|
||||
onFocusedContribution={appendFocusedContribution}
|
||||
findings={findings}
|
||||
onRestart={() => {
|
||||
clearSession();
|
||||
setStatus("idle");
|
||||
@@ -599,6 +622,7 @@ export default function ScenarioForm() {
|
||||
setCurrentUnderstanding(null);
|
||||
setUpdateError(null);
|
||||
setFocusedContributions([]);
|
||||
setFindings([]);
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
@@ -608,7 +632,7 @@ export default function ScenarioForm() {
|
||||
|
||||
{/* ── Continue later banner when session was restored ── */}
|
||||
{status === "success" && result?.updatedAt && (
|
||||
<ContinueLaterBanner onRestart={() => { clearSession(); setStatus("idle"); setResult(null); setAnswer(""); setUpdateStatus("idle"); setCurrentUnderstanding(null); setFocusedContributions([]); }} />
|
||||
<ContinueLaterBanner onRestart={() => { clearSession(); setStatus("idle"); setResult(null); setAnswer(""); setUpdateStatus("idle"); setCurrentUnderstanding(null); setFocusedContributions([]); setFindings([]); }} />
|
||||
)}
|
||||
|
||||
{/* Reset button after successful analysis */}
|
||||
@@ -627,6 +651,7 @@ export default function ScenarioForm() {
|
||||
setCurrentUnderstanding(null);
|
||||
setUpdateError(null);
|
||||
setFocusedContributions([]);
|
||||
setFindings([]);
|
||||
}}
|
||||
className="rounded-lg border border-gray-200/60 px-4 py-2 text-sm font-medium text-gray-500 transition hover:bg-gray-50/80"
|
||||
>
|
||||
|
||||
Reference in New Issue
Block a user