import { createCodexTaskEnvelope } from "../contracts/codex.js"; function record(value: unknown): Record { return typeof value === "object" && value !== null && !Array.isArray(value) ? value as Record : {}; } function text(value: unknown, fallback = ""): string { return typeof value === "string" ? value : fallback; } export function openCodeProxyTaskEnvelope(params: Record) { const completionContract = record(params.completionContract); const revision = text(completionContract.revision).trim(); const criterionIds = Array.isArray(completionContract.criterionIds) ? completionContract.criterionIds .filter((value): value is string => typeof value === "string" && value.trim().length > 0) .map((value) => value.trim()) : []; return createCodexTaskEnvelope({ objective: "Complete the provider turn supplied by Paperclip Runner.", ...(revision && criterionIds.length > 0 ? { contractRevision: revision, criteria: criterionIds.map((id) => ({ id, requirement: `Satisfy the Paperclip completion criterion ${id}.`, })), } : {}), constraints: [ // baseInstructions already travels in the system prompt. Keep task // constraints here without duplicating the agent instruction bundle. "Use Paperclip MCP tools for semantic operations.", ], }); }