mirror of
https://github.com/alkimake/paperclip.git
synced 2026-06-16 10:50:38 +09:00
Improve ACPX adapter configuration (#5290)
## 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>
This commit is contained in:
parent
454edfe81e
commit
11ffd6f2c5
15 changed files with 949 additions and 211 deletions
26
ui/src/lib/acpx-model-filter.test.ts
Normal file
26
ui/src/lib/acpx-model-filter.test.ts
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
import { describe, expect, it } from "vitest";
|
||||
import { filterAcpxModelsByAgent } from "./acpx-model-filter";
|
||||
|
||||
const mixedModels = [
|
||||
{ id: "claude-sonnet-4-6", label: "Claude: Claude Sonnet 4.6" },
|
||||
{ id: "gpt-5.3-codex", label: "Codex: gpt-5.3-codex" },
|
||||
{ id: "provider/custom-model", label: "Custom model" },
|
||||
];
|
||||
|
||||
describe("filterAcpxModelsByAgent", () => {
|
||||
it("keeps only Claude models when ACPX Claude is selected", () => {
|
||||
expect(filterAcpxModelsByAgent(mixedModels, "claude").map((model) => model.id)).toEqual([
|
||||
"claude-sonnet-4-6",
|
||||
]);
|
||||
});
|
||||
|
||||
it("keeps only Codex models when ACPX Codex is selected", () => {
|
||||
expect(filterAcpxModelsByAgent(mixedModels, "codex").map((model) => model.id)).toEqual([
|
||||
"gpt-5.3-codex",
|
||||
]);
|
||||
});
|
||||
|
||||
it("does not show built-in provider models for custom ACP commands", () => {
|
||||
expect(filterAcpxModelsByAgent(mixedModels, "custom")).toEqual([]);
|
||||
});
|
||||
});
|
||||
16
ui/src/lib/acpx-model-filter.ts
Normal file
16
ui/src/lib/acpx-model-filter.ts
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
import type { AdapterModel } from "../api/agents";
|
||||
import { models as CLAUDE_LOCAL_MODELS } from "@paperclipai/adapter-claude-local";
|
||||
import { models as CODEX_LOCAL_MODELS } from "@paperclipai/adapter-codex-local";
|
||||
|
||||
const claudeModelIds = new Set(CLAUDE_LOCAL_MODELS.map((model) => model.id));
|
||||
const codexModelIds = new Set(CODEX_LOCAL_MODELS.map((model) => model.id));
|
||||
|
||||
export function filterAcpxModelsByAgent(models: AdapterModel[], acpxAgent: string): AdapterModel[] {
|
||||
if (acpxAgent === "claude") {
|
||||
return models.filter((model) => claudeModelIds.has(model.id) || model.label.startsWith("Claude: "));
|
||||
}
|
||||
if (acpxAgent === "codex") {
|
||||
return models.filter((model) => codexModelIds.has(model.id) || model.label.startsWith("Codex: "));
|
||||
}
|
||||
return [];
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue