UNPKG

@beignet/core

Version:

Core framework primitives for Beignet

197 lines 10.2 kB
import type { StandardSchemaV1 } from "@standard-schema/spec"; import { type ProviderInstrumentationTarget } from "../providers/index.js"; import type { TracingPort } from "../tracing/index.js"; /** Any Standard Schema compatible validator. */ export type AgentCapabilitySchema = StandardSchemaV1<unknown, unknown>; /** Value or promise of that value. */ export type MaybePromise<T> = T | Promise<T>; /** Infer the input accepted by a capability schema. */ export type InferAgentCapabilitySchemaInput<Schema extends StandardSchemaV1> = StandardSchemaV1.InferInput<Schema>; /** Infer the parsed output produced by a capability schema. */ export type InferAgentCapabilitySchemaOutput<Schema extends StandardSchemaV1> = StandardSchemaV1.InferOutput<Schema>; /** A typed action that an authenticated agent transport may expose. */ export interface AgentCapabilityDef<Name extends string = string, Input extends AgentCapabilitySchema = AgentCapabilitySchema, Output extends AgentCapabilitySchema = AgentCapabilitySchema, Ctx = unknown, Principal = unknown> { readonly kind: "agentCapability"; readonly name: Name; readonly description: string; readonly input: Input; readonly output: Output; readonly handle: (args: { capability: AgentCapabilityDef<Name, Input, Output, Ctx, Principal>; ctx: Ctx; principal: Principal; input: InferAgentCapabilitySchemaOutput<Input>; }) => MaybePromise<InferAgentCapabilitySchemaInput<Output>>; } /** Broad capability definition shape tied to one context and principal. */ export interface AgentCapabilityFor<Ctx, Principal> { readonly kind: "agentCapability"; readonly name: string; readonly description: string; readonly input: AgentCapabilitySchema; readonly output: AgentCapabilitySchema; readonly handle: (args: { capability: never; ctx: Ctx; principal: Principal; input: never; }) => MaybePromise<unknown>; } /** Broad capability definition shape used by registries and adapters. */ export type AnyAgentCapabilityDef = AgentCapabilityFor<never, never>; /** Infer a capability's application context. */ export type AgentCapabilityContext<Capability extends AnyAgentCapabilityDef> = Capability extends { handle(args: { ctx: infer Ctx; }): unknown; } ? Ctx : never; /** Infer a capability's verified principal. */ export type AgentCapabilityPrincipal<Capability extends AnyAgentCapabilityDef> = Capability extends { handle(args: { principal: infer Principal; }): unknown; } ? Principal : never; /** Infer a capability's raw input. */ export type AgentCapabilityInput<Capability extends AnyAgentCapabilityDef> = InferAgentCapabilitySchemaInput<Capability["input"]>; /** Infer the parsed input passed to capability context and execution. */ export type AgentCapabilityParsedInput<Capability extends AnyAgentCapabilityDef> = InferAgentCapabilitySchemaOutput<Capability["input"]>; /** Infer a capability's validated output. */ export type AgentCapabilityOutput<Capability extends AnyAgentCapabilityDef> = InferAgentCapabilitySchemaOutput<Capability["output"]>; /** Options accepted by `defineAgentCapability(...)`. */ export interface DefineAgentCapabilityOptions<Name extends string, Input extends AgentCapabilitySchema, Output extends AgentCapabilitySchema, Ctx, Principal> { description: string; input: Input; output: Output; handle(args: { capability: AgentCapabilityDef<Name, Input, Output, Ctx, Principal>; ctx: Ctx; principal: Principal; input: InferAgentCapabilitySchemaOutput<Input>; }): MaybePromise<InferAgentCapabilitySchemaInput<Output>>; } /** Context-bound capability definition helpers. */ export interface AgentCapabilities<Ctx, Principal> { defineAgentCapability<const Name extends string, Input extends AgentCapabilitySchema, Output extends AgentCapabilitySchema>(name: Name, options: DefineAgentCapabilityOptions<Name, Input, Output, Ctx, Principal>): AgentCapabilityDef<Name, Input, Output, Ctx, Principal>; defineAgentCapabilityRegistry<const Definitions extends readonly AgentCapabilityFor<Ctx, Principal>[]>(definitions: Definitions): AgentCapabilityRegistry<Definitions>; } /** Bind application context and principal types once for capability definitions. */ export declare function createAgentCapabilities<Ctx, Principal>(): AgentCapabilities<Ctx, Principal>; /** Error thrown when a capability registry is ambiguous. */ export declare class AgentCapabilityRegistryError extends Error { constructor(message: string); } /** Registered capability definitions available to execution adapters. */ export interface AgentCapabilityRegistry<Definitions extends readonly AnyAgentCapabilityDef[] = readonly AnyAgentCapabilityDef[]> { readonly definitions: Definitions; get(name: string): Definitions[number] | undefined; } /** Stable capability execution failure categories. */ export type AgentCapabilityErrorCode = "unknown_capability" | "invalid_input" | "invalid_output" | "execution_failed"; /** Error raised by capability lookup, validation, or execution. */ export declare class AgentCapabilityError extends Error { readonly code: AgentCapabilityErrorCode; readonly capabilityName: string; readonly issues?: readonly StandardSchemaV1.Issue[]; readonly cause?: unknown; constructor(args: { code: AgentCapabilityErrorCode; capabilityName: string; message: string; issues?: readonly StandardSchemaV1.Issue[]; cause?: unknown; }); } /** A parsed invocation passed to the app-owned context resolver. */ export type AgentCapabilityContextRequest<Definitions extends readonly AnyAgentCapabilityDef[], Principal> = { [Capability in Definitions[number] as Capability["name"]]: { capability: Capability; name: Capability["name"]; principal: Principal; input: InferAgentCapabilitySchemaOutput<Capability["input"]>; }; }[Definitions[number]["name"]]; /** Stage reached by an agent capability attempt. */ export type AgentCapabilityRunStage = "lookup" | "input" | "authorization" | "context" | "handler" | "output"; /** Successful capability lifecycle event with validated application data. */ export type AgentCapabilityCompletedRunEvent<Ctx, Principal, Definitions extends readonly AnyAgentCapabilityDef[] = readonly AnyAgentCapabilityDef[], Capability extends Definitions[number] = Definitions[number]> = Capability extends Definitions[number] ? { name: Capability["name"]; phase: "end"; stage: "output"; capability: Capability; ctx: Ctx; principal: Principal; input: AgentCapabilityParsedInput<Capability>; output: AgentCapabilityOutput<Capability>; durationMs: number; error?: undefined; } : never; /** Lifecycle event observed around a capability attempt. */ export type AgentCapabilityRunEvent<Ctx, Principal, Definitions extends readonly AnyAgentCapabilityDef[] = readonly AnyAgentCapabilityDef[]> = { name: string; phase: "start"; stage: "lookup"; capability?: Definitions[number]; ctx?: undefined; principal: Principal; input?: undefined; output?: undefined; durationMs?: undefined; error?: undefined; } | AgentCapabilityCompletedRunEvent<Ctx, Principal, Definitions> | { name: string; phase: "error"; stage: AgentCapabilityRunStage; capability?: Definitions[number]; ctx?: Ctx; principal: Principal; /** Present only when input validation completed successfully. */ input?: unknown; output?: undefined; durationMs: number; error: unknown; }; /** Best-effort lifecycle observer for capability execution. */ export type AgentCapabilityHook<Ctx, Principal, Definitions extends readonly AnyAgentCapabilityDef[] = readonly AnyAgentCapabilityDef[]> = (event: AgentCapabilityRunEvent<Ctx, Principal, Definitions>) => MaybePromise<void>; /** Options for a capability executor. */ export interface CreateAgentCapabilityExecutorOptions<Ctx, Principal, Definitions extends readonly AnyAgentCapabilityDef[]> { registry: AgentCapabilityRegistry<Definitions>; createContext(request: AgentCapabilityContextRequest<Definitions, Principal>): MaybePromise<Ctx>; hooks?: readonly AgentCapabilityHook<Ctx, Principal, Definitions>[]; /** Independent target used to observe failures before context exists. */ instrumentation?: ProviderInstrumentationTarget; tracing?: TracingPort; } /** Raw dynamic invocation accepted by protocol adapters. */ export interface DynamicAgentCapabilityInvocation<Principal> { name: string; principal: Principal; input: unknown; /** * Transport-owned authorization against the exact parsed input that will be * passed to context construction and the capability handler. */ authorize?(request: DynamicAgentCapabilityAuthorization<Principal>): MaybePromise<void>; } /** Parsed invocation exposed to a dynamic transport authorization callback. */ export interface DynamicAgentCapabilityAuthorization<Principal> { capability: AnyAgentCapabilityDef; name: string; principal: Principal; input: unknown; } /** Typed and dynamic execution surface for one capability registry. */ export interface AgentCapabilityExecutor<Principal, Definitions extends readonly AnyAgentCapabilityDef[]> { execute<Name extends Definitions[number]["name"]>(args: { name: Name; principal: Principal; input: AgentCapabilityInput<Extract<Definitions[number], { name: Name; }>>; }): Promise<AgentCapabilityOutput<Extract<Definitions[number], { name: Name; }>>>; executeDynamic(args: DynamicAgentCapabilityInvocation<Principal>): Promise<unknown>; } /** Create a validated, traced executor for a capability registry. */ export declare function createAgentCapabilityExecutor<const Definitions extends readonly AnyAgentCapabilityDef[]>(options: CreateAgentCapabilityExecutorOptions<AgentCapabilityContext<Definitions[number]>, AgentCapabilityPrincipal<Definitions[number]>, Definitions>): AgentCapabilityExecutor<AgentCapabilityPrincipal<Definitions[number]>, Definitions>; //# sourceMappingURL=index.d.ts.map