306 lines
9.2 KiB
JavaScript
306 lines
9.2 KiB
JavaScript
|
|
import assert from "node:assert/strict";
|
||
|
|
import test from "node:test";
|
||
|
|
|
||
|
|
import {
|
||
|
|
FOUNDATION_FLAG,
|
||
|
|
FRIENDLY_MODES_FLAG,
|
||
|
|
MODE_ORDER,
|
||
|
|
buildModeRequest,
|
||
|
|
createFriendlyModesAdapter,
|
||
|
|
friendlyModesEnabled,
|
||
|
|
normalizeAdvancedRoutes,
|
||
|
|
normalizeMode,
|
||
|
|
normalizeModeCatalog,
|
||
|
|
normalizeResolvedRoute,
|
||
|
|
} from "../../dockerfiles/hermes-webui-hux/modes/model.ts";
|
||
|
|
|
||
|
|
const constraints = (providers, localOnly = false) => ({
|
||
|
|
providers,
|
||
|
|
local_only: localOnly,
|
||
|
|
effort: { min: "low", max: "high" },
|
||
|
|
tools: {
|
||
|
|
web: "allowed",
|
||
|
|
shell: "allowed",
|
||
|
|
artifacts: "allowed",
|
||
|
|
delegate: "allowed",
|
||
|
|
},
|
||
|
|
memory: { read: true, write: true },
|
||
|
|
citations_required: false,
|
||
|
|
retention: "default",
|
||
|
|
});
|
||
|
|
|
||
|
|
const labels = {
|
||
|
|
fast: "Fast",
|
||
|
|
thoughtful: "Thoughtful",
|
||
|
|
research: "Research",
|
||
|
|
create: "Create",
|
||
|
|
private: "Private",
|
||
|
|
};
|
||
|
|
|
||
|
|
function mode(name, extra = {}) {
|
||
|
|
const isPrivate = name === "private";
|
||
|
|
return {
|
||
|
|
schema: "hux.mode.v1",
|
||
|
|
mode: name,
|
||
|
|
label: labels[name],
|
||
|
|
intent: `${labels[name]} response intent`,
|
||
|
|
constraints: constraints(
|
||
|
|
isPrivate ? ["local"] : ["claude", "codex"],
|
||
|
|
isPrivate,
|
||
|
|
),
|
||
|
|
switchyard: { route_id: `atlas/auto/${name}` },
|
||
|
|
...extra,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
const catalog = () => MODE_ORDER.map((name) => mode(name));
|
||
|
|
|
||
|
|
test("friendly modes remain default-off and depend on HUX foundation", () => {
|
||
|
|
assert.equal(friendlyModesEnabled(), false);
|
||
|
|
assert.equal(friendlyModesEnabled([]), false);
|
||
|
|
assert.equal(friendlyModesEnabled([FOUNDATION_FLAG]), false);
|
||
|
|
assert.equal(friendlyModesEnabled([FRIENDLY_MODES_FLAG]), false);
|
||
|
|
assert.equal(
|
||
|
|
friendlyModesEnabled([FOUNDATION_FLAG, FRIENDLY_MODES_FLAG]),
|
||
|
|
true,
|
||
|
|
);
|
||
|
|
});
|
||
|
|
|
||
|
|
test("valid catalog is canonical and automatic modes preserve both pools", () => {
|
||
|
|
const normalized = normalizeModeCatalog(catalog());
|
||
|
|
assert.ok(normalized);
|
||
|
|
assert.deepEqual(normalized.map((item) => item.mode), MODE_ORDER);
|
||
|
|
for (const intent of normalized.slice(0, -1)) {
|
||
|
|
assert.deepEqual(intent.constraints.providers, ["codex", "claude"]);
|
||
|
|
assert.equal(intent.constraints.local_only, false);
|
||
|
|
assert.match(intent.switchyard.route_id, /^atlas\/auto\//);
|
||
|
|
assert.equal("override_route_id" in intent.switchyard, false);
|
||
|
|
}
|
||
|
|
assert.deepEqual(normalized.at(-1).constraints.providers, ["local"]);
|
||
|
|
assert.equal(normalized.at(-1).constraints.local_only, true);
|
||
|
|
});
|
||
|
|
|
||
|
|
test("catalog rejects missing, duplicate, and malformed entries", () => {
|
||
|
|
assert.equal(normalizeModeCatalog({}), null);
|
||
|
|
assert.equal(normalizeModeCatalog(catalog().slice(1)), null);
|
||
|
|
assert.equal(normalizeModeCatalog([...catalog().slice(0, 4), mode("fast")]), null);
|
||
|
|
assert.equal(normalizeModeCatalog([...catalog().slice(0, 4), null]), null);
|
||
|
|
});
|
||
|
|
|
||
|
|
test("mode validation is exact and fail-closed", () => {
|
||
|
|
assert.equal(normalizeMode(null), null);
|
||
|
|
assert.equal(normalizeMode({ ...mode("fast"), surprise: true }), null);
|
||
|
|
assert.equal(normalizeMode({ ...mode("fast"), schema: "hux.mode.v0" }), null);
|
||
|
|
assert.equal(normalizeMode({ ...mode("fast"), mode: "turbo" }), null);
|
||
|
|
assert.equal(normalizeMode({ ...mode("fast"), label: "Claude Fast" }), null);
|
||
|
|
assert.equal(normalizeMode({ ...mode("fast"), intent: "" }), null);
|
||
|
|
assert.equal(normalizeMode({ ...mode("fast"), intent: "x".repeat(401) }), null);
|
||
|
|
assert.equal(
|
||
|
|
normalizeMode({ ...mode("fast"), switchyard: { route_id: "vendor/default" } }),
|
||
|
|
null,
|
||
|
|
);
|
||
|
|
assert.equal(
|
||
|
|
normalizeMode({
|
||
|
|
...mode("fast"),
|
||
|
|
switchyard: { route_id: "atlas/auto/claude/fast" },
|
||
|
|
}),
|
||
|
|
null,
|
||
|
|
);
|
||
|
|
assert.equal(
|
||
|
|
normalizeMode({ ...mode("fast"), intent: "Prefer OpenAI for this mode" }),
|
||
|
|
null,
|
||
|
|
);
|
||
|
|
assert.equal(
|
||
|
|
normalizeMode({
|
||
|
|
...mode("fast"),
|
||
|
|
switchyard: {
|
||
|
|
route_id: "atlas/auto/fast",
|
||
|
|
override_route_id: "atlas/manual/codex/high",
|
||
|
|
},
|
||
|
|
}),
|
||
|
|
null,
|
||
|
|
);
|
||
|
|
});
|
||
|
|
|
||
|
|
test("constraint validation rejects provider bias and malformed nested policy", () => {
|
||
|
|
const invalid = [
|
||
|
|
constraints([], false),
|
||
|
|
constraints(["codex"], false),
|
||
|
|
constraints(["claude"], false),
|
||
|
|
constraints(["codex", "codex"], false),
|
||
|
|
constraints(["codex", "unknown"], false),
|
||
|
|
{ ...constraints(["codex", "claude"]), local_only: true },
|
||
|
|
{ ...constraints(["codex", "claude"]), effort: { min: "high", max: "low" } },
|
||
|
|
{ ...constraints(["codex", "claude"]), tools: null },
|
||
|
|
{
|
||
|
|
...constraints(["codex", "claude"]),
|
||
|
|
tools: { ...constraints([]).tools, web: "sometimes" },
|
||
|
|
},
|
||
|
|
{ ...constraints(["codex", "claude"]), memory: { read: true } },
|
||
|
|
{ ...constraints(["codex", "claude"]), citations_required: "no" },
|
||
|
|
{ ...constraints(["codex", "claude"]), retention: "forever" },
|
||
|
|
{ ...constraints(["codex", "claude"]), secret: "value" },
|
||
|
|
];
|
||
|
|
for (const value of invalid) {
|
||
|
|
assert.equal(normalizeMode({ ...mode("fast"), constraints: value }), null);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
test("Private is strictly local-only while non-private can include local", () => {
|
||
|
|
assert.equal(
|
||
|
|
normalizeMode({ ...mode("private"), constraints: constraints(["codex"], true) }),
|
||
|
|
null,
|
||
|
|
);
|
||
|
|
assert.equal(
|
||
|
|
normalizeMode({ ...mode("private"), constraints: constraints(["local"], false) }),
|
||
|
|
null,
|
||
|
|
);
|
||
|
|
assert.ok(
|
||
|
|
normalizeMode({
|
||
|
|
...mode("research"),
|
||
|
|
constraints: constraints(["local", "claude", "codex"]),
|
||
|
|
}),
|
||
|
|
);
|
||
|
|
});
|
||
|
|
|
||
|
|
test("advanced catalog keeps only bounded exact manual route choices", () => {
|
||
|
|
const raw = [
|
||
|
|
{
|
||
|
|
route_id: "atlas/manual/codex/high",
|
||
|
|
label: "Deep route",
|
||
|
|
provider: "codex",
|
||
|
|
effort: "high",
|
||
|
|
local_only: false,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
route_id: "atlas/manual/local/private",
|
||
|
|
label: "Local route",
|
||
|
|
provider: "local",
|
||
|
|
effort: "medium",
|
||
|
|
local_only: true,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
route_id: "atlas/auto/claude/high",
|
||
|
|
label: "Not a pin",
|
||
|
|
provider: "claude",
|
||
|
|
effort: "high",
|
||
|
|
local_only: false,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
route_id: "atlas/manual/codex/high",
|
||
|
|
label: "Duplicate",
|
||
|
|
provider: "codex",
|
||
|
|
effort: "high",
|
||
|
|
local_only: false,
|
||
|
|
},
|
||
|
|
null,
|
||
|
|
];
|
||
|
|
assert.deepEqual(normalizeAdvancedRoutes({}), []);
|
||
|
|
assert.deepEqual(
|
||
|
|
normalizeAdvancedRoutes(raw).map((choice) => choice.routeId),
|
||
|
|
["atlas/manual/codex/high", "atlas/manual/local/private"],
|
||
|
|
);
|
||
|
|
});
|
||
|
|
|
||
|
|
test("exact pin is created only from an explicit compatible advanced choice", () => {
|
||
|
|
const automatic = normalizeMode(mode("fast"));
|
||
|
|
const privateMode = normalizeMode(mode("private"));
|
||
|
|
const choices = normalizeAdvancedRoutes([
|
||
|
|
{
|
||
|
|
route_id: "atlas/manual/codex/high",
|
||
|
|
label: "OpenAI high",
|
||
|
|
provider: "codex",
|
||
|
|
effort: "high",
|
||
|
|
local_only: false,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
route_id: "atlas/manual/local/private",
|
||
|
|
label: "Local",
|
||
|
|
provider: "local",
|
||
|
|
effort: "medium",
|
||
|
|
local_only: true,
|
||
|
|
},
|
||
|
|
]);
|
||
|
|
assert.deepEqual(buildModeRequest(automatic), automatic);
|
||
|
|
assert.equal(buildModeRequest(null), null);
|
||
|
|
assert.equal(buildModeRequest(automatic, "atlas/manual/unknown", choices), null);
|
||
|
|
assert.equal(
|
||
|
|
buildModeRequest(automatic, "atlas/manual/local/private", choices),
|
||
|
|
null,
|
||
|
|
);
|
||
|
|
assert.equal(
|
||
|
|
buildModeRequest(privateMode, "atlas/manual/codex/high", choices),
|
||
|
|
null,
|
||
|
|
);
|
||
|
|
assert.equal(
|
||
|
|
buildModeRequest(privateMode, "atlas/manual/local/private", choices)
|
||
|
|
.switchyard.override_route_id,
|
||
|
|
"atlas/manual/local/private",
|
||
|
|
);
|
||
|
|
assert.equal(
|
||
|
|
buildModeRequest(automatic, "atlas/manual/codex/high", choices).switchyard
|
||
|
|
.override_route_id,
|
||
|
|
"atlas/manual/codex/high",
|
||
|
|
);
|
||
|
|
});
|
||
|
|
|
||
|
|
test("resolved route disclosure validates the shared hux.v1 route shape", () => {
|
||
|
|
assert.deepEqual(
|
||
|
|
normalizeResolvedRoute({
|
||
|
|
requested: "fast",
|
||
|
|
resolved_target: "route/codex/luna/low",
|
||
|
|
provider: "codex",
|
||
|
|
effort: "low",
|
||
|
|
}),
|
||
|
|
{
|
||
|
|
requested: "fast",
|
||
|
|
target: "route/codex/luna/low",
|
||
|
|
provider: "codex",
|
||
|
|
effort: "low",
|
||
|
|
},
|
||
|
|
);
|
||
|
|
assert.deepEqual(normalizeResolvedRoute({ requested: "private" }), {
|
||
|
|
requested: "private",
|
||
|
|
target: undefined,
|
||
|
|
provider: undefined,
|
||
|
|
effort: undefined,
|
||
|
|
});
|
||
|
|
for (const invalid of [
|
||
|
|
null,
|
||
|
|
{},
|
||
|
|
{ requested: "" },
|
||
|
|
{ requested: "fast", provider: "gemini" },
|
||
|
|
{ requested: "fast", effort: "ultra" },
|
||
|
|
{ requested: "fast", raw: "secret" },
|
||
|
|
{ requested: "fast", resolved_target: 7 },
|
||
|
|
]) {
|
||
|
|
assert.equal(normalizeResolvedRoute(invalid), null);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
test("foundation adapter preserves version, flags, endpoint, and validators", () => {
|
||
|
|
const calls = [];
|
||
|
|
const foundation = {
|
||
|
|
apiVersion: "hux.v1",
|
||
|
|
enabled: (flag) => flag === FOUNDATION_FLAG || flag === FRIENDLY_MODES_FLAG,
|
||
|
|
endpoint: (path) => (calls.push(path), `/hux/v1${path}`),
|
||
|
|
};
|
||
|
|
const adapter = createFriendlyModesAdapter(foundation);
|
||
|
|
assert.equal(adapter.apiVersion, "hux.v1");
|
||
|
|
assert.equal(adapter.enabled(), true);
|
||
|
|
assert.equal(adapter.endpoint(), "/hux/v1/modes");
|
||
|
|
assert.deepEqual(calls, ["/modes"]);
|
||
|
|
assert.ok(adapter.adaptCatalog(catalog()));
|
||
|
|
assert.equal(adapter.adaptResolvedRoute({}), null);
|
||
|
|
assert.ok(adapter.buildRequest(normalizeMode(mode("fast"))));
|
||
|
|
assert.throws(() => createFriendlyModesAdapter(null), TypeError);
|
||
|
|
assert.throws(
|
||
|
|
() => createFriendlyModesAdapter({ ...foundation, apiVersion: "hux.v0" }),
|
||
|
|
TypeError,
|
||
|
|
);
|
||
|
|
assert.equal(
|
||
|
|
createFriendlyModesAdapter({ ...foundation, enabled: () => false }).enabled(),
|
||
|
|
false,
|
||
|
|
);
|
||
|
|
});
|