import { z } from 'zod'; import type { ActorRef, CapabilityDescriptor, CapabilitySurface, GatewayScope } from '@xopcai/gateway-contract'; export { CapabilityError } from './errors.js'; /** Constructed by a trusted entry point, never parsed from tool or HTTP input. */ export interface CapabilityContext { principalId: string; surface: CapabilitySurface; scopes: readonly GatewayScope[]; allowedCapabilities?: readonly string[]; authorize: (id: string, input: unknown) => boolean | Promise; signal?: AbortSignal; /** Synchronous lease/grant guard immediately before domain execution or receipt replay. */ assertCurrent?: () => void; actor?: ActorRef; /** Active conversation supplied by the trusted Agent runtime. */ conversationId?: string; } export interface ReadCapability { id: string; majorVersion: number; description: string; effect: 'read'; surfaces: readonly CapabilitySurface[]; scopes: readonly GatewayScope[]; input: I; output: O; execute: (input: z.output, context: CapabilityContext) => z.input | Promise>; } export declare function defineReadCapability(definition: ReadCapability): ReadCapability; export interface AtomicCapability extends Omit, 'effect' | 'execute'> { effect: 'local-write'; /** Bind receipts to trusted domain ownership that is not supplied in the public input. */ requestScope?: (context: CapabilityContext) => string; /** Read-only asynchronous validation, skipped for committed receipt replay. Never perform effects here. */ prepare?: (input: z.output, context: CapabilityContext) => void | Promise; execute: (input: z.output, context: CapabilityContext & { operationId: string; idempotencyKey: string; }) => z.input; afterCommit?: (result: z.output, input: z.output) => void | Promise; } export declare function defineAtomicCapability(definition: AtomicCapability): AtomicCapability; export interface ExternalCapability extends Omit, 'effect' | 'execute'> { effect: 'external-write'; recovery: 'manual' | 'provider-idempotent'; requestScope?: (context: CapabilityContext) => string; /** Provider-idempotent implementations must send operationId as the provider key. */ execute: (input: z.output, context: CapabilityContext & { operationId: string; idempotencyKey: string; }) => Promise>; } export declare function defineExternalCapability(definition: ExternalCapability): ExternalCapability; type CapabilityDefinition = ReadCapability | AtomicCapability | ExternalCapability; /** Stable JSON encoding for contract digests; rejects non-JSON values. */ export declare function canonicalCapabilityJson(value: unknown): string; export declare class CapabilityDispatcher { private readonly entries; register(definition: CapabilityDefinition): void; private visible; list(context: CapabilityContext): CapabilityDescriptor[]; describe(id: string, context: CapabilityContext): CapabilityDescriptor; validateInput(id: string, input: unknown, context: CapabilityContext): Promise; call(id: string, input: unknown, context: CapabilityContext, expected?: { majorVersion: number; descriptorDigest: string; idempotencyKey?: string; }): Promise; private validateResult; }