refactor(disambiguation): own F1 clarification policy (#27)
This commit is contained in:
@@ -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.`);
|
||||
|
||||
Reference in New Issue
Block a user