refactor(disambiguation): own F1 clarification policy (#27)

This commit is contained in:
2026-08-24 01:55:42 +02:00
parent 2ed55ef131
commit 1e459b073e
3 changed files with 327 additions and 34 deletions
+18 -34
View File
@@ -626,6 +626,9 @@ export default function (pi) {
lockActive = true;
},
phase: (ctx, session) => ({ number: currentPhase(ctx, session) }),
describe: (ctx, session) => phaseId(ctx, currentPhase(ctx, session)),
decisionTypes: knownDecisionTypes,
decisionMinimumPhases: decisionMinPhaseMap,
advance: advancePhaseAndFinalize,
},
session: {
@@ -638,6 +641,10 @@ export default function (pi) {
ctx, decisionAddArgs(session, decision), recovery,
),
},
reviewer: {
buildSelect: buildSelectRequest,
isReserved,
},
toTextResult: textResult,
});
@@ -828,49 +835,26 @@ export default function (pi) {
intro: Type.Optional(Type.String()),
advance: Type.Optional(Type.Boolean()),
}),
prepareArguments: prepareReviewerArguments,
prepareArguments: disambiguationGate.prepareClarificationArguments,
async execute(_id, params, _signal, _onUpdate, ctx) {
lockActive = true;
try {
const { session, title, options: opts, intro, advance } = params;
const typeErr = validateDecisionTypes(ctx, opts, session);
if (typeErr) return textResult(typeErr);
const phase = phaseId(ctx, currentPhase(ctx, session));
const recommended = opts.find((o) => o.recommended)?.id ?? null;
const widget = buildSelectRequest({
id: `u${Date.now()}`,
phase,
title,
intro: intro ?? null,
recommended,
options: opts
.filter((o) => !isReserved(o.label))
.map((o) => ({ id: o.id, label: o.label })),
});
const resp = await emitAndWait(ctx, widget);
const outcome = resolveSelectOutcome(opts, resp);
if (outcome.kind === "freetext")
return textResult(`Altro (reviewer): ${outcome.text}`);
if (outcome.kind === "back")
return textResult("Il reviewer vuole tornare indietro.");
if (outcome.kind === "exit")
return textResult("Il reviewer vuole uscire.");
if (outcome.kind === "decision") {
const prepared = disambiguationGate.prepareClarification(
ctx, params, `u${Date.now()}`,
);
if (prepared.result) return prepared.result;
const response = await emitAndWait(ctx, prepared.widget);
const outcome = disambiguationGate.resolveClarification(prepared, response);
if (outcome.decision) {
const err = relayIfThtFails(
ctx,
decisionAddArgs(session, outcome.decision),
decisionAddArgs(prepared.session, outcome.decision),
"",
);
if (err) return err;
if (advance) advanceIfReady(ctx, session);
return textResult(
decisionRecordedResultText(outcome.decision, outcome.option),
);
if (prepared.advance) advanceIfReady(ctx, prepared.session);
}
return textResult(
`Scelta del reviewer: ${outcome.option ? outcome.option.label : outcome.choice}`,
);
return textResult(outcome.text);
} catch (fatal) {
const msg = (fatal.stderr || fatal.message || String(fatal)).toString().trim();
return textResult(`[reviewer_select ERRORE INTERNO] ${msg}. Riprova o usa un approccio diverso.`);