forked from farhoodlabs/paperclip
11ffd6f2c5
## Thinking Path > - Paperclip orchestrates AI agents across several adapter implementations. > - ACPX is a local adapter path that can proxy Claude and Codex-style execution. > - Its configuration needed stronger schema defaults, provider-aware model handling, and better UI support. > - Plugin authors also need clear docs for managed resources. > - This pull request improves ACPX adapter configuration and documents plugin-managed resources. > - The benefit is a more predictable adapter setup path without changing unrelated control-plane behavior. ## What Changed - Improved ACPX config schema, execution config handling, UI build config, and route coverage. - Added ACPX model filtering support and tests. - Updated the agent config form and storybook coverage for ACPX model/provider behavior. - Expanded plugin authoring documentation for managed resources. ## Verification - `pnpm install --frozen-lockfile` - `pnpm exec vitest run server/src/__tests__/acpx-local-execute.test.ts server/src/__tests__/adapter-routes.test.ts ui/src/lib/acpx-model-filter.test.ts` ## Risks - Low-to-medium risk: adapter configuration behavior changes can affect ACPX users, but the change is isolated to ACPX/plugin-doc surfaces and covered by targeted adapter tests. ## Model Used - OpenAI GPT-5 Codex via Paperclip `codex_local` adapter, with shell/git/GitHub CLI tool use. ## Checklist - [x] I have included a thinking path that traces from project context to this change - [x] I have specified the model used (with version and capability details) - [x] I have checked ROADMAP.md and confirmed this PR does not duplicate planned core work - [x] I have run tests locally and they pass - [x] I have added or updated tests where applicable - [x] If this change affects the UI, I have included before/after screenshots - [x] I have updated relevant documentation to reflect my changes - [x] I have considered and documented any risks above - [x] I will address all Greptile and reviewer comments before requesting merge --------- Co-authored-by: Paperclip <noreply@paperclip.ing>
48 lines
1.4 KiB
TypeScript
48 lines
1.4 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import type { AdapterConfigSchema, ConfigFieldSchema } from "@paperclipai/adapter-utils";
|
|
import { fieldMatchesVisibleWhen } from "./schema-config-fields";
|
|
|
|
const sourceField: ConfigFieldSchema = {
|
|
key: "provider",
|
|
label: "Provider",
|
|
type: "select",
|
|
options: [
|
|
{ label: "Claude", value: "claude" },
|
|
{ label: "Codex", value: "codex" },
|
|
],
|
|
};
|
|
|
|
const schema: AdapterConfigSchema = {
|
|
fields: [sourceField],
|
|
};
|
|
|
|
function targetWithVisibleWhen(visibleWhen: Record<string, unknown>): ConfigFieldSchema {
|
|
return {
|
|
key: "model",
|
|
label: "Model",
|
|
type: "text",
|
|
meta: { visibleWhen },
|
|
};
|
|
}
|
|
|
|
describe("fieldMatchesVisibleWhen", () => {
|
|
it("treats an empty values array as no match", () => {
|
|
const field = targetWithVisibleWhen({ key: "provider", values: [] });
|
|
|
|
expect(fieldMatchesVisibleWhen(field, () => "claude", schema)).toBe(false);
|
|
});
|
|
|
|
it("treats all non-string values as no match", () => {
|
|
const field = targetWithVisibleWhen({ key: "provider", values: [null, 42] });
|
|
|
|
expect(fieldMatchesVisibleWhen(field, () => "claude", schema)).toBe(false);
|
|
});
|
|
|
|
it("matches non-empty string values", () => {
|
|
const field = targetWithVisibleWhen({ key: "provider", values: ["claude"] });
|
|
|
|
expect(fieldMatchesVisibleWhen(field, () => "claude", schema)).toBe(true);
|
|
expect(fieldMatchesVisibleWhen(field, () => "codex", schema)).toBe(false);
|
|
});
|
|
});
|