@peac/schema 0.11.0 → 0.11.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/carrier.d.ts +99 -0
- package/dist/carrier.d.ts.map +1 -0
- package/dist/index.cjs +133 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +124 -2
- package/dist/index.mjs.map +1 -1
- package/dist/interaction.cjs +2 -1
- package/dist/interaction.cjs.map +1 -1
- package/dist/interaction.d.ts +1 -1
- package/dist/interaction.d.ts.map +1 -1
- package/dist/interaction.mjs +2 -1
- package/dist/interaction.mjs.map +1 -1
- package/package.json +2 -2
package/dist/interaction.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/interaction.ts"],"names":[],"mappings":"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","file":"interaction.mjs","sourcesContent":["/**\n * PEAC Interaction Evidence Types (v0.10.7+)\n *\n * Interaction evidence captures what happened during agent execution.\n * This is an extension type - stored at evidence.extensions[\"org.peacprotocol/interaction@0.1\"]\n *\n * Design principles:\n * - Wire-stable: Uses extensions mechanism (NOT a top-level evidence field)\n * - Hash-only by default: Privacy-preserving content digests\n * - Open kind registry: Not a closed enum, converges through convention\n * - 1 receipt = 1 interaction: No batching (use bundles for that)\n *\n * @see docs/specs/INTERACTION-EVIDENCE.md\n */\n\nimport { z } from 'zod';\nimport type { JsonValue } from '@peac/kernel';\nimport type { PEACEnvelope } from './envelope.js';\nimport type { WorkflowContext } from './workflow.js';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Extension key for interaction evidence\n * Used in evidence.extensions['org.peacprotocol/interaction@0.1']\n */\nexport const INTERACTION_EXTENSION_KEY = 'org.peacprotocol/interaction@0.1';\n\n/**\n * Canonical digest algorithms (NORMATIVE)\n *\n * k = 1024 bytes (binary), m = 1024*1024 bytes (binary)\n * NO case-insensitivity, NO regex matching - strict canonical set only.\n */\nexport const CANONICAL_DIGEST_ALGS = [\n 'sha-256', // Full SHA-256\n 'sha-256:trunc-64k', // First 64KB (65536 bytes)\n 'sha-256:trunc-1m', // First 1MB (1048576 bytes)\n] as const;\n\n/**\n * Size constants for digest truncation (NORMATIVE)\n */\nexport const DIGEST_SIZE_CONSTANTS = {\n k: 1024, // 1 KB = 1024 bytes (binary)\n m: 1024 * 1024, // 1 MB = 1048576 bytes (binary)\n 'trunc-64k': 65536, // 64 * 1024\n 'trunc-1m': 1048576, // 1024 * 1024\n} as const;\n\n/**\n * Result status values for interaction outcomes\n */\nexport const RESULT_STATUSES = ['ok', 'error', 'timeout', 'canceled'] as const;\n\n/**\n * Redaction modes for payload references\n */\nexport const REDACTION_MODES = ['hash_only', 'redacted', 'plaintext_allowlisted'] as const;\n\n/**\n * Policy decision values\n */\nexport const POLICY_DECISIONS = ['allow', 'deny', 'constrained'] as const;\n\n/**\n * Well-known interaction kinds (informational, not normative)\n *\n * The kind field accepts any string matching the kind grammar.\n * These well-known values are listed in the PEAC registries for interop.\n * New kinds do NOT require protocol updates - just use the name.\n *\n * Custom kinds: use \"custom:<reverse-dns>\" or \"<reverse-dns>:<token>\"\n */\nexport const WELL_KNOWN_KINDS = [\n 'tool.call',\n 'http.request',\n 'fs.read',\n 'fs.write',\n 'message',\n] as const;\n\n/**\n * Reserved kind prefixes (NORMATIVE)\n *\n * Kinds starting with these prefixes that are NOT in WELL_KNOWN_KINDS\n * MUST be rejected to prevent namespace pollution.\n */\nexport const RESERVED_KIND_PREFIXES = ['peac.', 'org.peacprotocol.'] as const;\n\n/**\n * Interaction evidence limits (DoS protection)\n */\nexport const INTERACTION_LIMITS = {\n /** Maximum interaction ID length */\n maxInteractionIdLength: 256,\n /** Maximum kind length */\n maxKindLength: 128,\n /** Maximum platform name length */\n maxPlatformLength: 64,\n /** Maximum version string length */\n maxVersionLength: 64,\n /** Maximum plugin ID length */\n maxPluginIdLength: 128,\n /** Maximum tool name length */\n maxToolNameLength: 256,\n /** Maximum provider length */\n maxProviderLength: 128,\n /** Maximum URI length */\n maxUriLength: 2048,\n /** Maximum method length */\n maxMethodLength: 16,\n /** Maximum error code length */\n maxErrorCodeLength: 128,\n /** Maximum payment reference length */\n maxPaymentReferenceLength: 256,\n /** Maximum receipt RID length */\n maxReceiptRidLength: 128,\n} as const;\n\n// ============================================================================\n// Shared Invariant Helpers (used by both schema and ordered validator)\n// ============================================================================\n\n/**\n * Check if a kind requires a tool target (internal helper)\n */\nfunction requiresTool(kind: string): boolean {\n return kind.startsWith('tool.');\n}\n\n/**\n * Check if a kind requires a resource target (internal helper)\n */\nfunction requiresResource(kind: string): boolean {\n return kind.startsWith('http.') || kind.startsWith('fs.');\n}\n\n/**\n * Check if a kind uses a reserved prefix (internal helper)\n */\nfunction usesReservedPrefix(kind: string): boolean {\n return RESERVED_KIND_PREFIXES.some((prefix) => kind.startsWith(prefix));\n}\n\n/**\n * Check if a resource object is meaningful - has at least uri (internal helper)\n * Empty resource objects {} are not valid targets.\n */\nfunction hasMeaningfulResource(resource: Record<string, unknown> | undefined): boolean {\n if (!resource) return false;\n if (typeof resource.uri === 'string' && resource.uri.length > 0) return true;\n return false;\n}\n\n// ============================================================================\n// Format Patterns\n// ============================================================================\n\n/**\n * Kind format pattern\n *\n * Lowercase letters, digits, dots, underscores, colons, hyphens.\n * Must start with a letter, end with letter or digit.\n * Min 2 chars, max 128 chars.\n *\n * Examples: \"tool.call\", \"http.request\", \"custom:com.example.foo\"\n */\nexport const KIND_FORMAT_PATTERN = /^[a-z][a-z0-9._:-]{0,126}[a-z0-9]$/;\n\n/**\n * Extension key format pattern (NORMATIVE)\n *\n * Reverse-DNS domain + '/' + key name + optional version\n * Pattern: ^([a-z0-9-]+\\.)+[a-z0-9-]+\\/[a-z][a-z0-9._:-]{0,126}[a-z0-9](?:@[0-9]+(?:\\.[0-9]+)*)?$\n *\n * Examples:\n * - \"com.example/foo\"\n * - \"org.peacprotocol/interaction@0.1\"\n * - \"io.vendor/custom-data\"\n */\nexport const EXTENSION_KEY_PATTERN =\n /^([a-z0-9-]+\\.)+[a-z0-9-]+\\/[a-z][a-z0-9._:-]{0,126}[a-z0-9](?:@[0-9]+(?:\\.[0-9]+)*)?$/;\n\n/**\n * Digest value format (64 lowercase hex chars)\n */\nexport const DIGEST_VALUE_PATTERN = /^[a-f0-9]{64}$/;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/**\n * Digest algorithm schema - strict canonical set\n */\nexport const DigestAlgSchema = z.enum(CANONICAL_DIGEST_ALGS);\n\n/**\n * Digest schema for privacy-preserving content hashing\n */\nexport const DigestSchema = z\n .object({\n /** Algorithm: 'sha-256' (full) or 'sha-256:trunc-{size}' (truncated) */\n alg: DigestAlgSchema,\n /** 64 lowercase hex chars (SHA-256 output) */\n value: z.string().regex(DIGEST_VALUE_PATTERN, 'Must be 64 lowercase hex chars'),\n /** Original byte length before any truncation (REQUIRED) */\n bytes: z.number().int().nonnegative(),\n })\n .strict();\n\n/**\n * Payload reference schema (on-wire, portable)\n */\nexport const PayloadRefSchema = z\n .object({\n /** Content digest */\n digest: DigestSchema,\n /** Redaction mode */\n redaction: z.enum(REDACTION_MODES),\n })\n .strict();\n\n/**\n * Executor identity schema (who ran this)\n */\nexport const ExecutorSchema = z\n .object({\n /** Platform identifier: 'openclaw', 'mcp', 'a2a', 'claude-code' */\n platform: z.string().min(1).max(INTERACTION_LIMITS.maxPlatformLength),\n /** Platform version */\n version: z.string().max(INTERACTION_LIMITS.maxVersionLength).optional(),\n /** Plugin that captured this */\n plugin_id: z.string().max(INTERACTION_LIMITS.maxPluginIdLength).optional(),\n /** Hash of plugin package (provenance) */\n plugin_digest: DigestSchema.optional(),\n })\n .strict();\n\n/**\n * Tool target schema (for tool.call kind)\n */\nexport const ToolTargetSchema = z\n .object({\n /** Tool name */\n name: z.string().min(1).max(INTERACTION_LIMITS.maxToolNameLength),\n /** Tool provider */\n provider: z.string().max(INTERACTION_LIMITS.maxProviderLength).optional(),\n /** Tool version */\n version: z.string().max(INTERACTION_LIMITS.maxVersionLength).optional(),\n })\n .strict();\n\n/**\n * Resource target schema (for http/fs kinds)\n */\nexport const ResourceTargetSchema = z\n .object({\n /** Resource URI */\n uri: z.string().max(INTERACTION_LIMITS.maxUriLength).optional(),\n /** HTTP method or operation */\n method: z.string().max(INTERACTION_LIMITS.maxMethodLength).optional(),\n })\n .strict();\n\n/**\n * Execution result schema\n */\nexport const ResultSchema = z\n .object({\n /** Result status */\n status: z.enum(RESULT_STATUSES),\n /** Error code (PEAC error code or namespaced) */\n error_code: z.string().max(INTERACTION_LIMITS.maxErrorCodeLength).optional(),\n /** Whether the operation can be retried */\n retryable: z.boolean().optional(),\n })\n .strict();\n\n/**\n * Policy context schema (policy state at execution time)\n */\nexport const PolicyContextSchema = z\n .object({\n /** Policy decision */\n decision: z.enum(POLICY_DECISIONS),\n /** Whether sandbox mode was enabled */\n sandbox_enabled: z.boolean().optional(),\n /** Whether elevated permissions were granted */\n elevated: z.boolean().optional(),\n /** Hash of effective policy document */\n effective_policy_digest: DigestSchema.optional(),\n })\n .strict();\n\n/**\n * References schema (links to related evidence)\n */\nexport const RefsSchema = z\n .object({\n /** Links to evidence.payment.reference */\n payment_reference: z.string().max(INTERACTION_LIMITS.maxPaymentReferenceLength).optional(),\n /** Correlation across receipts */\n related_receipt_rid: z.string().max(INTERACTION_LIMITS.maxReceiptRidLength).optional(),\n })\n .strict();\n\n/**\n * Kind schema with format validation\n */\nexport const KindSchema = z\n .string()\n .min(2)\n .max(INTERACTION_LIMITS.maxKindLength)\n .regex(KIND_FORMAT_PATTERN, 'Invalid kind format');\n\n/**\n * Interaction evidence schema (base, without cross-field refinements)\n */\nconst InteractionEvidenceV01BaseSchema = z\n .object({\n /** Stable ID for idempotency/dedupe (REQUIRED) */\n interaction_id: z.string().min(1).max(INTERACTION_LIMITS.maxInteractionIdLength),\n\n /** Event kind - open string, not closed enum (REQUIRED) */\n kind: KindSchema,\n\n /** Executor identity (REQUIRED) */\n executor: ExecutorSchema,\n\n /** Tool target (when kind is tool-related) */\n tool: ToolTargetSchema.optional(),\n\n /** Resource target (when kind is http/fs-related) */\n resource: ResourceTargetSchema.optional(),\n\n /** Input payload reference */\n input: PayloadRefSchema.optional(),\n\n /** Output payload reference */\n output: PayloadRefSchema.optional(),\n\n /** Start time (RFC 3339) (REQUIRED) */\n started_at: z.string().datetime(),\n\n /** Completion time (RFC 3339) */\n completed_at: z.string().datetime().optional(),\n\n /** Duration in milliseconds (OPTIONAL, non-normative) */\n duration_ms: z.number().int().nonnegative().optional(),\n\n /** Execution outcome */\n result: ResultSchema.optional(),\n\n /** Policy context at execution */\n policy: PolicyContextSchema.optional(),\n\n /** References to related evidence */\n refs: RefsSchema.optional(),\n\n /** Platform-specific extensions (MUST be namespaced) */\n extensions: z.record(z.string(), z.unknown()).optional(),\n })\n .strict();\n\n/**\n * Interaction evidence schema with invariant refinements\n *\n * ALL REJECT invariants are enforced here. This ensures that\n * both direct schema validation and ordered validation produce\n * consistent results.\n */\nexport const InteractionEvidenceV01Schema = InteractionEvidenceV01BaseSchema.superRefine(\n (ev, ctx) => {\n // Invariant 1: completed_at >= started_at\n if (ev.completed_at && ev.started_at) {\n const startedAt = new Date(ev.started_at).getTime();\n const completedAt = new Date(ev.completed_at).getTime();\n if (completedAt < startedAt) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'completed_at must be >= started_at',\n path: ['completed_at'],\n });\n }\n }\n\n // Invariant 2: output requires result.status\n if (ev.output && !ev.result?.status) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'result.status is required when output is present',\n path: ['result'],\n });\n }\n\n // Invariant 3: error status requires error_code or NON-EMPTY extensions\n // Empty extensions object {} is not valid detail\n if (ev.result?.status === 'error') {\n const hasErrorCode = Boolean(ev.result.error_code);\n const hasNonEmptyExtensions =\n ev.extensions !== undefined && Object.keys(ev.extensions).length > 0;\n if (!hasErrorCode && !hasNonEmptyExtensions) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'error_code or non-empty extensions required when status is error',\n path: ['result', 'error_code'],\n });\n }\n }\n\n // Invariant 4: extension keys must be properly namespaced\n if (ev.extensions) {\n for (const key of Object.keys(ev.extensions)) {\n if (!EXTENSION_KEY_PATTERN.test(key)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Invalid extension key format: ${key} (must be reverse-DNS/name[@version])`,\n path: ['extensions', key],\n });\n }\n }\n }\n\n // Invariant 5: reserved kind prefixes (REJECT rule)\n // Kinds starting with peac.* or org.peacprotocol.* that are NOT in WELL_KNOWN_KINDS are rejected\n if (\n usesReservedPrefix(ev.kind) &&\n !WELL_KNOWN_KINDS.includes(ev.kind as (typeof WELL_KNOWN_KINDS)[number])\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `kind \"${ev.kind}\" uses reserved prefix`,\n path: ['kind'],\n });\n }\n\n // Invariant 6: target consistency (REJECT rule)\n // tool.* kinds MUST have tool field with name\n if (requiresTool(ev.kind) && !ev.tool) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `kind \"${ev.kind}\" requires tool field`,\n path: ['tool'],\n });\n }\n // http.* and fs.* kinds MUST have resource field with meaningful content (at least uri)\n if (requiresResource(ev.kind)) {\n if (!ev.resource) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `kind \"${ev.kind}\" requires resource field`,\n path: ['resource'],\n });\n } else if (!hasMeaningfulResource(ev.resource as Record<string, unknown>)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `kind \"${ev.kind}\" requires resource.uri to be non-empty`,\n path: ['resource', 'uri'],\n });\n }\n }\n }\n);\n\n// ============================================================================\n// TypeScript Types (inferred from Zod schemas)\n// ============================================================================\n\nexport type DigestAlg = z.infer<typeof DigestAlgSchema>;\nexport type Digest = z.infer<typeof DigestSchema>;\nexport type PayloadRef = z.infer<typeof PayloadRefSchema>;\nexport type Executor = z.infer<typeof ExecutorSchema>;\nexport type ToolTarget = z.infer<typeof ToolTargetSchema>;\nexport type ResourceTarget = z.infer<typeof ResourceTargetSchema>;\nexport type ResultStatus = z.infer<typeof ResultSchema>['status'];\nexport type Result = z.infer<typeof ResultSchema>;\nexport type PolicyDecision = z.infer<typeof PolicyContextSchema>['decision'];\nexport type PolicyContext = z.infer<typeof PolicyContextSchema>;\nexport type Refs = z.infer<typeof RefsSchema>;\nexport type InteractionEvidenceV01 = z.infer<typeof InteractionEvidenceV01Schema>;\n\n// ============================================================================\n// Validation Result Types\n// ============================================================================\n\n/**\n * Validation error with code and optional field path\n */\nexport interface ValidationError {\n /** Machine-readable error code (E_INTERACTION_*) */\n code: string;\n /** Human-readable message */\n message: string;\n /** JSON path to the problematic field */\n field?: string;\n}\n\n/**\n * Validation warning with code and optional field path\n */\nexport interface ValidationWarning {\n /** Machine-readable warning code (W_INTERACTION_*) */\n code: string;\n /** Human-readable message */\n message: string;\n /** JSON path to the problematic field */\n field?: string;\n}\n\n/**\n * Result of interaction evidence validation.\n *\n * Warning-capable API: returns both errors (fatal) and warnings (non-fatal).\n * This enables conformance testing with warning fixtures.\n */\nexport type InteractionValidationResult =\n | { valid: true; value: InteractionEvidenceV01; warnings: ValidationWarning[] }\n | { valid: false; errors: ValidationError[]; warnings: ValidationWarning[] };\n\n// ============================================================================\n// Ordered Validation (Conformance)\n// ============================================================================\n\n/**\n * Validate interaction evidence with explicit evaluation ordering.\n *\n * Returns canonical error codes per validation ordering.\n * This function does NOT depend on Zod's internal validation ordering.\n * Cross-language implementations MUST produce identical error_code values\n * for the same invalid input.\n *\n * Validation order:\n * 1. Required field presence\n * 2. Required field format (interaction_id, kind, started_at)\n * 3. Kind format and reserved prefix check\n * 4. Executor field validation\n * 5. Optional field format (completed_at, digests, etc.)\n * 6. Cross-field invariants (timing, output-result, error-detail)\n * 7. Extension key namespacing\n * 8. Target consistency (kind prefix -> target field)\n *\n * @param input - Raw input to validate\n * @returns Validation result with canonical error codes on failure\n */\nexport function validateInteractionOrdered(input: unknown): InteractionValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n // Step 1: Type check (arrays are typeof 'object' but not valid input)\n if (typeof input !== 'object' || input === null || Array.isArray(input)) {\n return {\n valid: false,\n errors: [\n {\n code: 'E_INTERACTION_INVALID_FORMAT',\n message: 'Input must be an object',\n },\n ],\n warnings: [],\n };\n }\n\n const obj = input as Record<string, unknown>;\n\n // Step 2: Required field presence\n if (typeof obj.interaction_id !== 'string' || obj.interaction_id.length === 0) {\n errors.push({\n code: 'E_INTERACTION_MISSING_ID',\n message: 'interaction_id is required',\n field: 'interaction_id',\n });\n } else if (obj.interaction_id.length > INTERACTION_LIMITS.maxInteractionIdLength) {\n errors.push({\n code: 'E_INTERACTION_INVALID_FORMAT',\n message: `interaction_id exceeds max length (${INTERACTION_LIMITS.maxInteractionIdLength})`,\n field: 'interaction_id',\n });\n }\n\n // Step 3: Kind format validation\n // Empty string is semantically \"missing\", not \"invalid format\"\n if (typeof obj.kind !== 'string' || obj.kind.length === 0) {\n errors.push({\n code: 'E_INTERACTION_MISSING_KIND',\n message: 'kind is required',\n field: 'kind',\n });\n } else if (obj.kind.length < 2 || obj.kind.length > INTERACTION_LIMITS.maxKindLength) {\n errors.push({\n code: 'E_INTERACTION_INVALID_KIND_FORMAT',\n message: `kind must be 2-${INTERACTION_LIMITS.maxKindLength} characters`,\n field: 'kind',\n });\n } else if (!KIND_FORMAT_PATTERN.test(obj.kind)) {\n errors.push({\n code: 'E_INTERACTION_INVALID_KIND_FORMAT',\n message: 'kind must match pattern: lowercase, start with letter, end with alphanumeric',\n field: 'kind',\n });\n } else {\n // Check reserved prefixes\n for (const prefix of RESERVED_KIND_PREFIXES) {\n if (obj.kind.startsWith(prefix) && !WELL_KNOWN_KINDS.includes(obj.kind as never)) {\n errors.push({\n code: 'E_INTERACTION_KIND_RESERVED',\n message: `kind \"${obj.kind}\" uses reserved prefix \"${prefix}\"`,\n field: 'kind',\n });\n break;\n }\n }\n // Warn if not in well-known registry (but valid format)\n if (\n errors.length === 0 &&\n !WELL_KNOWN_KINDS.includes(obj.kind as (typeof WELL_KNOWN_KINDS)[number])\n ) {\n warnings.push({\n code: 'W_INTERACTION_KIND_UNREGISTERED',\n message: `kind \"${obj.kind}\" is not in the well-known registry`,\n field: 'kind',\n });\n }\n }\n\n // Step 4: started_at validation\n // Invalid format is treated as \"missing\" because the value is unusable\n // E_INTERACTION_INVALID_TIMING is reserved for relational errors (completed_at < started_at)\n if (typeof obj.started_at !== 'string') {\n errors.push({\n code: 'E_INTERACTION_MISSING_STARTED_AT',\n message: 'started_at is required',\n field: 'started_at',\n });\n } else {\n const startedAtDate = new Date(obj.started_at);\n if (isNaN(startedAtDate.getTime())) {\n errors.push({\n code: 'E_INTERACTION_MISSING_STARTED_AT',\n message: 'started_at must be a valid ISO 8601 datetime',\n field: 'started_at',\n });\n }\n }\n\n // Step 5: Executor validation\n if (typeof obj.executor !== 'object' || obj.executor === null) {\n errors.push({\n code: 'E_INTERACTION_MISSING_EXECUTOR',\n message: 'executor is required',\n field: 'executor',\n });\n } else {\n const executor = obj.executor as Record<string, unknown>;\n if (typeof executor.platform !== 'string' || executor.platform.length === 0) {\n errors.push({\n code: 'E_INTERACTION_MISSING_EXECUTOR',\n message: 'executor.platform is required',\n field: 'executor.platform',\n });\n } else if (executor.platform.length > INTERACTION_LIMITS.maxPlatformLength) {\n errors.push({\n code: 'E_INTERACTION_INVALID_FORMAT',\n message: `executor.platform exceeds max length (${INTERACTION_LIMITS.maxPlatformLength})`,\n field: 'executor.platform',\n });\n }\n }\n\n // Return early if we have fatal errors from required fields\n if (errors.length > 0) {\n return { valid: false, errors, warnings };\n }\n\n // Step 6: Digest validation (optional fields)\n const validateDigest = (\n digest: unknown,\n fieldPath: string\n ): { errors: ValidationError[]; valid: boolean } => {\n const digestErrors: ValidationError[] = [];\n if (typeof digest !== 'object' || digest === null) {\n digestErrors.push({\n code: 'E_INTERACTION_INVALID_DIGEST',\n message: 'digest must be an object',\n field: fieldPath,\n });\n return { errors: digestErrors, valid: false };\n }\n const d = digest as Record<string, unknown>;\n if (!CANONICAL_DIGEST_ALGS.includes(d.alg as DigestAlg)) {\n digestErrors.push({\n code: 'E_INTERACTION_INVALID_DIGEST_ALG',\n message: `digest.alg must be one of: ${CANONICAL_DIGEST_ALGS.join(', ')}`,\n field: `${fieldPath}.alg`,\n });\n }\n if (typeof d.value !== 'string' || !DIGEST_VALUE_PATTERN.test(d.value)) {\n digestErrors.push({\n code: 'E_INTERACTION_INVALID_DIGEST',\n message: 'digest.value must be 64 lowercase hex chars',\n field: `${fieldPath}.value`,\n });\n }\n if (typeof d.bytes !== 'number' || !Number.isInteger(d.bytes) || d.bytes < 0) {\n digestErrors.push({\n code: 'E_INTERACTION_INVALID_DIGEST',\n message: 'digest.bytes must be a non-negative integer',\n field: `${fieldPath}.bytes`,\n });\n }\n return { errors: digestErrors, valid: digestErrors.length === 0 };\n };\n\n // Validate input digest if present\n if (obj.input !== undefined) {\n const inputObj = obj.input as Record<string, unknown>;\n if (inputObj.digest !== undefined) {\n const result = validateDigest(inputObj.digest, 'input.digest');\n errors.push(...result.errors);\n }\n }\n\n // Validate output digest if present\n if (obj.output !== undefined) {\n const outputObj = obj.output as Record<string, unknown>;\n if (outputObj.digest !== undefined) {\n const result = validateDigest(outputObj.digest, 'output.digest');\n errors.push(...result.errors);\n }\n }\n\n // Step 7: Timing invariant (completed_at >= started_at)\n if (typeof obj.completed_at === 'string' && typeof obj.started_at === 'string') {\n const startedAt = new Date(obj.started_at).getTime();\n const completedAt = new Date(obj.completed_at).getTime();\n if (!isNaN(startedAt) && !isNaN(completedAt) && completedAt < startedAt) {\n errors.push({\n code: 'E_INTERACTION_INVALID_TIMING',\n message: 'completed_at must be >= started_at',\n field: 'completed_at',\n });\n }\n }\n\n // Step 8: Output requires result invariant\n if (obj.output !== undefined) {\n const result = obj.result as Record<string, unknown> | undefined;\n if (!result?.status) {\n errors.push({\n code: 'E_INTERACTION_MISSING_RESULT',\n message: 'result.status is required when output is present',\n field: 'result',\n });\n }\n }\n\n // Step 9: Error status requires detail (error_code OR non-empty extensions)\n // Empty extensions object {} is not valid detail\n if (obj.result !== undefined) {\n const result = obj.result as Record<string, unknown>;\n if (result.status === 'error') {\n const hasErrorCode = Boolean(result.error_code);\n const hasNonEmptyExtensions =\n obj.extensions !== undefined &&\n typeof obj.extensions === 'object' &&\n obj.extensions !== null &&\n Object.keys(obj.extensions as object).length > 0;\n if (!hasErrorCode && !hasNonEmptyExtensions) {\n errors.push({\n code: 'E_INTERACTION_MISSING_ERROR_DETAIL',\n message: 'error_code or non-empty extensions required when result.status is error',\n field: 'result.error_code',\n });\n }\n }\n }\n\n // Step 10: Extension key namespacing\n if (obj.extensions !== undefined) {\n if (typeof obj.extensions !== 'object' || obj.extensions === null) {\n errors.push({\n code: 'E_INTERACTION_INVALID_FORMAT',\n message: 'extensions must be an object',\n field: 'extensions',\n });\n } else {\n for (const key of Object.keys(obj.extensions as object)) {\n if (!EXTENSION_KEY_PATTERN.test(key)) {\n errors.push({\n code: 'E_INTERACTION_INVALID_EXTENSION_KEY',\n message: `Invalid extension key format: \"${key}\" (must be reverse-DNS/name[@version])`,\n field: `extensions.${key}`,\n });\n }\n }\n }\n }\n\n // Step 11: Target consistency (prefix-aware, using shared helpers)\n const kind = obj.kind as string;\n const hasTool = obj.tool !== undefined;\n const hasResource = obj.resource !== undefined;\n\n // tool.* kinds MUST have tool field\n if (requiresTool(kind) && !hasTool) {\n errors.push({\n code: 'E_INTERACTION_MISSING_TARGET',\n message: `kind \"${kind}\" requires tool field`,\n field: 'tool',\n });\n }\n\n // http.* and fs.* kinds MUST have resource field with meaningful content\n if (requiresResource(kind)) {\n if (!hasResource) {\n errors.push({\n code: 'E_INTERACTION_MISSING_TARGET',\n message: `kind \"${kind}\" requires resource field`,\n field: 'resource',\n });\n } else if (!hasMeaningfulResource(obj.resource as Record<string, unknown>)) {\n errors.push({\n code: 'E_INTERACTION_MISSING_TARGET',\n message: `kind \"${kind}\" requires resource.uri to be non-empty`,\n field: 'resource.uri',\n });\n }\n }\n\n // Warn if neither target present (non-strict kinds like 'message')\n if (!hasTool && !hasResource && errors.length === 0) {\n warnings.push({\n code: 'W_INTERACTION_MISSING_TARGET',\n message: 'Neither tool nor resource field is present',\n field: 'tool',\n });\n }\n\n // Return early if we have errors\n if (errors.length > 0) {\n return { valid: false, errors, warnings };\n }\n\n // Final Zod validation for strict schema compliance\n const zodResult = InteractionEvidenceV01Schema.safeParse(input);\n if (!zodResult.success) {\n return {\n valid: false,\n errors: [\n {\n code: 'E_INTERACTION_INVALID_FORMAT',\n message: zodResult.error.issues[0]?.message || 'Schema validation failed',\n field: zodResult.error.issues[0]?.path.join('.'),\n },\n ],\n warnings,\n };\n }\n\n return { valid: true, value: zodResult.data, warnings };\n}\n\n// ============================================================================\n// Compatibility Result Type\n// ============================================================================\n\n/**\n * Simple validation result for conformance harness compatibility.\n *\n * This matches the pattern used by other PEAC validators (workflow, etc.)\n * and allows conformance fixtures to test without needing to handle the\n * full warning-capable API shape.\n */\nexport interface SimpleValidationResult {\n /** Whether the input is valid */\n valid: boolean;\n /** Error code on failure */\n error_code?: string;\n /** Field path on failure */\n error_field?: string;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Validate interaction evidence (simple API for conformance harness)\n *\n * This is the recommended entry point for conformance testing.\n * Returns a simple result matching the existing harness contract.\n *\n * ## Warnings Contract\n *\n * This compat API intentionally **omits warnings** from the result.\n * Warnings are available via validateInteractionOrdered() for consumers\n * who explicitly opt in. Stable consumers should:\n * - Use this function for pass/fail validation\n * - Use validateInteractionOrdered() only when warnings are needed\n *\n * This prevents breaking changes if warning codes are added/modified.\n *\n * @param input - Raw input to validate\n * @returns Simple validation result with error_code on failure (no warnings)\n */\nexport function validateInteraction(input: unknown): SimpleValidationResult {\n const result = validateInteractionOrdered(input);\n if (result.valid) {\n return { valid: true };\n }\n const firstError = result.errors[0];\n return {\n valid: false,\n error_code: firstError?.code,\n error_field: firstError?.field,\n };\n}\n\n/**\n * Validate interaction evidence (throwing)\n *\n * @param evidence - Object to validate\n * @returns Validated InteractionEvidenceV01\n * @throws ZodError if validation fails\n */\nexport function validateInteractionEvidence(evidence: unknown): InteractionEvidenceV01 {\n return InteractionEvidenceV01Schema.parse(evidence);\n}\n\n/**\n * Check if an object is valid interaction evidence (non-throwing)\n *\n * @param evidence - Object to check\n * @returns True if valid InteractionEvidenceV01\n */\nexport function isValidInteractionEvidence(evidence: unknown): evidence is InteractionEvidenceV01 {\n return InteractionEvidenceV01Schema.safeParse(evidence).success;\n}\n\n/**\n * Check if a kind is in the well-known registry\n *\n * @param kind - Kind string to check\n * @returns True if well-known\n */\nexport function isWellKnownKind(kind: string): kind is (typeof WELL_KNOWN_KINDS)[number] {\n return WELL_KNOWN_KINDS.includes(kind as (typeof WELL_KNOWN_KINDS)[number]);\n}\n\n/**\n * Check if a kind uses a reserved prefix\n *\n * @param kind - Kind string to check\n * @returns True if uses reserved prefix\n */\nexport function isReservedKindPrefix(kind: string): boolean {\n return RESERVED_KIND_PREFIXES.some((prefix) => kind.startsWith(prefix));\n}\n\n/**\n * Check if a digest uses truncation\n *\n * @param digest - Digest to check\n * @returns True if truncated\n */\nexport function isDigestTruncated(digest: Digest): boolean {\n return digest.alg.startsWith('sha-256:trunc-');\n}\n\n// ============================================================================\n// SDK Accessors\n// ============================================================================\n\n/**\n * Get interaction evidence from a PEAC envelope\n *\n * @param receipt - PEAC envelope to read from\n * @returns Interaction evidence if present, undefined otherwise\n */\nexport function getInteraction(receipt: PEACEnvelope): InteractionEvidenceV01 | undefined {\n return receipt.evidence?.extensions?.[INTERACTION_EXTENSION_KEY] as\n | InteractionEvidenceV01\n | undefined;\n}\n\n/**\n * Set interaction evidence on a PEAC envelope (mutates)\n *\n * @param receipt - PEAC envelope to modify\n * @param interaction - Interaction evidence to set\n */\nexport function setInteraction(receipt: PEACEnvelope, interaction: InteractionEvidenceV01): void {\n if (!receipt.evidence) {\n receipt.evidence = {};\n }\n if (!receipt.evidence.extensions) {\n receipt.evidence.extensions = {};\n }\n receipt.evidence.extensions[INTERACTION_EXTENSION_KEY] = interaction as unknown as JsonValue;\n}\n\n/**\n * Check if a PEAC envelope has interaction evidence\n *\n * @param receipt - PEAC envelope to check\n * @returns True if interaction evidence is present\n */\nexport function hasInteraction(receipt: PEACEnvelope): boolean {\n return receipt.evidence?.extensions?.[INTERACTION_EXTENSION_KEY] !== undefined;\n}\n\n// ============================================================================\n// Projection API\n// ============================================================================\n\n/**\n * ReceiptView - pure view layer that makes extensions feel like top-level fields\n *\n * Does NOT modify the underlying envelope; just provides convenient access.\n * This projection allows code to work with interaction evidence as if it were\n * a first-class field while maintaining wire format stability.\n */\nexport interface ReceiptView {\n /** The underlying envelope (unchanged) */\n readonly envelope: PEACEnvelope;\n\n /** Interaction evidence (from extension) - feels like top-level */\n readonly interaction?: InteractionEvidenceV01;\n\n /** Array form for uniform pipeline processing */\n readonly interactions: readonly InteractionEvidenceV01[];\n\n /** Workflow context (from auth.extensions) */\n readonly workflow?: WorkflowContext;\n}\n\n/**\n * Create a view over a PEAC envelope that provides first-class access\n * to extension data without modifying the wire format.\n *\n * @param envelope - PEAC envelope to create view for\n * @returns ReceiptView with convenient accessors\n *\n * @example\n * const view = createReceiptView(envelope);\n * if (view.interaction) {\n * console.log(view.interaction.kind);\n * }\n */\nexport function createReceiptView(envelope: PEACEnvelope): ReceiptView {\n const interaction = getInteraction(envelope);\n const workflow = envelope.auth?.extensions?.['org.peacprotocol/workflow'] as\n | WorkflowContext\n | undefined;\n\n return {\n envelope,\n interaction,\n interactions: interaction ? [interaction] : [],\n workflow,\n };\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Parameters for creating interaction evidence\n */\nexport interface CreateInteractionParams {\n interaction_id: string;\n kind: string;\n executor: {\n platform: string;\n version?: string;\n plugin_id?: string;\n plugin_digest?: Digest;\n };\n tool?: {\n name: string;\n provider?: string;\n version?: string;\n };\n resource?: {\n uri?: string;\n method?: string;\n };\n input?: {\n digest: Digest;\n redaction: (typeof REDACTION_MODES)[number];\n };\n output?: {\n digest: Digest;\n redaction: (typeof REDACTION_MODES)[number];\n };\n started_at: string;\n completed_at?: string;\n duration_ms?: number;\n result?: {\n status: (typeof RESULT_STATUSES)[number];\n error_code?: string;\n retryable?: boolean;\n };\n policy?: {\n decision: (typeof POLICY_DECISIONS)[number];\n sandbox_enabled?: boolean;\n elevated?: boolean;\n effective_policy_digest?: Digest;\n };\n refs?: {\n payment_reference?: string;\n related_receipt_rid?: string;\n };\n extensions?: Record<string, JsonValue>;\n}\n\n/**\n * Create validated interaction evidence\n *\n * @param params - Interaction parameters\n * @returns Validated InteractionEvidenceV01\n * @throws ZodError if validation fails\n */\nexport function createInteractionEvidence(params: CreateInteractionParams): InteractionEvidenceV01 {\n const evidence: InteractionEvidenceV01 = {\n interaction_id: params.interaction_id,\n kind: params.kind,\n executor: {\n platform: params.executor.platform,\n ...(params.executor.version && { version: params.executor.version }),\n ...(params.executor.plugin_id && { plugin_id: params.executor.plugin_id }),\n ...(params.executor.plugin_digest && { plugin_digest: params.executor.plugin_digest }),\n },\n ...(params.tool && { tool: params.tool }),\n ...(params.resource && { resource: params.resource }),\n ...(params.input && { input: params.input }),\n ...(params.output && { output: params.output }),\n started_at: params.started_at,\n ...(params.completed_at && { completed_at: params.completed_at }),\n ...(params.duration_ms !== undefined && { duration_ms: params.duration_ms }),\n ...(params.result && { result: params.result }),\n ...(params.policy && { policy: params.policy }),\n ...(params.refs && { refs: params.refs }),\n ...(params.extensions && { extensions: params.extensions }),\n };\n\n return validateInteractionEvidence(evidence);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/interaction.ts"],"names":[],"mappings":"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","file":"interaction.mjs","sourcesContent":["/**\n * PEAC Interaction Evidence Types (v0.10.7+)\n *\n * Interaction evidence captures what happened during agent execution.\n * This is an extension type - stored at evidence.extensions[\"org.peacprotocol/interaction@0.1\"]\n *\n * Design principles:\n * - Wire-stable: Uses extensions mechanism (NOT a top-level evidence field)\n * - Hash-only by default: Privacy-preserving content digests\n * - Open kind registry: Not a closed enum, converges through convention\n * - 1 receipt = 1 interaction: No batching (use bundles for that)\n *\n * @see docs/specs/INTERACTION-EVIDENCE.md\n */\n\nimport { z } from 'zod';\nimport type { JsonValue } from '@peac/kernel';\nimport type { PEACEnvelope } from './envelope.js';\nimport type { WorkflowContext } from './workflow.js';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Extension key for interaction evidence\n * Used in evidence.extensions['org.peacprotocol/interaction@0.1']\n */\nexport const INTERACTION_EXTENSION_KEY = 'org.peacprotocol/interaction@0.1';\n\n/**\n * Canonical digest algorithms (NORMATIVE)\n *\n * k = 1024 bytes (binary), m = 1024*1024 bytes (binary)\n * NO case-insensitivity, NO regex matching - strict canonical set only.\n */\nexport const CANONICAL_DIGEST_ALGS = [\n 'sha-256', // Full SHA-256\n 'sha-256:trunc-64k', // First 64KB (65536 bytes)\n 'sha-256:trunc-1m', // First 1MB (1048576 bytes)\n] as const;\n\n/**\n * Size constants for digest truncation (NORMATIVE)\n */\nexport const DIGEST_SIZE_CONSTANTS = {\n k: 1024, // 1 KB = 1024 bytes (binary)\n m: 1024 * 1024, // 1 MB = 1048576 bytes (binary)\n 'trunc-64k': 65536, // 64 * 1024\n 'trunc-1m': 1048576, // 1024 * 1024\n} as const;\n\n/**\n * Result status values for interaction outcomes\n */\nexport const RESULT_STATUSES = ['ok', 'error', 'timeout', 'canceled'] as const;\n\n/**\n * Redaction modes for payload references\n */\nexport const REDACTION_MODES = ['hash_only', 'redacted', 'plaintext_allowlisted'] as const;\n\n/**\n * Policy decision values\n */\nexport const POLICY_DECISIONS = ['allow', 'deny', 'constrained'] as const;\n\n/**\n * Well-known interaction kinds (informational, not normative)\n *\n * The kind field accepts any string matching the kind grammar.\n * These well-known values are listed in the PEAC registries for interop.\n * New kinds do NOT require protocol updates - just use the name.\n *\n * Custom kinds: use \"custom:<reverse-dns>\" or \"<reverse-dns>:<token>\"\n */\nexport const WELL_KNOWN_KINDS = [\n 'tool.call',\n 'http.request',\n 'fs.read',\n 'fs.write',\n 'message',\n 'inference.chat_completion',\n] as const;\n\n/**\n * Reserved kind prefixes (NORMATIVE)\n *\n * Kinds starting with these prefixes that are NOT in WELL_KNOWN_KINDS\n * MUST be rejected to prevent namespace pollution.\n */\nexport const RESERVED_KIND_PREFIXES = ['peac.', 'org.peacprotocol.'] as const;\n\n/**\n * Interaction evidence limits (DoS protection)\n */\nexport const INTERACTION_LIMITS = {\n /** Maximum interaction ID length */\n maxInteractionIdLength: 256,\n /** Maximum kind length */\n maxKindLength: 128,\n /** Maximum platform name length */\n maxPlatformLength: 64,\n /** Maximum version string length */\n maxVersionLength: 64,\n /** Maximum plugin ID length */\n maxPluginIdLength: 128,\n /** Maximum tool name length */\n maxToolNameLength: 256,\n /** Maximum provider length */\n maxProviderLength: 128,\n /** Maximum URI length */\n maxUriLength: 2048,\n /** Maximum method length */\n maxMethodLength: 16,\n /** Maximum error code length */\n maxErrorCodeLength: 128,\n /** Maximum payment reference length */\n maxPaymentReferenceLength: 256,\n /** Maximum receipt RID length */\n maxReceiptRidLength: 128,\n} as const;\n\n// ============================================================================\n// Shared Invariant Helpers (used by both schema and ordered validator)\n// ============================================================================\n\n/**\n * Check if a kind requires a tool target (internal helper)\n */\nfunction requiresTool(kind: string): boolean {\n return kind.startsWith('tool.');\n}\n\n/**\n * Check if a kind requires a resource target (internal helper)\n */\nfunction requiresResource(kind: string): boolean {\n return kind.startsWith('http.') || kind.startsWith('fs.');\n}\n\n/**\n * Check if a kind uses a reserved prefix (internal helper)\n */\nfunction usesReservedPrefix(kind: string): boolean {\n return RESERVED_KIND_PREFIXES.some((prefix) => kind.startsWith(prefix));\n}\n\n/**\n * Check if a resource object is meaningful - has at least uri (internal helper)\n * Empty resource objects {} are not valid targets.\n */\nfunction hasMeaningfulResource(resource: Record<string, unknown> | undefined): boolean {\n if (!resource) return false;\n if (typeof resource.uri === 'string' && resource.uri.length > 0) return true;\n return false;\n}\n\n// ============================================================================\n// Format Patterns\n// ============================================================================\n\n/**\n * Kind format pattern\n *\n * Lowercase letters, digits, dots, underscores, colons, hyphens.\n * Must start with a letter, end with letter or digit.\n * Min 2 chars, max 128 chars.\n *\n * Examples: \"tool.call\", \"http.request\", \"custom:com.example.foo\"\n */\nexport const KIND_FORMAT_PATTERN = /^[a-z][a-z0-9._:-]{0,126}[a-z0-9]$/;\n\n/**\n * Extension key format pattern (NORMATIVE)\n *\n * Reverse-DNS domain + '/' + key name + optional version\n * Pattern: ^([a-z0-9-]+\\.)+[a-z0-9-]+\\/[a-z][a-z0-9._:-]{0,126}[a-z0-9](?:@[0-9]+(?:\\.[0-9]+)*)?$\n *\n * Examples:\n * - \"com.example/foo\"\n * - \"org.peacprotocol/interaction@0.1\"\n * - \"io.vendor/custom-data\"\n */\nexport const EXTENSION_KEY_PATTERN =\n /^([a-z0-9-]+\\.)+[a-z0-9-]+\\/[a-z][a-z0-9._:-]{0,126}[a-z0-9](?:@[0-9]+(?:\\.[0-9]+)*)?$/;\n\n/**\n * Digest value format (64 lowercase hex chars)\n */\nexport const DIGEST_VALUE_PATTERN = /^[a-f0-9]{64}$/;\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/**\n * Digest algorithm schema - strict canonical set\n */\nexport const DigestAlgSchema = z.enum(CANONICAL_DIGEST_ALGS);\n\n/**\n * Digest schema for privacy-preserving content hashing\n */\nexport const DigestSchema = z\n .object({\n /** Algorithm: 'sha-256' (full) or 'sha-256:trunc-{size}' (truncated) */\n alg: DigestAlgSchema,\n /** 64 lowercase hex chars (SHA-256 output) */\n value: z.string().regex(DIGEST_VALUE_PATTERN, 'Must be 64 lowercase hex chars'),\n /** Original byte length before any truncation (REQUIRED) */\n bytes: z.number().int().nonnegative(),\n })\n .strict();\n\n/**\n * Payload reference schema (on-wire, portable)\n */\nexport const PayloadRefSchema = z\n .object({\n /** Content digest */\n digest: DigestSchema,\n /** Redaction mode */\n redaction: z.enum(REDACTION_MODES),\n })\n .strict();\n\n/**\n * Executor identity schema (who ran this)\n */\nexport const ExecutorSchema = z\n .object({\n /** Platform identifier: 'openclaw', 'mcp', 'a2a', 'claude-code' */\n platform: z.string().min(1).max(INTERACTION_LIMITS.maxPlatformLength),\n /** Platform version */\n version: z.string().max(INTERACTION_LIMITS.maxVersionLength).optional(),\n /** Plugin that captured this */\n plugin_id: z.string().max(INTERACTION_LIMITS.maxPluginIdLength).optional(),\n /** Hash of plugin package (provenance) */\n plugin_digest: DigestSchema.optional(),\n })\n .strict();\n\n/**\n * Tool target schema (for tool.call kind)\n */\nexport const ToolTargetSchema = z\n .object({\n /** Tool name */\n name: z.string().min(1).max(INTERACTION_LIMITS.maxToolNameLength),\n /** Tool provider */\n provider: z.string().max(INTERACTION_LIMITS.maxProviderLength).optional(),\n /** Tool version */\n version: z.string().max(INTERACTION_LIMITS.maxVersionLength).optional(),\n })\n .strict();\n\n/**\n * Resource target schema (for http/fs kinds)\n */\nexport const ResourceTargetSchema = z\n .object({\n /** Resource URI */\n uri: z.string().max(INTERACTION_LIMITS.maxUriLength).optional(),\n /** HTTP method or operation */\n method: z.string().max(INTERACTION_LIMITS.maxMethodLength).optional(),\n })\n .strict();\n\n/**\n * Execution result schema\n */\nexport const ResultSchema = z\n .object({\n /** Result status */\n status: z.enum(RESULT_STATUSES),\n /** Error code (PEAC error code or namespaced) */\n error_code: z.string().max(INTERACTION_LIMITS.maxErrorCodeLength).optional(),\n /** Whether the operation can be retried */\n retryable: z.boolean().optional(),\n })\n .strict();\n\n/**\n * Policy context schema (policy state at execution time)\n */\nexport const PolicyContextSchema = z\n .object({\n /** Policy decision */\n decision: z.enum(POLICY_DECISIONS),\n /** Whether sandbox mode was enabled */\n sandbox_enabled: z.boolean().optional(),\n /** Whether elevated permissions were granted */\n elevated: z.boolean().optional(),\n /** Hash of effective policy document */\n effective_policy_digest: DigestSchema.optional(),\n })\n .strict();\n\n/**\n * References schema (links to related evidence)\n */\nexport const RefsSchema = z\n .object({\n /** Links to evidence.payment.reference */\n payment_reference: z.string().max(INTERACTION_LIMITS.maxPaymentReferenceLength).optional(),\n /** Correlation across receipts */\n related_receipt_rid: z.string().max(INTERACTION_LIMITS.maxReceiptRidLength).optional(),\n })\n .strict();\n\n/**\n * Kind schema with format validation\n */\nexport const KindSchema = z\n .string()\n .min(2)\n .max(INTERACTION_LIMITS.maxKindLength)\n .regex(KIND_FORMAT_PATTERN, 'Invalid kind format');\n\n/**\n * Interaction evidence schema (base, without cross-field refinements)\n */\nconst InteractionEvidenceV01BaseSchema = z\n .object({\n /** Stable ID for idempotency/dedupe (REQUIRED) */\n interaction_id: z.string().min(1).max(INTERACTION_LIMITS.maxInteractionIdLength),\n\n /** Event kind - open string, not closed enum (REQUIRED) */\n kind: KindSchema,\n\n /** Executor identity (REQUIRED) */\n executor: ExecutorSchema,\n\n /** Tool target (when kind is tool-related) */\n tool: ToolTargetSchema.optional(),\n\n /** Resource target (when kind is http/fs-related) */\n resource: ResourceTargetSchema.optional(),\n\n /** Input payload reference */\n input: PayloadRefSchema.optional(),\n\n /** Output payload reference */\n output: PayloadRefSchema.optional(),\n\n /** Start time (RFC 3339) (REQUIRED) */\n started_at: z.string().datetime(),\n\n /** Completion time (RFC 3339) */\n completed_at: z.string().datetime().optional(),\n\n /** Duration in milliseconds (OPTIONAL, non-normative) */\n duration_ms: z.number().int().nonnegative().optional(),\n\n /** Execution outcome */\n result: ResultSchema.optional(),\n\n /** Policy context at execution */\n policy: PolicyContextSchema.optional(),\n\n /** References to related evidence */\n refs: RefsSchema.optional(),\n\n /** Platform-specific extensions (MUST be namespaced) */\n extensions: z.record(z.string(), z.unknown()).optional(),\n })\n .strict();\n\n/**\n * Interaction evidence schema with invariant refinements\n *\n * ALL REJECT invariants are enforced here. This ensures that\n * both direct schema validation and ordered validation produce\n * consistent results.\n */\nexport const InteractionEvidenceV01Schema = InteractionEvidenceV01BaseSchema.superRefine(\n (ev, ctx) => {\n // Invariant 1: completed_at >= started_at\n if (ev.completed_at && ev.started_at) {\n const startedAt = new Date(ev.started_at).getTime();\n const completedAt = new Date(ev.completed_at).getTime();\n if (completedAt < startedAt) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'completed_at must be >= started_at',\n path: ['completed_at'],\n });\n }\n }\n\n // Invariant 2: output requires result.status\n if (ev.output && !ev.result?.status) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'result.status is required when output is present',\n path: ['result'],\n });\n }\n\n // Invariant 3: error status requires error_code or NON-EMPTY extensions\n // Empty extensions object {} is not valid detail\n if (ev.result?.status === 'error') {\n const hasErrorCode = Boolean(ev.result.error_code);\n const hasNonEmptyExtensions =\n ev.extensions !== undefined && Object.keys(ev.extensions).length > 0;\n if (!hasErrorCode && !hasNonEmptyExtensions) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'error_code or non-empty extensions required when status is error',\n path: ['result', 'error_code'],\n });\n }\n }\n\n // Invariant 4: extension keys must be properly namespaced\n if (ev.extensions) {\n for (const key of Object.keys(ev.extensions)) {\n if (!EXTENSION_KEY_PATTERN.test(key)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Invalid extension key format: ${key} (must be reverse-DNS/name[@version])`,\n path: ['extensions', key],\n });\n }\n }\n }\n\n // Invariant 5: reserved kind prefixes (REJECT rule)\n // Kinds starting with peac.* or org.peacprotocol.* that are NOT in WELL_KNOWN_KINDS are rejected\n if (\n usesReservedPrefix(ev.kind) &&\n !WELL_KNOWN_KINDS.includes(ev.kind as (typeof WELL_KNOWN_KINDS)[number])\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `kind \"${ev.kind}\" uses reserved prefix`,\n path: ['kind'],\n });\n }\n\n // Invariant 6: target consistency (REJECT rule)\n // tool.* kinds MUST have tool field with name\n if (requiresTool(ev.kind) && !ev.tool) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `kind \"${ev.kind}\" requires tool field`,\n path: ['tool'],\n });\n }\n // http.* and fs.* kinds MUST have resource field with meaningful content (at least uri)\n if (requiresResource(ev.kind)) {\n if (!ev.resource) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `kind \"${ev.kind}\" requires resource field`,\n path: ['resource'],\n });\n } else if (!hasMeaningfulResource(ev.resource as Record<string, unknown>)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `kind \"${ev.kind}\" requires resource.uri to be non-empty`,\n path: ['resource', 'uri'],\n });\n }\n }\n }\n);\n\n// ============================================================================\n// TypeScript Types (inferred from Zod schemas)\n// ============================================================================\n\nexport type DigestAlg = z.infer<typeof DigestAlgSchema>;\nexport type Digest = z.infer<typeof DigestSchema>;\nexport type PayloadRef = z.infer<typeof PayloadRefSchema>;\nexport type Executor = z.infer<typeof ExecutorSchema>;\nexport type ToolTarget = z.infer<typeof ToolTargetSchema>;\nexport type ResourceTarget = z.infer<typeof ResourceTargetSchema>;\nexport type ResultStatus = z.infer<typeof ResultSchema>['status'];\nexport type Result = z.infer<typeof ResultSchema>;\nexport type PolicyDecision = z.infer<typeof PolicyContextSchema>['decision'];\nexport type PolicyContext = z.infer<typeof PolicyContextSchema>;\nexport type Refs = z.infer<typeof RefsSchema>;\nexport type InteractionEvidenceV01 = z.infer<typeof InteractionEvidenceV01Schema>;\n\n// ============================================================================\n// Validation Result Types\n// ============================================================================\n\n/**\n * Validation error with code and optional field path\n */\nexport interface ValidationError {\n /** Machine-readable error code (E_INTERACTION_*) */\n code: string;\n /** Human-readable message */\n message: string;\n /** JSON path to the problematic field */\n field?: string;\n}\n\n/**\n * Validation warning with code and optional field path\n */\nexport interface ValidationWarning {\n /** Machine-readable warning code (W_INTERACTION_*) */\n code: string;\n /** Human-readable message */\n message: string;\n /** JSON path to the problematic field */\n field?: string;\n}\n\n/**\n * Result of interaction evidence validation.\n *\n * Warning-capable API: returns both errors (fatal) and warnings (non-fatal).\n * This enables conformance testing with warning fixtures.\n */\nexport type InteractionValidationResult =\n | { valid: true; value: InteractionEvidenceV01; warnings: ValidationWarning[] }\n | { valid: false; errors: ValidationError[]; warnings: ValidationWarning[] };\n\n// ============================================================================\n// Ordered Validation (Conformance)\n// ============================================================================\n\n/**\n * Validate interaction evidence with explicit evaluation ordering.\n *\n * Returns canonical error codes per validation ordering.\n * This function does NOT depend on Zod's internal validation ordering.\n * Cross-language implementations MUST produce identical error_code values\n * for the same invalid input.\n *\n * Validation order:\n * 1. Required field presence\n * 2. Required field format (interaction_id, kind, started_at)\n * 3. Kind format and reserved prefix check\n * 4. Executor field validation\n * 5. Optional field format (completed_at, digests, etc.)\n * 6. Cross-field invariants (timing, output-result, error-detail)\n * 7. Extension key namespacing\n * 8. Target consistency (kind prefix -> target field)\n *\n * @param input - Raw input to validate\n * @returns Validation result with canonical error codes on failure\n */\nexport function validateInteractionOrdered(input: unknown): InteractionValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n // Step 1: Type check (arrays are typeof 'object' but not valid input)\n if (typeof input !== 'object' || input === null || Array.isArray(input)) {\n return {\n valid: false,\n errors: [\n {\n code: 'E_INTERACTION_INVALID_FORMAT',\n message: 'Input must be an object',\n },\n ],\n warnings: [],\n };\n }\n\n const obj = input as Record<string, unknown>;\n\n // Step 2: Required field presence\n if (typeof obj.interaction_id !== 'string' || obj.interaction_id.length === 0) {\n errors.push({\n code: 'E_INTERACTION_MISSING_ID',\n message: 'interaction_id is required',\n field: 'interaction_id',\n });\n } else if (obj.interaction_id.length > INTERACTION_LIMITS.maxInteractionIdLength) {\n errors.push({\n code: 'E_INTERACTION_INVALID_FORMAT',\n message: `interaction_id exceeds max length (${INTERACTION_LIMITS.maxInteractionIdLength})`,\n field: 'interaction_id',\n });\n }\n\n // Step 3: Kind format validation\n // Empty string is semantically \"missing\", not \"invalid format\"\n if (typeof obj.kind !== 'string' || obj.kind.length === 0) {\n errors.push({\n code: 'E_INTERACTION_MISSING_KIND',\n message: 'kind is required',\n field: 'kind',\n });\n } else if (obj.kind.length < 2 || obj.kind.length > INTERACTION_LIMITS.maxKindLength) {\n errors.push({\n code: 'E_INTERACTION_INVALID_KIND_FORMAT',\n message: `kind must be 2-${INTERACTION_LIMITS.maxKindLength} characters`,\n field: 'kind',\n });\n } else if (!KIND_FORMAT_PATTERN.test(obj.kind)) {\n errors.push({\n code: 'E_INTERACTION_INVALID_KIND_FORMAT',\n message: 'kind must match pattern: lowercase, start with letter, end with alphanumeric',\n field: 'kind',\n });\n } else {\n // Check reserved prefixes\n for (const prefix of RESERVED_KIND_PREFIXES) {\n if (obj.kind.startsWith(prefix) && !WELL_KNOWN_KINDS.includes(obj.kind as never)) {\n errors.push({\n code: 'E_INTERACTION_KIND_RESERVED',\n message: `kind \"${obj.kind}\" uses reserved prefix \"${prefix}\"`,\n field: 'kind',\n });\n break;\n }\n }\n // Warn if not in well-known registry (but valid format)\n if (\n errors.length === 0 &&\n !WELL_KNOWN_KINDS.includes(obj.kind as (typeof WELL_KNOWN_KINDS)[number])\n ) {\n warnings.push({\n code: 'W_INTERACTION_KIND_UNREGISTERED',\n message: `kind \"${obj.kind}\" is not in the well-known registry`,\n field: 'kind',\n });\n }\n }\n\n // Step 4: started_at validation\n // Invalid format is treated as \"missing\" because the value is unusable\n // E_INTERACTION_INVALID_TIMING is reserved for relational errors (completed_at < started_at)\n if (typeof obj.started_at !== 'string') {\n errors.push({\n code: 'E_INTERACTION_MISSING_STARTED_AT',\n message: 'started_at is required',\n field: 'started_at',\n });\n } else {\n const startedAtDate = new Date(obj.started_at);\n if (isNaN(startedAtDate.getTime())) {\n errors.push({\n code: 'E_INTERACTION_MISSING_STARTED_AT',\n message: 'started_at must be a valid ISO 8601 datetime',\n field: 'started_at',\n });\n }\n }\n\n // Step 5: Executor validation\n if (typeof obj.executor !== 'object' || obj.executor === null) {\n errors.push({\n code: 'E_INTERACTION_MISSING_EXECUTOR',\n message: 'executor is required',\n field: 'executor',\n });\n } else {\n const executor = obj.executor as Record<string, unknown>;\n if (typeof executor.platform !== 'string' || executor.platform.length === 0) {\n errors.push({\n code: 'E_INTERACTION_MISSING_EXECUTOR',\n message: 'executor.platform is required',\n field: 'executor.platform',\n });\n } else if (executor.platform.length > INTERACTION_LIMITS.maxPlatformLength) {\n errors.push({\n code: 'E_INTERACTION_INVALID_FORMAT',\n message: `executor.platform exceeds max length (${INTERACTION_LIMITS.maxPlatformLength})`,\n field: 'executor.platform',\n });\n }\n }\n\n // Return early if we have fatal errors from required fields\n if (errors.length > 0) {\n return { valid: false, errors, warnings };\n }\n\n // Step 6: Digest validation (optional fields)\n const validateDigest = (\n digest: unknown,\n fieldPath: string\n ): { errors: ValidationError[]; valid: boolean } => {\n const digestErrors: ValidationError[] = [];\n if (typeof digest !== 'object' || digest === null) {\n digestErrors.push({\n code: 'E_INTERACTION_INVALID_DIGEST',\n message: 'digest must be an object',\n field: fieldPath,\n });\n return { errors: digestErrors, valid: false };\n }\n const d = digest as Record<string, unknown>;\n if (!CANONICAL_DIGEST_ALGS.includes(d.alg as DigestAlg)) {\n digestErrors.push({\n code: 'E_INTERACTION_INVALID_DIGEST_ALG',\n message: `digest.alg must be one of: ${CANONICAL_DIGEST_ALGS.join(', ')}`,\n field: `${fieldPath}.alg`,\n });\n }\n if (typeof d.value !== 'string' || !DIGEST_VALUE_PATTERN.test(d.value)) {\n digestErrors.push({\n code: 'E_INTERACTION_INVALID_DIGEST',\n message: 'digest.value must be 64 lowercase hex chars',\n field: `${fieldPath}.value`,\n });\n }\n if (typeof d.bytes !== 'number' || !Number.isInteger(d.bytes) || d.bytes < 0) {\n digestErrors.push({\n code: 'E_INTERACTION_INVALID_DIGEST',\n message: 'digest.bytes must be a non-negative integer',\n field: `${fieldPath}.bytes`,\n });\n }\n return { errors: digestErrors, valid: digestErrors.length === 0 };\n };\n\n // Validate input digest if present\n if (obj.input !== undefined) {\n const inputObj = obj.input as Record<string, unknown>;\n if (inputObj.digest !== undefined) {\n const result = validateDigest(inputObj.digest, 'input.digest');\n errors.push(...result.errors);\n }\n }\n\n // Validate output digest if present\n if (obj.output !== undefined) {\n const outputObj = obj.output as Record<string, unknown>;\n if (outputObj.digest !== undefined) {\n const result = validateDigest(outputObj.digest, 'output.digest');\n errors.push(...result.errors);\n }\n }\n\n // Step 7: Timing invariant (completed_at >= started_at)\n if (typeof obj.completed_at === 'string' && typeof obj.started_at === 'string') {\n const startedAt = new Date(obj.started_at).getTime();\n const completedAt = new Date(obj.completed_at).getTime();\n if (!isNaN(startedAt) && !isNaN(completedAt) && completedAt < startedAt) {\n errors.push({\n code: 'E_INTERACTION_INVALID_TIMING',\n message: 'completed_at must be >= started_at',\n field: 'completed_at',\n });\n }\n }\n\n // Step 8: Output requires result invariant\n if (obj.output !== undefined) {\n const result = obj.result as Record<string, unknown> | undefined;\n if (!result?.status) {\n errors.push({\n code: 'E_INTERACTION_MISSING_RESULT',\n message: 'result.status is required when output is present',\n field: 'result',\n });\n }\n }\n\n // Step 9: Error status requires detail (error_code OR non-empty extensions)\n // Empty extensions object {} is not valid detail\n if (obj.result !== undefined) {\n const result = obj.result as Record<string, unknown>;\n if (result.status === 'error') {\n const hasErrorCode = Boolean(result.error_code);\n const hasNonEmptyExtensions =\n obj.extensions !== undefined &&\n typeof obj.extensions === 'object' &&\n obj.extensions !== null &&\n Object.keys(obj.extensions as object).length > 0;\n if (!hasErrorCode && !hasNonEmptyExtensions) {\n errors.push({\n code: 'E_INTERACTION_MISSING_ERROR_DETAIL',\n message: 'error_code or non-empty extensions required when result.status is error',\n field: 'result.error_code',\n });\n }\n }\n }\n\n // Step 10: Extension key namespacing\n if (obj.extensions !== undefined) {\n if (typeof obj.extensions !== 'object' || obj.extensions === null) {\n errors.push({\n code: 'E_INTERACTION_INVALID_FORMAT',\n message: 'extensions must be an object',\n field: 'extensions',\n });\n } else {\n for (const key of Object.keys(obj.extensions as object)) {\n if (!EXTENSION_KEY_PATTERN.test(key)) {\n errors.push({\n code: 'E_INTERACTION_INVALID_EXTENSION_KEY',\n message: `Invalid extension key format: \"${key}\" (must be reverse-DNS/name[@version])`,\n field: `extensions.${key}`,\n });\n }\n }\n }\n }\n\n // Step 11: Target consistency (prefix-aware, using shared helpers)\n const kind = obj.kind as string;\n const hasTool = obj.tool !== undefined;\n const hasResource = obj.resource !== undefined;\n\n // tool.* kinds MUST have tool field\n if (requiresTool(kind) && !hasTool) {\n errors.push({\n code: 'E_INTERACTION_MISSING_TARGET',\n message: `kind \"${kind}\" requires tool field`,\n field: 'tool',\n });\n }\n\n // http.* and fs.* kinds MUST have resource field with meaningful content\n if (requiresResource(kind)) {\n if (!hasResource) {\n errors.push({\n code: 'E_INTERACTION_MISSING_TARGET',\n message: `kind \"${kind}\" requires resource field`,\n field: 'resource',\n });\n } else if (!hasMeaningfulResource(obj.resource as Record<string, unknown>)) {\n errors.push({\n code: 'E_INTERACTION_MISSING_TARGET',\n message: `kind \"${kind}\" requires resource.uri to be non-empty`,\n field: 'resource.uri',\n });\n }\n }\n\n // Warn if neither target present (non-strict kinds like 'message')\n if (!hasTool && !hasResource && errors.length === 0) {\n warnings.push({\n code: 'W_INTERACTION_MISSING_TARGET',\n message: 'Neither tool nor resource field is present',\n field: 'tool',\n });\n }\n\n // Return early if we have errors\n if (errors.length > 0) {\n return { valid: false, errors, warnings };\n }\n\n // Final Zod validation for strict schema compliance\n const zodResult = InteractionEvidenceV01Schema.safeParse(input);\n if (!zodResult.success) {\n return {\n valid: false,\n errors: [\n {\n code: 'E_INTERACTION_INVALID_FORMAT',\n message: zodResult.error.issues[0]?.message || 'Schema validation failed',\n field: zodResult.error.issues[0]?.path.join('.'),\n },\n ],\n warnings,\n };\n }\n\n return { valid: true, value: zodResult.data, warnings };\n}\n\n// ============================================================================\n// Compatibility Result Type\n// ============================================================================\n\n/**\n * Simple validation result for conformance harness compatibility.\n *\n * This matches the pattern used by other PEAC validators (workflow, etc.)\n * and allows conformance fixtures to test without needing to handle the\n * full warning-capable API shape.\n */\nexport interface SimpleValidationResult {\n /** Whether the input is valid */\n valid: boolean;\n /** Error code on failure */\n error_code?: string;\n /** Field path on failure */\n error_field?: string;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Validate interaction evidence (simple API for conformance harness)\n *\n * This is the recommended entry point for conformance testing.\n * Returns a simple result matching the existing harness contract.\n *\n * ## Warnings Contract\n *\n * This compat API intentionally **omits warnings** from the result.\n * Warnings are available via validateInteractionOrdered() for consumers\n * who explicitly opt in. Stable consumers should:\n * - Use this function for pass/fail validation\n * - Use validateInteractionOrdered() only when warnings are needed\n *\n * This prevents breaking changes if warning codes are added/modified.\n *\n * @param input - Raw input to validate\n * @returns Simple validation result with error_code on failure (no warnings)\n */\nexport function validateInteraction(input: unknown): SimpleValidationResult {\n const result = validateInteractionOrdered(input);\n if (result.valid) {\n return { valid: true };\n }\n const firstError = result.errors[0];\n return {\n valid: false,\n error_code: firstError?.code,\n error_field: firstError?.field,\n };\n}\n\n/**\n * Validate interaction evidence (throwing)\n *\n * @param evidence - Object to validate\n * @returns Validated InteractionEvidenceV01\n * @throws ZodError if validation fails\n */\nexport function validateInteractionEvidence(evidence: unknown): InteractionEvidenceV01 {\n return InteractionEvidenceV01Schema.parse(evidence);\n}\n\n/**\n * Check if an object is valid interaction evidence (non-throwing)\n *\n * @param evidence - Object to check\n * @returns True if valid InteractionEvidenceV01\n */\nexport function isValidInteractionEvidence(evidence: unknown): evidence is InteractionEvidenceV01 {\n return InteractionEvidenceV01Schema.safeParse(evidence).success;\n}\n\n/**\n * Check if a kind is in the well-known registry\n *\n * @param kind - Kind string to check\n * @returns True if well-known\n */\nexport function isWellKnownKind(kind: string): kind is (typeof WELL_KNOWN_KINDS)[number] {\n return WELL_KNOWN_KINDS.includes(kind as (typeof WELL_KNOWN_KINDS)[number]);\n}\n\n/**\n * Check if a kind uses a reserved prefix\n *\n * @param kind - Kind string to check\n * @returns True if uses reserved prefix\n */\nexport function isReservedKindPrefix(kind: string): boolean {\n return RESERVED_KIND_PREFIXES.some((prefix) => kind.startsWith(prefix));\n}\n\n/**\n * Check if a digest uses truncation\n *\n * @param digest - Digest to check\n * @returns True if truncated\n */\nexport function isDigestTruncated(digest: Digest): boolean {\n return digest.alg.startsWith('sha-256:trunc-');\n}\n\n// ============================================================================\n// SDK Accessors\n// ============================================================================\n\n/**\n * Get interaction evidence from a PEAC envelope\n *\n * @param receipt - PEAC envelope to read from\n * @returns Interaction evidence if present, undefined otherwise\n */\nexport function getInteraction(receipt: PEACEnvelope): InteractionEvidenceV01 | undefined {\n return receipt.evidence?.extensions?.[INTERACTION_EXTENSION_KEY] as\n | InteractionEvidenceV01\n | undefined;\n}\n\n/**\n * Set interaction evidence on a PEAC envelope (mutates)\n *\n * @param receipt - PEAC envelope to modify\n * @param interaction - Interaction evidence to set\n */\nexport function setInteraction(receipt: PEACEnvelope, interaction: InteractionEvidenceV01): void {\n if (!receipt.evidence) {\n receipt.evidence = {};\n }\n if (!receipt.evidence.extensions) {\n receipt.evidence.extensions = {};\n }\n receipt.evidence.extensions[INTERACTION_EXTENSION_KEY] = interaction as unknown as JsonValue;\n}\n\n/**\n * Check if a PEAC envelope has interaction evidence\n *\n * @param receipt - PEAC envelope to check\n * @returns True if interaction evidence is present\n */\nexport function hasInteraction(receipt: PEACEnvelope): boolean {\n return receipt.evidence?.extensions?.[INTERACTION_EXTENSION_KEY] !== undefined;\n}\n\n// ============================================================================\n// Projection API\n// ============================================================================\n\n/**\n * ReceiptView - pure view layer that makes extensions feel like top-level fields\n *\n * Does NOT modify the underlying envelope; just provides convenient access.\n * This projection allows code to work with interaction evidence as if it were\n * a first-class field while maintaining wire format stability.\n */\nexport interface ReceiptView {\n /** The underlying envelope (unchanged) */\n readonly envelope: PEACEnvelope;\n\n /** Interaction evidence (from extension) - feels like top-level */\n readonly interaction?: InteractionEvidenceV01;\n\n /** Array form for uniform pipeline processing */\n readonly interactions: readonly InteractionEvidenceV01[];\n\n /** Workflow context (from auth.extensions) */\n readonly workflow?: WorkflowContext;\n}\n\n/**\n * Create a view over a PEAC envelope that provides first-class access\n * to extension data without modifying the wire format.\n *\n * @param envelope - PEAC envelope to create view for\n * @returns ReceiptView with convenient accessors\n *\n * @example\n * const view = createReceiptView(envelope);\n * if (view.interaction) {\n * console.log(view.interaction.kind);\n * }\n */\nexport function createReceiptView(envelope: PEACEnvelope): ReceiptView {\n const interaction = getInteraction(envelope);\n const workflow = envelope.auth?.extensions?.['org.peacprotocol/workflow'] as\n | WorkflowContext\n | undefined;\n\n return {\n envelope,\n interaction,\n interactions: interaction ? [interaction] : [],\n workflow,\n };\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Parameters for creating interaction evidence\n */\nexport interface CreateInteractionParams {\n interaction_id: string;\n kind: string;\n executor: {\n platform: string;\n version?: string;\n plugin_id?: string;\n plugin_digest?: Digest;\n };\n tool?: {\n name: string;\n provider?: string;\n version?: string;\n };\n resource?: {\n uri?: string;\n method?: string;\n };\n input?: {\n digest: Digest;\n redaction: (typeof REDACTION_MODES)[number];\n };\n output?: {\n digest: Digest;\n redaction: (typeof REDACTION_MODES)[number];\n };\n started_at: string;\n completed_at?: string;\n duration_ms?: number;\n result?: {\n status: (typeof RESULT_STATUSES)[number];\n error_code?: string;\n retryable?: boolean;\n };\n policy?: {\n decision: (typeof POLICY_DECISIONS)[number];\n sandbox_enabled?: boolean;\n elevated?: boolean;\n effective_policy_digest?: Digest;\n };\n refs?: {\n payment_reference?: string;\n related_receipt_rid?: string;\n };\n extensions?: Record<string, JsonValue>;\n}\n\n/**\n * Create validated interaction evidence\n *\n * @param params - Interaction parameters\n * @returns Validated InteractionEvidenceV01\n * @throws ZodError if validation fails\n */\nexport function createInteractionEvidence(params: CreateInteractionParams): InteractionEvidenceV01 {\n const evidence: InteractionEvidenceV01 = {\n interaction_id: params.interaction_id,\n kind: params.kind,\n executor: {\n platform: params.executor.platform,\n ...(params.executor.version && { version: params.executor.version }),\n ...(params.executor.plugin_id && { plugin_id: params.executor.plugin_id }),\n ...(params.executor.plugin_digest && { plugin_digest: params.executor.plugin_digest }),\n },\n ...(params.tool && { tool: params.tool }),\n ...(params.resource && { resource: params.resource }),\n ...(params.input && { input: params.input }),\n ...(params.output && { output: params.output }),\n started_at: params.started_at,\n ...(params.completed_at && { completed_at: params.completed_at }),\n ...(params.duration_ms !== undefined && { duration_ms: params.duration_ms }),\n ...(params.result && { result: params.result }),\n ...(params.policy && { policy: params.policy }),\n ...(params.refs && { refs: params.refs }),\n ...(params.extensions && { extensions: params.extensions }),\n };\n\n return validateInteractionEvidence(evidence);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@peac/schema",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.2",
|
|
4
4
|
"description": "PEAC Protocol JSON schemas, OpenAPI specs, and TypeScript types",
|
|
5
5
|
"main": "dist/index.cjs",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
},
|
|
64
64
|
"dependencies": {
|
|
65
65
|
"zod": "^4.3.6",
|
|
66
|
-
"@peac/kernel": "0.11.
|
|
66
|
+
"@peac/kernel": "0.11.2"
|
|
67
67
|
},
|
|
68
68
|
"devDependencies": {
|
|
69
69
|
"@types/node": "^22.19.11",
|