Merge branch 'codex/work-folders-pi-refresh' into codex/work-folders-storybook-refresh

* codex/work-folders-pi-refresh:
  fix: normalize omitted Pi models to the qualified default
This commit is contained in:
Dotta committed 2026-09-11 15:50:39 -05:00
commit 82a37bb587
5 files changed
+27 -7

No files matched your search

@@ -5,6 +5,7 @@ import {
PAPERCLIP_OPERATIONAL_SKILL_KEY,
resolveLegacyPaperclipDesiredSkillNames,
} from "@paperclipai/adapter-utils/server-utils";
import { resolvePaperclipRunnerProviderProfile } from "../services/native-runtime/provider-profile.js";
const legacyConfig = {
paperclipSkillSync: {
@@ -13,6 +14,16 @@ const legacyConfig = {
};
describe("paperclip_runner operational skill normalization", () => {
it.each([undefined, "", " "])("qualifies Pi's default model at persistence and execution (%s)", (model) => {
const input = { provider: "acpx", acpxAgent: "pi", model };
const normalized = normalizePaperclipRunnerAdapterConfig("paperclip_runner", input);
expect(normalized.model).toBe("openrouter/deepseek/deepseek-v4-flash-0731");
expect(resolvePaperclipRunnerProviderProfile(normalized)).toMatchObject({ provider: "acpx", acpxAgent: "pi", model: normalized.model });
expect(resolvePaperclipRunnerProviderProfile(input)).toMatchObject({ provider: "acpx", acpxAgent: "pi", model: normalized.model });
const explicit = normalizePaperclipRunnerAdapterConfig("paperclip_runner", { ...input, model: "unqualified-model" });
expect(explicit.model).toBe("unqualified-model");
expect(() => resolvePaperclipRunnerProviderProfile(explicit)).toThrow("requires exact model");
});
it("applies full-auto native runner defaults at persistence boundaries", () => {
expect(normalizePaperclipRunnerAdapterConfig("paperclip_runner", {})).toEqual({
provider: "codex",
@@ -1,6 +1,7 @@
import {
isPaperclipRunnerProvider,
PAPERCLIP_RUNNER_PERMISSION_CAPABILITIES,
PAPERCLIP_RUNNER_ACPX_DEFAULT_MODELS,
resolvePaperclipRunnerPermissionMode,
type PaperclipRunnerProvider,
} from "@paperclipai/adapter-utils";
@@ -14,11 +15,7 @@ export const DEFAULT_OPENCODE_RUNNER_MODEL =
"openrouter/deepseek/deepseek-v4-flash-0731" as const;
export const CLAUDE_MANAGED_BETA_VERSION = "managed-agents-2026-04-01" as const;
export const QUALIFIED_ACPX_RUNNER_MODELS = {
claude: "claude-sonnet-5",
codex: "gpt-5.6-sol",
pi: "openrouter/deepseek/deepseek-v4-flash-0731",
} as const;
export const QUALIFIED_ACPX_RUNNER_MODELS = PAPERCLIP_RUNNER_ACPX_DEFAULT_MODELS;
export type QualifiedPaperclipRunnerAcpxAgent =
keyof typeof QUALIFIED_ACPX_RUNNER_MODELS;
@@ -412,7 +409,7 @@ export function resolvePaperclipRunnerProviderProfile(
);
}
const qualifiedModel = QUALIFIED_ACPX_RUNNER_MODELS[acpxAgent];
if (acpxAgent !== "claude" && model !== qualifiedModel) {
if (acpxAgent !== "claude" && model !== null && model !== qualifiedModel) {
throw new PaperclipRunnerProviderProfileError(
"paperclip_runner_acpx_model_unqualified",
`Paperclip Runner ACPX ${acpxAgent} requires exact model ${qualifiedModel}.`,