mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-10-28 12:04:41 +01:00
Wire the pinned Cursor candidate into rich ACP transport and packs
Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
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 {}
|
||||
|
||||
Reference in new issue
Block a user