UNPKG

services-as-software

Version:

Primitives for building AI-powered services that operate as software

544 lines (486 loc) 12.1 kB
/** * Core types for services-as-software */ import type { AIFunctionDefinition, JSONSchema as AIJSONSchema } from 'ai-functions' // Re-export JSONSchema for use in this package export type JSONSchema = AIJSONSchema // Use Promise for RPC interface definitions type RpcPromise<T> = Promise<T> /** * Pricing models for services */ export type PricingModel = | 'free' | 'fixed' | 'per-use' | 'subscription' | 'tiered' | 'usage-based' | 'custom' /** * Billing intervals for subscriptions */ export type BillingInterval = 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'custom' /** * Service status */ export type ServiceStatus = 'active' | 'inactive' | 'deprecated' | 'beta' | 'alpha' /** * Order status */ export type OrderStatus = 'pending' | 'processing' | 'completed' | 'failed' | 'cancelled' /** * Subscription status */ export type SubscriptionStatus = 'active' | 'paused' | 'cancelled' | 'expired' | 'pending' /** * Currency code (ISO 4217) */ export type Currency = 'USD' | 'EUR' | 'GBP' | 'JPY' | 'CNY' | string /** * Pricing configuration */ export interface PricingConfig { /** Pricing model type */ model: PricingModel /** Base price (for fixed or subscription) */ basePrice?: number /** Currency code */ currency?: Currency /** Price per unit (for per-use or usage-based) */ pricePerUnit?: number /** Billing interval (for subscriptions) */ interval?: BillingInterval /** Usage tiers (for tiered pricing) */ tiers?: PricingTier[] /** Free tier limits */ freeTier?: { requests?: number units?: number resetInterval?: BillingInterval } } /** * Pricing tier for tiered pricing models */ export interface PricingTier { /** Starting quantity for this tier */ from: number /** Ending quantity (exclusive) - undefined means no upper limit */ to?: number /** Price per unit in this tier */ pricePerUnit: number /** Fixed price for this tier */ fixedPrice?: number } /** * Service endpoint definition */ export interface EndpointDefinition<TInput = unknown, TOutput = unknown> { /** Endpoint name */ name: string /** Description of what this endpoint does */ description?: string /** HTTP method (for REST endpoints) */ method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' /** Path pattern (e.g., '/users/:id') */ path?: string /** Input schema */ input?: JSONSchema /** Output schema */ output?: JSONSchema /** Handler function */ handler: (input: TInput, context?: ServiceContext) => TOutput | Promise<TOutput> /** Pricing specific to this endpoint */ pricing?: PricingConfig /** Rate limiting */ rateLimit?: { requests: number window: number // milliseconds } /** Whether authentication is required */ requiresAuth?: boolean } /** * Service context provided to endpoint handlers */ export interface ServiceContext { /** Customer/user ID */ customerId?: string /** Subscription ID */ subscriptionId?: string /** Request ID for tracing */ requestId: string /** Request metadata */ metadata?: Record<string, unknown> /** Entitlements for this customer */ entitlements: string[] /** Usage tracking */ usage?: UsageTracker } /** * Usage tracker for billing and analytics */ export interface UsageTracker { /** Track a usage event */ track(event: UsageEvent): Promise<void> /** Get current usage for a customer */ get(customerId: string, period?: { start: Date; end: Date }): Promise<Usage> } /** * Usage event */ export interface UsageEvent { /** Customer ID */ customerId: string /** Endpoint or resource that was used */ resource: string /** Quantity used */ quantity: number /** Additional metadata */ metadata?: Record<string, unknown> /** Timestamp */ timestamp?: Date } /** * Usage summary */ export interface Usage { /** Customer ID */ customerId: string /** Usage by resource */ byResource: Record<string, number> /** Total usage */ total: number /** Period start */ periodStart: Date /** Period end */ periodEnd: Date } /** * Service definition */ export interface ServiceDefinition { /** Service name */ name: string /** Service version */ version: string /** Description */ description?: string /** Service status */ status?: ServiceStatus /** Service endpoints */ endpoints: EndpointDefinition[] /** Default pricing configuration */ pricing?: PricingConfig /** Service-level functions (AI tools) */ functions?: AIFunctionDefinition[] /** Event handlers */ events?: Record<string, EventHandler> /** Scheduled tasks */ scheduled?: ScheduledTask[] /** Subscription plans */ plans?: SubscriptionPlan[] /** Entitlement definitions */ entitlements?: EntitlementDefinition[] /** KPI definitions */ kpis?: KPIDefinition[] /** OKR definitions */ okrs?: OKRDefinition[] } /** * Event handler definition */ export interface EventHandler<TPayload = unknown> { /** Event name/pattern */ event: string /** Handler function */ handler: (payload: TPayload, context?: ServiceContext) => void | Promise<void> /** Whether to retry on failure */ retry?: boolean /** Max retry attempts */ maxRetries?: number } /** * Scheduled task definition */ export interface ScheduledTask<TInput = unknown> { /** Task name */ name: string /** Cron expression or interval */ schedule: string /** Task handler */ handler: (input?: TInput, context?: ServiceContext) => void | Promise<void> /** Whether task is enabled */ enabled?: boolean } /** * Subscription plan */ export interface SubscriptionPlan { /** Plan ID */ id: string /** Plan name */ name: string /** Description */ description?: string /** Pricing configuration */ pricing: PricingConfig /** Entitlements included */ entitlements: string[] /** Features included */ features: string[] /** Usage limits */ limits?: Record<string, number> /** Trial period (days) */ trialDays?: number } /** * Entitlement definition */ export interface EntitlementDefinition { /** Entitlement ID */ id: string /** Human-readable name */ name: string /** Description */ description?: string /** Resource type this entitlement grants access to */ resource?: string /** Actions permitted */ actions?: string[] } /** * KPI (Key Performance Indicator) definition */ export interface KPIDefinition { /** KPI ID */ id: string /** KPI name */ name: string /** Description */ description?: string /** How to calculate this KPI */ calculate: () => Promise<number | string> /** Target value */ target?: number | string /** Unit of measurement */ unit?: string /** Update frequency */ updateInterval?: BillingInterval } /** * OKR (Objectives and Key Results) definition */ export interface OKRDefinition { /** OKR ID */ id: string /** Objective statement */ objective: string /** Key results */ keyResults: KeyResult[] /** Quarter or time period */ period?: string /** Owner */ owner?: string } /** * Key Result within an OKR */ export interface KeyResult { /** Key result description */ description: string /** How to measure this result */ measure: () => Promise<number> /** Target value */ target: number /** Current value */ current?: number /** Unit of measurement */ unit?: string } /** * Order definition */ export interface Order<TProduct = unknown> { /** Order ID */ id: string /** Customer ID */ customerId: string /** Product or service being ordered */ product: TProduct /** Quantity */ quantity: number /** Total price */ total: number /** Currency */ currency: Currency /** Order status */ status: OrderStatus /** Created timestamp */ createdAt: Date /** Updated timestamp */ updatedAt: Date /** Additional metadata */ metadata?: Record<string, unknown> } /** * Quote definition */ export interface Quote<TProduct = unknown> { /** Quote ID */ id: string /** Customer ID */ customerId: string /** Product or service being quoted */ product: TProduct /** Quantity */ quantity: number /** Quoted price */ price: number /** Currency */ currency: Currency /** Valid until */ expiresAt: Date /** Quote metadata */ metadata?: Record<string, unknown> } /** * Subscription definition */ export interface Subscription { /** Subscription ID */ id: string /** Customer ID */ customerId: string /** Plan ID */ planId: string /** Subscription status */ status: SubscriptionStatus /** Current period start */ currentPeriodStart: Date /** Current period end */ currentPeriodEnd: Date /** Cancel at period end */ cancelAtPeriodEnd?: boolean /** Trial end date */ trialEnd?: Date /** Metadata */ metadata?: Record<string, unknown> } /** * Notification definition */ export interface Notification { /** Notification ID */ id: string /** Recipient(s) */ to: string | string[] /** Subject */ subject: string /** Message body */ body: string /** Channel (email, slack, sms, etc.) */ channel: string /** Priority */ priority?: 'low' | 'normal' | 'high' | 'urgent' /** Metadata */ metadata?: Record<string, unknown> } /** * Service client interface */ export interface ServiceClient { /** Ask a question to the service */ ask(question: string, context?: unknown): RpcPromise<string> /** Deliver results */ deliver(orderId: string, results: unknown): RpcPromise<void> /** Execute a task */ do(action: string, input?: unknown): RpcPromise<unknown> /** Generate content */ generate(prompt: string, options?: unknown): RpcPromise<unknown> /** Type checking/validation */ is(value: unknown, type: string | JSONSchema): RpcPromise<boolean> /** Send notification */ notify(notification: Notification): RpcPromise<void> /** Place an order */ order<TProduct>(product: TProduct, quantity: number): RpcPromise<Order<TProduct>> /** Request a quote */ quote<TProduct>(product: TProduct, quantity: number): RpcPromise<Quote<TProduct>> /** Subscribe to a plan */ subscribe(planId: string): RpcPromise<Subscription> /** Get entitlements */ entitlements(): RpcPromise<string[]> /** Get KPIs */ kpis(): RpcPromise<Record<string, number | string>> /** Get OKRs */ okrs(): RpcPromise<OKRDefinition[]> } /** * Service instance returned by Service() */ export interface Service extends ServiceClient { /** Service definition */ definition: ServiceDefinition /** Call an endpoint directly */ call<TInput, TOutput>( endpoint: string, input: TInput, context?: ServiceContext ): RpcPromise<TOutput> /** Register an event handler */ on<TPayload>( event: string, handler: (payload: TPayload, context?: ServiceContext) => void | Promise<void> ): void /** Schedule a recurring task */ every( schedule: string, handler: (context?: ServiceContext) => void | Promise<void> ): void /** Add a queue processor */ queue<TJob>( name: string, handler: (job: TJob, context?: ServiceContext) => void | Promise<void> ): void /** Get service as RPC target */ asRPC(): unknown /** Get service as API routes */ asAPI(): unknown } /** * Provider interface for services */ export interface Provider { /** Provider name */ name: string /** Base URL */ baseUrl: string /** Authentication configuration */ auth?: { type: 'api-key' | 'oauth' | 'jwt' | 'basic' credentials: Record<string, string> } /** Available services */ services: string[] /** Get a service client */ service<T extends ServiceClient>(serviceName: string): T } /** * Client configuration for connecting to remote services */ export interface ClientConfig { /** Service URL or provider */ url?: string /** Provider instance */ provider?: Provider /** Authentication */ auth?: { type: 'api-key' | 'oauth' | 'jwt' | 'basic' credentials: Record<string, string> } /** Custom headers */ headers?: Record<string, string> /** Timeout (milliseconds) */ timeout?: number }