@mulutime/plugin-types
Version:
TypeScript types for the MuluTime plugin system
360 lines • 10.7 kB
TypeScript
import { JSONSchema7 } from 'json-schema';
import { IntegrationType } from './integrations';
export interface PluginEventSubscription {
eventType: string;
handler: string;
description?: string;
filters?: {
userId?: string;
organizationId?: string;
conditions?: Record<string, any>;
};
enabled?: boolean;
priority?: number;
}
export interface PluginScheduledFunction {
name: string;
handler: string;
schedule: PluginScheduleType;
description?: string;
timezone?: string;
enabled?: boolean;
}
export interface PluginApiAction {
name: string;
handler: string;
description: string;
permissions: PluginPermission[];
parameters?: JSONSchema7;
enabled?: boolean;
}
export declare enum PluginScheduleType {
HOURLY = "HOURLY",
DAILY = "DAILY",
WEEKLY = "WEEKLY",
MONTHLY = "MONTHLY",
CUSTOM = "CUSTOM"
}
export declare enum APIAccessScope {
'USER' = "USER",// Access to user/organization who installed the plugin
'PLUGIN' = "PLUGIN",// Access to the plugin's own via plugin secret key
'WORLD' = "WORLD"
}
export interface PluginManifest {
id: string;
name: string;
version: string;
description: string;
author: {
name: string;
email: string;
url?: string;
};
homepage?: string;
repository?: string;
license: string;
provider: string;
type: IntegrationType[];
tags: string[];
category: PluginCategory;
permissions: PluginPermission[];
apiVersion: string;
minSystemVersion: string;
configSchema?: JSONSchema7;
allowMultipleInstances?: boolean;
main: string;
webhooks?: string[];
icon?: string;
screenshots?: string[];
pricing?: PluginPricing;
supportUrl?: string;
eventSubscriptions?: PluginEventSubscription[];
scheduledFunctions?: PluginScheduledFunction[];
apiActions?: PluginApiAction[];
}
export interface PluginPricing {
type: 'FREE' | 'PAID' | 'FREEMIUM' | 'SUBSCRIPTION';
price?: number;
currency?: string;
billingPeriod?: 'MONTHLY' | 'YEARLY' | 'ONE_TIME';
trialDays?: number;
}
export declare enum PluginCategory {
CALENDAR = "CALENDAR",
COMMUNICATION = "COMMUNICATION",
PAYMENT = "PAYMENT",
CRM = "CRM",
ANALYTICS = "ANALYTICS",
PRODUCTIVITY = "PRODUCTIVITY",
SECURITY = "SECURITY",
OTHER = "OTHER"
}
export declare enum PluginPermission {
READ_USER_DATA = "READ_USER_DATA",
WRITE_USER_DATA = "WRITE_USER_DATA",
READ_ORGANIZATION_DATA = "READ_ORGANIZATION_DATA",
WRITE_ORGANIZATION_DATA = "WRITE_ORGANIZATION_DATA",
EXTERNAL_API_ACCESS = "EXTERNAL_API_ACCESS",
WEBHOOK_ACCESS = "WEBHOOK_ACCESS",
DATABASE_ACCESS = "DATABASE_ACCESS",
FILE_SYSTEM_ACCESS = "FILE_SYSTEM_ACCESS",
CREATE_CALENDAR_EVENTS = "CREATE_CALENDAR_EVENTS",
SEND_NOTIFICATIONS = "SEND_NOTIFICATIONS",
PAYMENT_PROCESSING = "PAYMENT_PROCESSING",
SCHEDULED_FUNCTIONS = "SCHEDULED_FUNCTIONS",
READ_EVENT_TYPES = "READ_EVENT_TYPES",
WRITE_EVENT_TYPES = "WRITE_EVENT_TYPES",
READ_BOOKINGS = "READ_BOOKINGS",
WRITE_BOOKINGS = "WRITE_BOOKINGS",
READ_SCHEDULES = "READ_SCHEDULES",
WRITE_SCHEDULES = "WRITE_SCHEDULES",
READ_ORGANIZATIONS = "READ_ORGANIZATIONS",
WRITE_ORGANIZATIONS = "WRITE_ORGANIZATIONS",
READ_TEAMS = "READ_TEAMS",
WRITE_TEAMS = "WRITE_TEAMS",
TRIGGER_EVENTS = "TRIGGER_EVENTS",
MANAGE_USERS = "MANAGE_USERS",
READ_SETTINGS = "READ_SETTINGS",
WRITE_SETTINGS = "WRITE_SETTINGS"
}
export interface PluginInstance {
id: string;
pluginId: string;
userId?: string;
organizationId?: string;
status: PluginStatus;
config: Record<string, any>;
installedAt: string;
updatedAt: string;
lastUsedAt?: string;
version: string;
enabled: boolean;
permissions: PluginPermission[];
errors?: PluginInstanceError[];
warnings?: string[];
}
export interface CalPluginInstance extends PluginInstance {
calendarId?: string;
externalCalendarId?: string;
}
export declare enum PluginStatus {
INSTALLING = "INSTALLING",
INSTALLED = "INSTALLED",
ACTIVE = "ACTIVE",
INACTIVE = "INACTIVE",
ERROR = "ERROR",
UPDATING = "UPDATING",
UNINSTALLING = "UNINSTALLING"
}
export interface PluginContext {
userId?: string;
organizationId?: string;
pluginId: string;
permissions: PluginPermission[];
config: Record<string, any>;
logger: PluginLogger;
storage: PluginStorage;
api: PluginAPIClient;
http: any;
setConfig?: (config: Record<string, any>) => Promise<void>;
errors: PluginErrorHandler;
systemBaseUrl?: string;
apiToken?: string;
}
export interface PluginLogger {
debug(message: string, meta?: any): void;
info(message: string, meta?: any): void;
warn(message: string, meta?: any): void;
error(message: string, error?: Error, meta?: any): void;
}
export interface PluginStorage {
get<T = any>(key: string): Promise<T | null>;
set(key: string, value: any): Promise<void>;
delete(key: string): Promise<void>;
list(prefix?: string): Promise<string[]>;
}
export interface PluginAPIClient {
get(url: string, options?: RequestInit): Promise<Response>;
post(url: string, data?: any, options?: RequestInit): Promise<Response>;
put(url: string, data?: any, options?: RequestInit): Promise<Response>;
delete(url: string, options?: RequestInit): Promise<Response>;
}
export interface PluginSchedule {
type: ScheduleType;
pattern?: string;
interval?: number;
hour?: number;
minute?: number;
}
export declare enum ScheduleType {
HOURLY = "HOURLY",// Every hour at specified minute
DAILY = "DAILY",// Every day at specified hour:minute
INTERVAL = "INTERVAL",// Every X minutes
CRON = "CRON"
}
export interface PluginScheduleSubscription {
id: string;
pluginId: string;
instanceId: string;
functionName: string;
schedule: PluginSchedule;
enabled: boolean;
description?: string;
timezone: string;
userId?: string;
organizationId?: string;
lastExecuted?: string;
nextExecution?: string;
executionCount: number;
failureCount: number;
createdAt: string;
updatedAt: string;
}
export interface IntegrationPlugin {
manifest: PluginManifest;
onInstall?(context: PluginContext): Promise<void>;
onUninstall?(context: PluginContext): Promise<void>;
onUpdate?(context: PluginContext, oldVersion: string): Promise<void>;
onActivate?(context: PluginContext): Promise<void>;
onDeactivate?(context: PluginContext): Promise<void>;
validateConfig?(config: Record<string, any>): Promise<ValidationResult>;
getConfigSchema?(): JSONSchema7;
getEventSubscriptions?(): Array<{
eventTypes: string[];
actionMethod: string;
filters?: {
userId?: string;
organizationId?: string;
conditions?: Record<string, any>;
};
enabled?: boolean;
priority?: number;
}>;
getScheduledFunctions?(): Array<{
functionName: string;
schedule: PluginSchedule;
enabled?: boolean;
description?: string;
timezone?: string;
}>;
handleWebhook?(context: PluginContext, payload: any): Promise<any>;
[key: string]: any;
}
export interface ValidationResult {
valid: boolean;
errors?: string[];
warnings?: string[];
}
export interface PluginRegistryEntry {
manifest: PluginManifest;
downloadUrl: string;
checksum: string;
publisherId: string;
publishedAt: string;
downloads: number;
rating?: number;
reviews?: number;
verified: boolean;
eventSubscriptions: PluginEventSubscription[];
scheduledFunctions: PluginScheduledFunction[];
apiActions: PluginApiAction[];
}
export interface PluginSearchFilters {
category?: PluginCategory;
type?: IntegrationType;
verified?: boolean;
free?: boolean;
query?: string;
tags?: string[];
}
export interface ActiveEventSubscription {
id: string;
pluginId: string;
instanceId: string;
eventType: string;
handler: string;
description?: string;
filters?: {
userId?: string;
organizationId?: string;
conditions?: Record<string, any>;
};
isActive: boolean;
priority: number;
createdAt: string;
lastTriggered?: string;
triggerCount: number;
}
export interface ActiveScheduledFunction {
id: string;
pluginId: string;
instanceId: string;
functionName: string;
handler: string;
schedule: PluginScheduleType;
description?: string;
timezone: string;
isActive: boolean;
lastExecuted?: string;
nextExecution?: string;
executionCount: number;
failureCount: number;
createdAt: string;
}
export interface ActiveApiAction {
id: string;
pluginId: string;
instanceId: string;
actionName: string;
handler: string;
description: string;
permissions: PluginPermission[];
parameters?: JSONSchema7;
isActive: boolean;
createdAt: string;
lastExecuted?: string;
executionCount: number;
}
export { IntegrationType, IntegrationProvider, UserIntegration } from './integrations';
export interface PluginErrorHandler {
/**
* Report a user-facing error that should be displayed in the UI
* @param message - Error message to display to the user
* @param type - Type of error (info, warning, error, critical)
* @param details - Additional error details for debugging
*/
reportUserError(message: string, type?: 'info' | 'warning' | 'error' | 'critical', details?: any): void;
/**
* Report a system error for logging and monitoring
* @param error - Error object or message
* @param context - Additional context for debugging
*/
reportSystemError(error: Error | string, context?: any): void;
/**
* Clear any existing errors for this plugin instance
*/
clearErrors(): void;
/**
* Get current errors for this plugin instance
*/
getErrors(): PluginError[];
}
export interface PluginInstanceError {
type: 'info' | 'warning' | 'error' | 'critical';
message: string;
details?: any;
timestamp: string;
}
export interface PluginError {
id: string;
pluginId: string;
instanceId?: string;
userId?: string;
organizationId?: string;
type: 'info' | 'warning' | 'error' | 'critical';
message: string;
details?: any;
timestamp: string;
resolved: boolean;
}
//# sourceMappingURL=plugin-system.d.ts.map