From 2633b4619981c665abac4945b33b95dfb462d7e3 Mon Sep 17 00:00:00 2001 From: mptyl Date: Thu, 2 Jul 2026 18:27:11 +0200 Subject: [PATCH] fix(gate): buildArtifactGate emits approve/reject options so the gate renders a forward button --- .../gate/__tests__/builders.test.js | 25 +++++++++++++++++++ harness/.pi/extensions/gate/builders.js | 9 +++++++ 2 files changed, 34 insertions(+) diff --git a/harness/.pi/extensions/gate/__tests__/builders.test.js b/harness/.pi/extensions/gate/__tests__/builders.test.js index 612fb3ea..d3884314 100644 --- a/harness/.pi/extensions/gate/__tests__/builders.test.js +++ b/harness/.pi/extensions/gate/__tests__/builders.test.js @@ -159,3 +159,28 @@ test("artifact-gate with unknown action kind throws clearly", () => { /action/i, ); }); + +test("buildArtifactGate derives approve/reject options from action.kind", () => { + const w = buildArtifactGate({ + id: "u1", + phase: "F1", + title: "Chiudi fase", + artifact: { kind: "phase", data: {} }, + action: { kind: "approve_reject" }, + }); + assert.deepEqual(w.options, [ + { id: "approve", label: "Conferma e prosegui", recommended: true }, + { id: "reject", label: "Rifiuta" }, + ]); +}); + +test("buildArtifactGate: confirm -> single approve; view_only -> no options", () => { + const confirm = buildArtifactGate({ + id: "u1", phase: "F1", title: "t", artifact: { kind: "phase", data: {} }, action: { kind: "confirm" }, + }); + assert.deepEqual(confirm.options, [{ id: "approve", label: "Conferma e prosegui", recommended: true }]); + const viewOnly = buildArtifactGate({ + id: "u1", phase: "F1", title: "t", artifact: { kind: "phase", data: {} }, action: { kind: "view_only" }, + }); + assert.deepEqual(viewOnly.options, []); +}); diff --git a/harness/.pi/extensions/gate/builders.js b/harness/.pi/extensions/gate/builders.js index 912ac766..3cedfa8e 100644 --- a/harness/.pi/extensions/gate/builders.js +++ b/harness/.pi/extensions/gate/builders.js @@ -112,6 +112,14 @@ function buildArtifactGate({ id, phase, title, artifact, action }) { `builders: artifact-gate action.kind must be one of ${[...VALID_ACTION_KINDS].join(", ")}`, ); } + const ACTION_OPTIONS = { + approve_reject: [ + { id: "approve", label: "Conferma e prosegui", recommended: true }, + { id: "reject", label: "Rifiuta" }, + ], + confirm: [{ id: "approve", label: "Conferma e prosegui", recommended: true }], + view_only: [], + }; return { type: "ui_request", id, @@ -121,6 +129,7 @@ function buildArtifactGate({ id, phase, title, artifact, action }) { title, artifact, action, + options: ACTION_OPTIONS[action.kind], reserved: RESERVED, }; }