Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions packages/contracts/src/settings.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import * as Schema from "effect/Schema";
import { ProviderInstanceId } from "./providerInstance.ts";
import {
ClientSettingsSchema,
CursorSettings,
DEFAULT_SERVER_SETTINGS,
ServerSettings,
ServerSettingsPatch,
Expand Down Expand Up @@ -129,6 +130,24 @@ describe("ServerSettingsPatch.providerInstances", () => {
});
});

describe("CursorSettings binary path", () => {
const decodeCursorSettings = Schema.decodeUnknownSync(CursorSettings);

it("defaults to cursor-agent", () => {
expect(decodeCursorSettings({}).binaryPath).toBe("cursor-agent");
});

it("maps the legacy agent binary name to cursor-agent", () => {
expect(decodeCursorSettings({ binaryPath: "agent" }).binaryPath).toBe("cursor-agent");
});

it("preserves explicit binary paths", () => {
expect(decodeCursorSettings({ binaryPath: "/usr/local/bin/agent" }).binaryPath).toBe(
"/usr/local/bin/agent",
);
});
});

describe("ServerSettingsPatch string normalization", () => {
it("trims string settings while decoding patches", () => {
const patch = decodeServerSettingsPatch({
Expand Down
21 changes: 20 additions & 1 deletion packages/contracts/src/settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,25 @@ const makeBinaryPathSetting = (fallback: string) =>
Schema.withDecodingDefault(Effect.succeed(fallback)),
);

export const LEGACY_CURSOR_BINARY_PATH = "agent";
export const DEFAULT_CURSOR_BINARY_PATH = "cursor-agent";

export const normalizeCursorBinaryPath = (value: string): string =>
value === LEGACY_CURSOR_BINARY_PATH ? DEFAULT_CURSOR_BINARY_PATH : value;

const makeCursorBinaryPathSetting = () =>
TrimmedString.pipe(
Schema.decodeTo(
Schema.String,
SchemaTransformation.transformOrFail({
decode: (value) =>
Effect.succeed(normalizeCursorBinaryPath(value || DEFAULT_CURSOR_BINARY_PATH)),
encode: (value) => Effect.succeed(value),
}),
),
Schema.withDecodingDefault(Effect.succeed(DEFAULT_CURSOR_BINARY_PATH)),
);

export type ProviderSettingsFormControl = "text" | "password" | "textarea" | "switch";

export interface ProviderSettingsFormAnnotation {
Expand Down Expand Up @@ -252,7 +271,7 @@ export const CursorSettings = makeProviderSettingsSchema(
Schema.withDecodingDefault(Effect.succeed(false)),
Schema.annotateKey({ providerSettingsForm: { hidden: true } }),
),
binaryPath: makeBinaryPathSetting("cursor-agent").pipe(
binaryPath: makeCursorBinaryPathSetting().pipe(
Schema.annotateKey({
title: "Binary path",
description: "Path to the Cursor agent binary.",
Expand Down
Loading