Default new OpenCode agents to Paperclip Runner (#17120)

Default new OpenCode agents to Paperclip Runner on qualified macOS and Linux x64 targets. Preserve saved runner choices, explicit Legacy selection, and unsupported-target fallback. Pi remains a separate change.

Verified the complete browser path with a real OpenRouter connection: create the new agent, assign a task, observe its response and Done status, and reload to confirm persistence. CI passes and Greptile is 5/5 with no unresolved findings.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
DottaandPaperclip authored and GitHub committed 2026-10-21 15:09:15 -05:00
1 parent 0a5f1546ee
commit 39e44a9d9b
30 files changed
+373 -98

No files matched your search

@@ -90,11 +90,17 @@ describe("resolveNativeRuntimeMode", () => {
})).toMatchObject({ kind: "native", profile: { backend: "grok_bot_mcp" } });
});
it("still rejects experimental providers while the rollout flag is disabled", () => {
it("admits OpenCode without the experimental flag", () => {
expect(resolveNativeRuntimeMode({ ...eligible, enabled: false,
adapterConfig: { provider: "opencode", model: "openrouter/anthropic/claude-sonnet-4.6" },
})).toMatchObject({ kind: "native", profile: { backend: "opencode_server" } });
});
it("still rejects Pi while the rollout flag is disabled", () => {
expect(() => resolveNativeRuntimeMode({
...eligible,
enabled: false,
adapterConfig: { provider: "opencode", model: "openrouter/deepseek/deepseek-v4-flash-0731" },
adapterConfig: { provider: "acpx", acpxAgent: "pi", model: "openrouter/deepseek/deepseek-v4-flash-0731" },
})).toThrow(expect.objectContaining({
code: "paperclip_runner_rollout_disabled",
}));
@@ -244,7 +250,7 @@ describe("resolveNativeRuntimeMode", () => {
it("keeps a persisted experimental run native while the flag rejects a fresh start", () => {
const disabled = { ...eligible, enabled: false,
adapterConfig: { provider: "opencode", model: "openrouter/deepseek/deepseek-v4-flash-0731" },
adapterConfig: { provider: "acpx", acpxAgent: "pi", model: "openrouter/deepseek/deepseek-v4-flash-0731" },
};
expect(resolveHeartbeatNativeRuntimeMode({
...disabled,
@@ -252,7 +258,7 @@ describe("resolveNativeRuntimeMode", () => {
runtimeMode: "native",
runtimeModeReason: "eligible_opt_in",
runtimeModeResolvedAt: new Date(),
driverKind: "opencode_server",
driverKind: "acpx_runtime",
},
})).toEqual(expect.objectContaining({
kind: "native",
@@ -516,7 +522,7 @@ describe("resolveHeartbeatRuntimeMode compatibility", () => {
...compatibilityInput,
enabled: false,
adapterType: "paperclip_runner",
adapterConfig: { provider: "opencode", model: "opencode/gpt-5" },
adapterConfig: { provider: "acpx", acpxAgent: "pi", model: "openrouter/anthropic/claude-sonnet-4.6" },
})).toThrow(NativeRunnerSelectionError);
});
it("admits native Claude without enabling other ACPX providers", () => {
@@ -138,7 +138,7 @@ export function resolveNativeRuntimeMode(input: {
if (input.dotEnabled !== true) throw ineligible("paperclip_runner_dot_disabled", "Enable OpenAI Dot and Assistant connections (MCP) in experimental settings before assigning new work.");
} else if (runnerProfile.provider === "grok_bot" && (input.grokEnabled !== true || !input.enabled)) {
throw ineligible("paperclip_runner_grok_disabled", "Enable Grok Bot, Paperclip Runner, and Assistant connections (MCP) before assigning new work.");
} else if (runnerProfile.provider !== "codex"
} else if (runnerProfile.provider !== "codex" && runnerProfile.provider !== "opencode"
&& !(runnerProfile.provider === "acpx"
&& (runnerProfile.acpxAgent === "claude" || runnerProfile.acpxAgent === "copilot"))
&& !input.enabled) {