fix: clarify memory selection semantics
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
const test = require("node:test");
|
||||
const assert = require("node:assert");
|
||||
const { memorySelectionWidgetProps } = require("../../tht-gate.js");
|
||||
|
||||
test("F2 preseleziona solo le memory raccomandate e parla di applicazione", () => {
|
||||
assert.deepEqual(
|
||||
memorySelectionWidgetProps([
|
||||
{ id: "recommended", label: "Memory A", recommended: true },
|
||||
{ id: "optional", label: "Memory B" },
|
||||
]),
|
||||
{
|
||||
title: "Seleziona le memory da applicare alla domanda",
|
||||
selected: ["recommended"],
|
||||
selectionLabel: "memory da applicare",
|
||||
confirmLabel: "Applica le memory selezionate",
|
||||
},
|
||||
);
|
||||
});
|
||||
@@ -7,6 +7,13 @@ const { createFakePi } = require("./fake_pi_runtime.js");
|
||||
const installGate = require("../../tht-gate.js").default ?? require("../../tht-gate.js");
|
||||
|
||||
test("con THT_SESSION il kickoff usa l'id fornito e NON crea la sessione", async () => {
|
||||
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), "tht-gate-no-pack-"));
|
||||
const bin = path.join(tmp, "bin");
|
||||
fs.mkdirSync(bin);
|
||||
const tht = path.join(bin, "tht");
|
||||
fs.writeFileSync(tht, "#!/bin/sh\nexit 1\n", { mode: 0o755 });
|
||||
const oldPath = process.env.PATH;
|
||||
process.env.PATH = bin + ":" + oldPath;
|
||||
process.env.THT_SESSION = "2026-06-27-100000-test";
|
||||
try {
|
||||
const { pi, ctx } = createFakePi();
|
||||
@@ -19,13 +26,15 @@ test("con THT_SESSION il kickoff usa l'id fornito e NON crea la sessione", async
|
||||
assert.doesNotMatch(text, /tht session new/);
|
||||
assert.match(text, /retrieval pack non era ancora disponibile/i);
|
||||
assert.match(text, /tht search pack/);
|
||||
assert.doesNotMatch(text, /<retrieval-pack>/);
|
||||
assert.doesNotMatch(text, /<retrieval-pack>\s*# Retrieval pack/);
|
||||
assert.match(text, /<tht-sessione-skill>/);
|
||||
assert.match(text, /# Thoth session workflow \(phases 1-8\)/);
|
||||
assert.match(text, /non esplorare il repository/i);
|
||||
assert.doesNotMatch(text, /Carica la skill leggendo/);
|
||||
} finally {
|
||||
process.env.PATH = oldPath;
|
||||
delete process.env.THT_SESSION;
|
||||
fs.rmSync(tmp, { recursive: true, force: true });
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -61,6 +61,7 @@ function buildSelectRequest({
|
||||
// `allowEmpty:false` with zero options is a broken widget and throws.
|
||||
function buildMultiselectRequest({
|
||||
id, phase, title, options, content = null, selected = [], allowEmpty = false,
|
||||
selectionLabel, confirmLabel,
|
||||
}) {
|
||||
requireString(title, "title", "multiselect");
|
||||
const opts = requireArray(options, "options", "multiselect");
|
||||
@@ -77,10 +78,12 @@ function buildMultiselectRequest({
|
||||
widget: "multiselect",
|
||||
title,
|
||||
allow_empty: allowEmpty,
|
||||
options: [...opts],
|
||||
options: opts.map((option) => ({ ...option, selected: selected.includes(option.id) })),
|
||||
selected: [...selected],
|
||||
content,
|
||||
reserved: RESERVED,
|
||||
...(selectionLabel ? { selection_label: selectionLabel } : {}),
|
||||
...(confirmLabel ? { confirm_label: confirmLabel } : {}),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user