Wire the pinned Cursor candidate into rich ACP transport and packs

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
DottaandPaperclip committed 2026-09-28 15:16:00 -05:00
1 parent 36313fc908
commit 8b4536f2b2
4 files changed
+20 -6

No files matched your search

@@ -1,3 +1,4 @@
import { materializePinnedCursorDistribution } from "./materialize-cursor-distribution.mjs";
const CANDIDATES = new Set(["cursor", "copilot", "pi"]);
export function parseProviderPackArguments(args) {
@@ -18,5 +19,11 @@ export function parseProviderPackArguments(args) {
/** Closed source-owned builder registry; provider branches add their exact pins. */
export async function materializeCandidateProviderPack({ provider, outputRoot }) {
if (!CANDIDATES.has(provider)) throw new Error("Unknown candidate provider");
if (provider === "cursor") {
const result = await materializePinnedCursorDistribution({ destination: outputRoot });
return { version: result.version,
profileDigest: "sha256:1157a5d071abbd57ab132f22bace75c65e84cc47a045b0023475488755e14899",
closureDigest: `sha256:${result.closureSha256}` };
}
throw new Error(`The ${provider} candidate distribution builder is not included in this source revision`);
}
@@ -43,7 +43,7 @@ export const ACPX_CAPABILITY_PROFILES: Readonly<Record<QualifiedAcpxAgent, AcpxC
recovery: "session-load", usage: "unverified", steering: "unsupported", followUp: "controller-queue",
artifacts: "references-pending",
extensionRequests: ["cursor/ask_question", "cursor/create_plan", "cursor/update_todos", "cursor/task", "cursor/generate_image"],
extensionNotifications: ["cursor/update_todos", "cursor/task", "cursor/generate_image"],
extensionNotifications: ["cursor/update_todos", "cursor/task", "cursor/generate_image", "cursor/subagent_update"],
},
copilot: {
displayName: "GitHub Copilot", qualification: "pending", models: "explicit-provider-verified",
@@ -1,3 +1,4 @@
import { createCursorProfileExtensionAdapter, CURSOR_CLIENT_CAPABILITIES } from "./cursor-extensions.js";
import type { HarnessRuntimeRequestResolution } from "../../contracts/harness-driver.js";
import { parsePaperclipQuestionSet, type PaperclipQuestionSet } from "../../contracts/question-set.js";
import { isCanonicalProviderEventType, type CanonicalProviderEvent } from "../../provider-events.js";
@@ -33,13 +34,14 @@ export interface AcpxProfileExtensionContext {
/** Provider branches install their closed, pinned adapters here after qualification research. */
export function createAcpxProfileExtensionAdapter(
_agent: QualifiedAcpxAgent,
_context: AcpxProfileExtensionContext,
agent: QualifiedAcpxAgent,
context: AcpxProfileExtensionContext,
): AcpxProfileExtensionAdapter | null {
if (agent === "cursor") return createCursorProfileExtensionAdapter(context);
return null;
}
export function acpxProfileClientCapabilities(_agent: QualifiedAcpxAgent): Record<string, unknown> {
return {};
export function acpxProfileClientCapabilities(agent: QualifiedAcpxAgent): Record<string, unknown> {
return agent === "cursor" ? structuredClone(CURSOR_CLIENT_CAPABILITIES) : {};
}
/** Reject an oversized approval document; never silently approve a truncated revision. */
@@ -1,8 +1,11 @@
import { verifyCursorInstallation } from "./cursor-installation.js";
import { assertCursorWorkspacePolicy } from "./cursor-launch-policy.js";
import type { QualifiedAcpxAgent, QualifiedAcpxProfile } from "./qualified-profiles.js";
import { verifyQualifiedAcpxInstallation, type VerifiedAcpxInstallation } from "./installation-integrity.js";
/** Closed build-owned registry. Provider branches add their pinned installations here. */
export async function verifyAcpxProfileInstallation(profile: QualifiedAcpxProfile): Promise<VerifiedAcpxInstallation> {
if (profile.agent === "cursor") return verifyCursorInstallation(profile);
if (profile.agent !== "claude" && profile.agent !== "codex" && profile.agent !== "grok") {
throw new Error(`ACPX ${profile.agent} verified candidate distribution is not installed in this build`);
}
@@ -10,7 +13,9 @@ export async function verifyAcpxProfileInstallation(profile: QualifiedAcpxProfil
}
/** Provider policy admission is repeated immediately before each process launch. */
export async function assertAcpxProfileWorkspace(_agent: QualifiedAcpxAgent, _workspace: string): Promise<void> {}
export async function assertAcpxProfileWorkspace(agent: QualifiedAcpxAgent, workspace: string): Promise<void> {
if (agent === "cursor") await assertCursorWorkspacePolicy(workspace);
}
/** Candidate branches validate only explicitly bound, sanitized launch credentials. */
export function assertAcpxProfileEnvironment(_agent: QualifiedAcpxAgent, _environment: Readonly<NodeJS.ProcessEnv>): void {}