mirror of
https://github.com/getpaseo/paseo.git
synced 2026-11-03 07:03:18 +00:00
The agent snapshot's `options` are the state and `controls` only draw them. Running and closed agents draw from the snapshot; drafts and profile forms ask `provider.controls.list.request` with their `providerOptions`, so aliases such as a legacy Fast profile's `service_tier: "fast"` are resolved once, by the daemon, and the draft keeps Fast highlighted. A draft adds only the user's edits and each provider's last-used control values; applying a profile seeds its non-control options (e.g. `sandbox_mode`) into the draft, and a profile form saves them back instead of pruning to the controls it can draw. A daemon without `server_info.features.providerOptionControls` still sends `features` and `featureValues`. `LegacyProviderOptions` in the client package is the one place that translates snapshots, draft listings, create and apply requests, and daemon-config profiles, so the app never branches on it. Persisted preferences and tab layouts rename `featureValues` through tagged COMPAT preprocessors. The features/controls bridge moves from the server into the protocol package so the client can reuse it.
51 lines
1.9 KiB
TypeScript
51 lines
1.9 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import type { AgentOptionControl } from "@getpaseo/protocol/agent-types";
|
|
import {
|
|
getControlTooltip,
|
|
isControlActive,
|
|
readSelectOption,
|
|
readToggleOption,
|
|
} from "./option-controls";
|
|
|
|
const speed: AgentOptionControl = {
|
|
type: "select",
|
|
key: "service_tier",
|
|
label: "Speed",
|
|
defaultValue: "default",
|
|
choices: [
|
|
{ value: "default", label: "Normal" },
|
|
{ value: "priority", label: "Fast" },
|
|
],
|
|
};
|
|
const fast: AgentOptionControl = { type: "toggle", key: "fast_mode", label: "Fast" };
|
|
|
|
describe("option controls", () => {
|
|
it("reads a select from options and falls back to the control's default", () => {
|
|
if (speed.type !== "select") throw new Error("select expected");
|
|
expect(readSelectOption(speed, { service_tier: "priority" })).toBe("priority");
|
|
expect(readSelectOption(speed, {})).toBe("default");
|
|
expect(readSelectOption(speed, { service_tier: "unknown-tier" })).toBe("default");
|
|
});
|
|
|
|
it("reads a toggle from options and is off when unset", () => {
|
|
if (fast.type !== "toggle") throw new Error("toggle expected");
|
|
expect(readToggleOption(fast, { fast_mode: true })).toBe(true);
|
|
expect(readToggleOption(fast, {})).toBe(false);
|
|
});
|
|
|
|
it("is active when the option differs from the control's default", () => {
|
|
expect(isControlActive(speed, { service_tier: "priority" })).toBe(true);
|
|
expect(isControlActive(speed, { service_tier: "default" })).toBe(false);
|
|
expect(isControlActive(speed, {})).toBe(false);
|
|
expect(isControlActive(fast, { fast_mode: true })).toBe(true);
|
|
expect(isControlActive(fast, {})).toBe(false);
|
|
});
|
|
|
|
it("prefers a control's tooltip over its label", () => {
|
|
expect(getControlTooltip({ label: "Plan", tooltip: "Toggle plan mode" })).toBe(
|
|
"Toggle plan mode",
|
|
);
|
|
expect(getControlTooltip({ label: "Custom" })).toBe("Custom");
|
|
});
|
|
});
|