Files
PaperClipAI/packages/shared/src/validators/native-finalization.ts
T
Dotta a70b0f70b6 Merge remote-tracking branch 'origin/master' into PAP-16679-paperclip-runner
* origin/master: (57 commits)
  fix(adapter-utils): extend the duplex fail-closed run disposition to the CLI lane (#11966)
  fix(recovery): stop automatic stranded-task takeovers (#11961)
  feat(sandbox): add the duplex bridge broker, gated transport selection, and fixed observability (#11769)
  Drop the mission step from the wizard arc (#11935)
  fix(runtime): guard empty Bash 3.2 array expansion (#11891)
  chore(lockfile): refresh pnpm-lock.yaml (#11915)
  feat(commitperclip): surface the Co-Authored-By trailers a squash merge needs (#11498)
  Rebuild the onboarding agent arc on the prototype's step design (#11905)
  fix(workspaces): read process cwd on macOS so port-owner adoption works (#11763)
  fix(workspaces): attach PR preparation to existing branches (#11703)
  fix(grok-local): stop defaulting --permission-mode to dontAsk (#11898)
  Fix remote-only workspace base refs and pre-adapter retry loops (#11892)
  feat(environments): refer to the managed default environment by name, not the sandbox driver key (#11838)
  test(server): cover buffered duplex chunk drain after a late listener bind (#11865)
  fix(server,ui,claude-local): verify auth on the adapter Test lane and enforce managed-sandbox tenant binding (#11810)
  chore(lockfile): refresh pnpm-lock.yaml (#11867)
  fix(kimi): align package with Node 24 policy (#11890)
  feat(ui): rename "Agent mode" to "Auto mode" and show full work-mode labels (#11866)
  fix(build): enforce Node 24 across Paperclip (#11792)
  fix(server): end the duplex route on the pre-bind bounds when frames arrive before the bind (#11860)
  ...

# Conflicts:
#	Dockerfile
#	packages/db/src/migrations/meta/0226_snapshot.json
#	packages/db/src/migrations/meta/_journal.json
#	pnpm-lock.yaml
#	server/package.json
#	server/src/routes/agents.ts
#	server/src/services/heartbeat.ts
#	server/src/services/issues.ts
#	server/src/services/recovery/service.ts
#	ui/package.json
#	ui/src/adapters/transcript.test.ts
#	ui/src/components/TaskChatThread.test.tsx
#	ui/src/components/TaskChatThread.tsx
#	ui/src/components/task-chat/TaskChatTurn.tsx
#	ui/src/index.css
#	ui/src/pages/Agents.tsx
2026-08-22 15:46:15 -05:00

36 lines
1.4 KiB
TypeScript

import { z } from "zod";
import { NATIVE_FINALIZATION_SCHEMA } from "../types/native-finalization.js";
export const nativeFinalizationResultV1Schema = z.object({
schema: z.literal(NATIVE_FINALIZATION_SCHEMA),
runtimeMode: z.literal("native"),
runId: z.string().uuid(),
issueId: z.string().uuid(),
companyId: z.string().uuid(),
result: z.record(z.string(), z.unknown()),
terminal: z.object({
schema: z.literal("paperclip.prp.terminal.v1"),
turnTerminalState: z.enum(["completed", "failed", "interrupted", "cancelled"]),
runTerminalState: z.enum(["succeeded", "failed", "cancelled"]),
reportedWorkDisposition: z.enum(["done", "blocked", "needs_review", "yielded"]),
}).strict(),
turnId: z.string().min(1).nullable(),
sourceInstanceId: z.string().min(1).max(160),
normalizedSessionId: z.string().min(1),
providerSessionId: z.string().min(1).nullable(),
driverKind: z.string().min(1),
driverVersion: z.string().min(1),
nativeEventCount: z.number().int().nonnegative(),
highestContiguousSourceSeq: z.number().int().nonnegative(),
workspaceFinalizeStatus: z.enum(["pending", "succeeded", "failed"]),
}).strict();
export const nativeReportedWorkDispositionSchema = z.enum([
"done",
"blocked",
"needs_review",
"yielded",
]);
export const nativeFinalizationResultSchema = nativeFinalizationResultV1Schema;
export type NativeFinalizationResultInput = z.infer<typeof nativeFinalizationResultSchema>;