feat: plugins v1

This commit is contained in:
2026-04-29 01:14:14 +02:00
parent ec3802ade6
commit 6920f93b41
86 changed files with 9036 additions and 14 deletions

View File

@@ -10,5 +10,6 @@ export * from './chat-events';
export * from './media-preferences';
export * from './signaling-contracts';
export * from './attachment-contracts';
export * from './plugin-system.contracts';
export * from './p2p-transfer.constants';
export * from './p2p-transfer.utils';

View File

@@ -0,0 +1,193 @@
export const PLUGIN_REQUIREMENT_STATUSES = [
'required',
'optional',
'recommended',
'blocked',
'incompatible'
] as const;
export type PluginRequirementStatus = typeof PLUGIN_REQUIREMENT_STATUSES[number];
export const PLUGIN_EVENT_DIRECTIONS = [
'clientToServer',
'serverRelay',
'p2pHint'
] as const;
export type PluginEventDirection = typeof PLUGIN_EVENT_DIRECTIONS[number];
export const PLUGIN_EVENT_SCOPES = [
'server',
'channel',
'user',
'plugin'
] as const;
export type PluginEventScope = typeof PLUGIN_EVENT_SCOPES[number];
export const PLUGIN_CAPABILITIES = [
'profile.read',
'profile.write',
'users.read',
'users.manage',
'roles.read',
'roles.manage',
'messages.read',
'messages.send',
'messages.editOwn',
'messages.deleteOwn',
'messages.moderate',
'messages.sync',
'channels.read',
'channels.manage',
'server.read',
'server.manage',
'p2p.data',
'p2p.media',
'media.playAudio',
'media.addAudioStream',
'media.addVideoStream',
'audio.volume',
'audio.effects',
'ui.settings',
'ui.pages',
'ui.sidePanel',
'ui.channelsSection',
'ui.embeds',
'ui.dom',
'storage.local',
'storage.serverData.read',
'storage.serverData.write',
'events.server.publish',
'events.server.subscribe',
'events.p2p.publish',
'events.p2p.subscribe'
] as const;
export type PluginCapabilityId = typeof PLUGIN_CAPABILITIES[number];
export interface PluginRequirementSummary {
pluginId: string;
reason?: string;
status: PluginRequirementStatus;
updatedAt: number;
versionRange?: string;
}
export interface PluginEventDefinitionSummary {
direction: PluginEventDirection;
eventName: string;
maxPayloadBytes: number;
pluginId: string;
scope: PluginEventScope;
schemaJson?: string;
updatedAt: number;
}
export interface PluginRequirementsSnapshot {
eventDefinitions: PluginEventDefinitionSummary[];
requirements: PluginRequirementSummary[];
serverId: string;
updatedAt: number;
}
export interface PluginEventEnvelope<TPayload = unknown> {
emittedAt?: number;
eventId?: string;
eventName: string;
payload: TPayload;
pluginId: string;
serverId: string;
sourcePluginUserId?: string;
sourceUserId?: string;
type: 'plugin_event';
}
export interface PluginRequirementsMessage {
snapshot: PluginRequirementsSnapshot;
serverId: string;
type: 'plugin_requirements';
}
export interface PluginRequirementsChangedMessage {
snapshot: PluginRequirementsSnapshot;
serverId: string;
type: 'plugin_requirements_changed';
}
export interface PluginDataChangedMessage {
key: string;
ownerId?: string;
pluginId: string;
scope: string;
serverId: string;
type: 'plugin_data_changed';
updatedAt: number;
}
export interface PluginErrorMessage {
code: string;
eventId?: string;
eventName?: string;
message: string;
pluginId?: string;
serverId?: string;
type: 'plugin_error';
}
export interface TojuPluginManifest {
apiVersion: string;
authors?: {
email?: string;
name: string;
url?: string;
}[];
bugs?: string;
capabilities?: PluginCapabilityId[];
changelog?: string;
compatibility: {
maximumTojuVersion?: string;
minimumTojuVersion: string;
verifiedTojuVersion?: string;
};
data?: {
key: string;
schema?: string;
scope: string;
storage: 'local' | 'serverData';
}[];
description: string;
entrypoint?: string;
events?: {
direction: PluginEventDirection;
eventName: string;
maxPayloadBytes?: number;
schema?: string;
scope: PluginEventScope;
}[];
homepage?: string;
id: string;
kind: 'client' | 'library';
license?: string;
load?: {
priority?: 'bootstrap' | 'high' | 'default' | 'low';
};
pluginUser?: {
avatar?: string;
displayName: string;
label?: string;
};
readme?: string;
relationships?: {
after?: string[];
before?: string[];
conflicts?: string[];
optional?: { id: string; versionRange?: string }[];
requires?: { id: string; versionRange?: string }[];
};
schemaVersion: 1;
settings?: Record<string, unknown>;
title: string;
ui?: Record<string, unknown>;
version: string;
}