node-plume 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,918 @@
1
+ import * as _plume_types from '@plume/types';
2
+ import { SendTarget, MessageContent, Awaitable, SendMessageResult, EventPayload, Timestamp, MessagePayload, MessageId, UserInfo, UserId, GroupId, NoticePayload, NoticeSubtype, GroupInfo, RequestPayload, RequestSubtype, APIResponse, APIHandler, APIRequest, APIError, AdapterEvent, MessageSegment, TextSegment, ImageSegment, AudioSegment, VideoSegment, FileSegment, AtSegment, FaceSegment, ReplySegment, ForwardSegment, ForwardNode, LocationSegment, JsonSegment, XmlSegment, CustomSegment } from '@plume/types';
3
+ export { ErrorCode, EventPayload, MessagePayload, NoticePayload, RequestPayload } from '@plume/types';
4
+ import { LogLevel, Logger } from '@plume/logger';
5
+ import { ChildProcess } from 'node:child_process';
6
+
7
+ declare class ServiceContainer {
8
+ private readonly services;
9
+ private readonly factories;
10
+ register<T>(name: string, service: T): this;
11
+ registerFactory<T>(name: string, factory: () => T): this;
12
+ resolve<T>(name: string): T;
13
+ has(name: string): boolean;
14
+ delete(name: string): boolean;
15
+ clear(): void;
16
+ get<T>(name: string): T | undefined;
17
+ set<T>(name: string, service: T): this;
18
+ keys(): string[];
19
+ entries(): Array<[string, unknown]>;
20
+ size(): number;
21
+ }
22
+
23
+ interface SendMessageParams {
24
+ target: SendTarget;
25
+ content: MessageContent;
26
+ replyTo?: string;
27
+ }
28
+ interface MessageSender {
29
+ sendMessage(params: SendMessageParams): Awaitable<SendMessageResult>;
30
+ }
31
+ declare class MessageService {
32
+ private sender;
33
+ registerSender(sender: MessageSender): this;
34
+ clearSender(): this;
35
+ hasSender(): boolean;
36
+ sendMessage(params: SendMessageParams): Promise<SendMessageResult>;
37
+ }
38
+
39
+ interface InitConfigOptions {
40
+ path?: string;
41
+ }
42
+ interface InitConfigResult {
43
+ configDirectory: string;
44
+ createdConfigFiles: string[];
45
+ }
46
+ declare function initConfig(options?: InitConfigOptions): InitConfigResult;
47
+
48
+ interface PlumeDefaultConfig {
49
+ app: {
50
+ name: string;
51
+ version: string;
52
+ };
53
+ log: {
54
+ level: string;
55
+ timestamp: boolean;
56
+ };
57
+ transport: {
58
+ host: string;
59
+ port: number;
60
+ path: string;
61
+ wsPath: string;
62
+ cors: boolean;
63
+ enableHttp: boolean;
64
+ enableWebSocket: boolean;
65
+ maxBodySize: number;
66
+ };
67
+ }
68
+ declare const plumeDefaultConfig: Readonly<PlumeDefaultConfig>;
69
+
70
+ interface ConfigOptions {
71
+ path?: string;
72
+ watch?: boolean;
73
+ initialize?: boolean;
74
+ }
75
+ type ConfigSource = 'file' | 'env' | 'default';
76
+ interface ConfigEntry<T = unknown> {
77
+ value: T;
78
+ source: ConfigSource;
79
+ }
80
+ declare class ConfigService {
81
+ private config;
82
+ private path;
83
+ constructor(options?: ConfigOptions);
84
+ initialize(options?: InitConfigOptions): InitConfigResult;
85
+ loadDefaults(): this;
86
+ loadFile(path?: string): this;
87
+ loadDirectory(path?: string): this;
88
+ loadObject(data: Record<string, unknown>, source?: ConfigSource): this;
89
+ reload(): this;
90
+ get<T = unknown>(key: string, defaultValue?: T): T;
91
+ set<T>(key: string, value: T, source?: ConfigSource): this;
92
+ has(key: string): boolean;
93
+ delete(key: string): boolean;
94
+ getSource(key: string): ConfigSource | undefined;
95
+ getAll(): Record<string, unknown>;
96
+ entries(): Array<[string, ConfigEntry]>;
97
+ clear(): void;
98
+ }
99
+
100
+ interface DatabaseOptions {
101
+ type: 'sqlite' | 'memory';
102
+ path?: string;
103
+ timeout?: number;
104
+ }
105
+ interface QueryResult {
106
+ changes: number;
107
+ lastInsertRowid?: number | string;
108
+ }
109
+ interface DatabaseAdapter {
110
+ connect(): Awaitable<void>;
111
+ disconnect(): Awaitable<void>;
112
+ query<T = unknown>(sql: string, params?: unknown[]): Awaitable<T[]>;
113
+ execute(sql: string, params?: unknown[]): Awaitable<QueryResult>;
114
+ transaction<T>(fn: () => Awaitable<T>): Awaitable<T>;
115
+ isConnected(): boolean;
116
+ }
117
+ declare class DatabaseService {
118
+ private adapter;
119
+ private options;
120
+ constructor(options: DatabaseOptions);
121
+ connect(): Promise<void>;
122
+ disconnect(): Promise<void>;
123
+ private createAdapter;
124
+ query<T = unknown>(sql: string, params?: unknown[]): Promise<T[]>;
125
+ execute(sql: string, params?: unknown[]): Promise<QueryResult>;
126
+ transaction<T>(fn: () => Awaitable<T>): Promise<T>;
127
+ isConnected(): boolean;
128
+ private ensureConnected;
129
+ get<T = unknown>(table: string, id: string | number): Promise<T | undefined>;
130
+ find<T = unknown>(table: string, conditions: Record<string, unknown>): Promise<T[]>;
131
+ insert(table: string, data: Record<string, unknown>): Promise<QueryResult>;
132
+ update(table: string, id: string | number, data: Record<string, unknown>): Promise<QueryResult>;
133
+ delete(table: string, id: string | number): Promise<QueryResult>;
134
+ }
135
+
136
+ interface LogServiceOptions {
137
+ level?: LogLevel;
138
+ prefix?: string;
139
+ timestamp?: boolean;
140
+ outputs?: LogOutput[];
141
+ }
142
+ interface LogOutput {
143
+ type: 'console' | 'file' | 'custom';
144
+ handler?: (level: LogLevel, message: string, ...args: unknown[]) => void;
145
+ path?: string;
146
+ }
147
+ interface LogEntry {
148
+ level: LogLevel;
149
+ message: string;
150
+ timestamp: Date;
151
+ args: unknown[];
152
+ prefix?: string;
153
+ }
154
+ declare class LogService {
155
+ private logger;
156
+ private options;
157
+ private outputs;
158
+ private buffer;
159
+ private maxBufferSize;
160
+ private suspended;
161
+ private pending;
162
+ constructor(options?: LogServiceOptions);
163
+ get level(): LogLevel;
164
+ setLevel(level: LogLevel): void;
165
+ suspend(): this;
166
+ resume(): this;
167
+ debug(message: string, ...args: unknown[]): void;
168
+ info(message: string, ...args: unknown[]): void;
169
+ warn(message: string, ...args: unknown[]): void;
170
+ error(message: string, ...args: unknown[]): void;
171
+ private log;
172
+ private writeEntry;
173
+ private writeToOutput;
174
+ addOutput(output: LogOutput): this;
175
+ removeOutput(output: LogOutput): boolean;
176
+ child(prefix: string): LogService;
177
+ getBuffer(): LogEntry[];
178
+ clearBuffer(): void;
179
+ flush(): void;
180
+ }
181
+ declare const logService: LogService;
182
+
183
+ declare abstract class BaseEvent<T extends EventPayload = EventPayload> {
184
+ protected readonly payload: T;
185
+ abstract readonly type: T['type'];
186
+ readonly timestamp: Timestamp;
187
+ readonly raw: T['raw'];
188
+ constructor(payload: T);
189
+ get selfId(): string;
190
+ }
191
+
192
+ declare class MessageEvent extends BaseEvent<MessagePayload> {
193
+ readonly type: "message";
194
+ get messageId(): MessageId;
195
+ get content(): MessageContent;
196
+ get text(): string;
197
+ get sender(): UserInfo;
198
+ get target(): {
199
+ type: 'private' | 'group';
200
+ id: UserId | GroupId;
201
+ };
202
+ get isPrivate(): boolean;
203
+ get isGroup(): boolean;
204
+ get userId(): UserId;
205
+ get groupId(): GroupId | undefined;
206
+ }
207
+
208
+ declare class NoticeEvent extends BaseEvent<NoticePayload> {
209
+ readonly type: "notice";
210
+ get subtype(): NoticeSubtype;
211
+ get operator(): UserInfo | undefined;
212
+ get targetUser(): UserInfo | undefined;
213
+ get group(): GroupInfo | undefined;
214
+ get data(): Record<string, unknown> | undefined;
215
+ isGroupIncrease(): this is this & {
216
+ subtype: 'group_increase';
217
+ };
218
+ isGroupDecrease(): this is this & {
219
+ subtype: 'group_decrease';
220
+ };
221
+ isGroupAdmin(): this is this & {
222
+ subtype: 'group_admin';
223
+ };
224
+ isGroupUpload(): this is this & {
225
+ subtype: 'group_upload';
226
+ };
227
+ isFriendAdd(): this is this & {
228
+ subtype: 'friend_add';
229
+ };
230
+ isFriendRecall(): this is this & {
231
+ subtype: 'friend_recall';
232
+ };
233
+ isGroupRecall(): this is this & {
234
+ subtype: 'group_recall';
235
+ };
236
+ }
237
+
238
+ declare class RequestEvent extends BaseEvent<RequestPayload> {
239
+ readonly type: "request";
240
+ get subtype(): RequestSubtype;
241
+ get requestId(): string;
242
+ get sender(): UserInfo;
243
+ get group(): GroupInfo | undefined;
244
+ get comment(): string | undefined;
245
+ isFriendRequest(): this is this & {
246
+ subtype: 'friend';
247
+ };
248
+ isGroupInvite(): this is this & {
249
+ subtype: 'group_invite';
250
+ };
251
+ }
252
+
253
+ declare class Context {
254
+ readonly app: App;
255
+ readonly event: MessageEvent;
256
+ readonly state: Map<string, unknown>;
257
+ constructor(app: App, event: MessageEvent);
258
+ get messageId(): string;
259
+ get text(): string;
260
+ get content(): MessageContent;
261
+ get sender(): _plume_types.UserInfo;
262
+ get userId(): UserId;
263
+ get groupId(): GroupId | undefined;
264
+ get isPrivate(): boolean;
265
+ get isGroup(): boolean;
266
+ get target(): SendTarget;
267
+ get selfId(): string;
268
+ get timestamp(): number;
269
+ get raw(): unknown;
270
+ get services(): ServiceContainer;
271
+ setState<T>(key: string, value: T): this;
272
+ getState<T>(key: string): T | undefined;
273
+ reply(content: ReplyInput, options?: Omit<SendMessageOptions, 'replyTo'>): Promise<APIResponse<SendMessageResult>>;
274
+ }
275
+
276
+ type RouteHandler = APIHandler<unknown, unknown>;
277
+ declare class APIRouter {
278
+ private routes;
279
+ route(action: string, handler: RouteHandler): void;
280
+ match(action: string): RouteHandler | undefined;
281
+ has(action: string): boolean;
282
+ remove(action: string): boolean;
283
+ clear(): void;
284
+ getActions(): string[];
285
+ }
286
+
287
+ interface APIClientOptions {
288
+ timeout?: number;
289
+ baseUrl?: string;
290
+ token?: string;
291
+ }
292
+ declare class APIClient {
293
+ private router;
294
+ private options;
295
+ constructor(options?: APIClientOptions);
296
+ call<T = unknown>(request: APIRequest): Promise<APIResponse<T>>;
297
+ on<T = unknown, R = unknown>(action: string, handler: APIHandler<T, R>): this;
298
+ register(handlers: Record<string, APIHandler>): this;
299
+ getRouter(): APIRouter;
300
+ getActions(): string[];
301
+ getActionCount(): number;
302
+ private createErrorResponse;
303
+ private createTimeoutPromise;
304
+ }
305
+
306
+ declare class APIErrorClass extends Error {
307
+ readonly code: number;
308
+ readonly details?: Record<string, unknown>;
309
+ constructor(code: number, message: string, details?: Record<string, unknown>);
310
+ toAPIError(): APIError;
311
+ static fromCode(code: number, message?: string, details?: Record<string, unknown>): APIErrorClass;
312
+ }
313
+ declare function createSuccessResponse<T>(data: T, startTime: number): APIResponse<T>;
314
+ declare function createErrorResponse(code: number, message: string, startTime: number, details?: Record<string, unknown>): APIResponse;
315
+ declare function isAPIError(error: unknown): error is APIErrorClass;
316
+
317
+ interface MiddlewareContext$1 {
318
+ request: APIRequest;
319
+ response?: APIResponse;
320
+ next: () => Promise<APIResponse>;
321
+ }
322
+ type Middleware$1 = (ctx: MiddlewareContext$1) => Awaitable<APIResponse | void>;
323
+ declare class MiddlewareChain {
324
+ private middlewares;
325
+ use(middleware: Middleware$1): this;
326
+ execute(request: APIRequest, handler: () => Promise<APIResponse>): Promise<APIResponse>;
327
+ clear(): void;
328
+ }
329
+
330
+ interface TokenPayload {
331
+ iss?: string;
332
+ sub?: string;
333
+ aud?: string;
334
+ exp?: number;
335
+ iat?: number;
336
+ jti?: string;
337
+ [key: string]: unknown;
338
+ }
339
+ interface AuthConfig {
340
+ secret: string;
341
+ expiresIn?: number;
342
+ issuer?: string;
343
+ audience?: string;
344
+ }
345
+ interface AuthProvider {
346
+ verify(token: string): Awaitable<TokenPayload | null>;
347
+ sign(payload: TokenPayload): Awaitable<string>;
348
+ }
349
+ declare class TokenAuth implements AuthProvider {
350
+ private config;
351
+ constructor(config: AuthConfig);
352
+ verify(token: string): Promise<TokenPayload | null>;
353
+ sign(payload: TokenPayload): Promise<string>;
354
+ private createSignature;
355
+ }
356
+ declare function extractToken(request: APIRequest): string | null;
357
+ declare function createAuthMiddleware(authProvider: AuthProvider): (ctx: {
358
+ request: APIRequest;
359
+ next: () => Promise<APIResponse>;
360
+ }) => Promise<APIResponse | void>;
361
+
362
+ interface APITransportOptions {
363
+ host?: string;
364
+ port?: number;
365
+ path?: string;
366
+ wsPath?: string;
367
+ cors?: boolean;
368
+ enableHttp?: boolean;
369
+ enableWebSocket?: boolean;
370
+ maxBodySize?: number;
371
+ authProvider?: AuthProvider;
372
+ middlewares?: Middleware$1[];
373
+ }
374
+ interface APITransportAddress {
375
+ host: string;
376
+ port: number;
377
+ httpUrl?: string;
378
+ wsUrl?: string;
379
+ }
380
+ declare class APITransportServer {
381
+ private readonly apiClient;
382
+ private readonly logger?;
383
+ private readonly middlewareChain;
384
+ private readonly clients;
385
+ private readonly connections;
386
+ private readonly options;
387
+ private server;
388
+ private address;
389
+ constructor(apiClient: APIClient, options?: APITransportOptions, logger?: LogService);
390
+ start(): Promise<APITransportAddress>;
391
+ stop(): Promise<void>;
392
+ isRunning(): boolean;
393
+ isEnabled(): boolean;
394
+ getAddress(): APITransportAddress | null;
395
+ getConnectedClientCount(): number;
396
+ private handleHTTPRequest;
397
+ private handleUpgrade;
398
+ private handleWebSocketData;
399
+ private handleWebSocketMessage;
400
+ private executeRequest;
401
+ private normalizeRequest;
402
+ private readRequestBody;
403
+ private applyCORSHeaders;
404
+ private extractBearerToken;
405
+ private writeJSON;
406
+ private createWebSocketAccept;
407
+ private sendWebSocketJSON;
408
+ private sendWebSocketFrame;
409
+ private tryParseFrame;
410
+ }
411
+
412
+ interface DispatchEventParams {
413
+ event: AdapterEvent | EventPayload;
414
+ }
415
+ interface DispatchEventResult {
416
+ type: EventPayload['type'];
417
+ timestamp: number;
418
+ selfId: string;
419
+ }
420
+ type EventLogDirection = 'in' | 'out';
421
+ interface EventLogOptions {
422
+ direction?: EventLogDirection;
423
+ adapter?: string;
424
+ botId?: string;
425
+ }
426
+ interface MessageLogInput {
427
+ target: SendTarget;
428
+ content: MessageContent;
429
+ replyTo?: string;
430
+ }
431
+ interface BotOptions {
432
+ id: string;
433
+ adapter: string;
434
+ logger?: LogService;
435
+ loggerPrefix?: string;
436
+ }
437
+ declare class Bot {
438
+ readonly app: App;
439
+ readonly logger: LogService;
440
+ readonly id: string;
441
+ readonly adapter: string;
442
+ constructor(app: App, options: BotOptions);
443
+ dispatchEvent(event: AdapterEvent | EventPayload): Promise<APIResponse<DispatchEventResult>>;
444
+ sendMessage(target: SendTarget, content: MessageContent, options?: SendMessageOptions): Promise<APIResponse<SendMessageResult>>;
445
+ }
446
+ declare function normalizeEventPayload(event: AdapterEvent | EventPayload): EventPayload;
447
+ declare function buildEventLog(event: AdapterEvent | EventPayload, _options?: EventLogOptions): string;
448
+ declare function buildSendMessageLog(input: MessageLogInput, _options?: EventLogOptions): string;
449
+
450
+ interface FrameworkInfo {
451
+ name: string;
452
+ running: boolean;
453
+ uptime: number;
454
+ startedAt: number;
455
+ pluginCount: number;
456
+ serviceCount: number;
457
+ actionCount: number;
458
+ }
459
+ interface FrameworkPluginInfo {
460
+ name: string;
461
+ version?: string;
462
+ priority: number;
463
+ }
464
+ interface FrameworkServiceInfo {
465
+ name: string;
466
+ kind: string;
467
+ }
468
+ interface StandardActionMap {
469
+ get_framework_info: APIHandler;
470
+ get_plugin_list: APIHandler;
471
+ get_service_list: APIHandler;
472
+ get_action_list: APIHandler;
473
+ get_runtime_snapshot: APIHandler;
474
+ dispatch_event: APIHandler<DispatchEventParams, DispatchEventResult>;
475
+ send_message: APIHandler<SendMessageParams, SendMessageResult>;
476
+ }
477
+ declare const STANDARD_ACTION_NAMES: readonly ["get_framework_info", "get_plugin_list", "get_service_list", "get_action_list", "get_runtime_snapshot", "dispatch_event", "send_message"];
478
+ declare function createStandardActions(app: App, apiClient: APIClient, startedAt: number): StandardActionMap;
479
+ declare function registerStandardActions(app: App, apiClient: APIClient, startedAt: number): string[];
480
+
481
+ type EventHandler<T = unknown> = (data: T) => Awaitable<void>;
482
+ interface EventMapBase {
483
+ [key: string]: unknown;
484
+ }
485
+ declare class EventEmitter<EventMap extends EventMapBase> {
486
+ private readonly handlers;
487
+ on<K extends keyof EventMap>(event: K, handler: EventHandler<EventMap[K]>): this;
488
+ once<K extends keyof EventMap>(event: K, handler: EventHandler<EventMap[K]>): this;
489
+ off<K extends keyof EventMap>(event: K, handler: EventHandler<EventMap[K]>): this;
490
+ emit<K extends keyof EventMap>(event: K, data: EventMap[K]): Promise<void>;
491
+ listenerCount<K extends keyof EventMap>(event: K): number;
492
+ removeAllListeners<K extends keyof EventMap>(event?: K): this;
493
+ }
494
+
495
+ type LifecycleHookName = 'beforeStart' | 'afterStart' | 'beforeStop' | 'afterStop' | 'beforePluginSetup' | 'afterPluginSetup' | 'beforePluginDispose' | 'afterPluginDispose';
496
+ type LifecycleHookHandler = (app: App) => Awaitable<void>;
497
+ declare class LifecycleHookManager {
498
+ private hooks;
499
+ on(name: LifecycleHookName, handler: LifecycleHookHandler): this;
500
+ off(name: LifecycleHookName, handler: LifecycleHookHandler): boolean;
501
+ emit(name: LifecycleHookName, app: App): Promise<void>;
502
+ has(name: LifecycleHookName): boolean;
503
+ count(name: LifecycleHookName): number;
504
+ clear(name?: LifecycleHookName): void;
505
+ }
506
+
507
+ type EventHookName = 'beforeMessage' | 'afterMessage' | 'beforeNotice' | 'afterNotice' | 'beforeRequest' | 'afterRequest' | 'messageReceived' | 'noticeReceived' | 'requestReceived';
508
+ type EventHookHandler<T = unknown> = (data: T) => Awaitable<boolean | void>;
509
+ interface MessageHookContext {
510
+ ctx: Context;
511
+ event: MessageEvent;
512
+ }
513
+ interface NoticeHookContext {
514
+ event: NoticeEvent;
515
+ }
516
+ interface RequestHookContext {
517
+ event: RequestEvent;
518
+ }
519
+ declare class EventHooks {
520
+ private messageHooks;
521
+ private noticeHooks;
522
+ private requestHooks;
523
+ onMessage(name: 'beforeMessage' | 'afterMessage' | 'messageReceived', handler: EventHookHandler<MessageHookContext>): this;
524
+ onNotice(name: 'beforeNotice' | 'afterNotice' | 'noticeReceived', handler: EventHookHandler<NoticeHookContext>): this;
525
+ onRequest(name: 'beforeRequest' | 'afterRequest' | 'requestReceived', handler: EventHookHandler<RequestHookContext>): this;
526
+ offMessage(name: 'beforeMessage' | 'afterMessage' | 'messageReceived', handler: EventHookHandler<MessageHookContext>): boolean;
527
+ offNotice(name: 'beforeNotice' | 'afterNotice' | 'noticeReceived', handler: EventHookHandler<NoticeHookContext>): boolean;
528
+ offRequest(name: 'beforeRequest' | 'afterRequest' | 'requestReceived', handler: EventHookHandler<RequestHookContext>): boolean;
529
+ emitMessage(name: 'beforeMessage' | 'afterMessage' | 'messageReceived', data: MessageHookContext): Promise<boolean>;
530
+ emitNotice(name: 'beforeNotice' | 'afterNotice' | 'noticeReceived', data: NoticeHookContext): Promise<boolean>;
531
+ emitRequest(name: 'beforeRequest' | 'afterRequest' | 'requestReceived', data: RequestHookContext): Promise<boolean>;
532
+ clear(): void;
533
+ }
534
+
535
+ type ErrorHookName = 'onError' | 'onPluginError' | 'onMiddlewareError' | 'onHookError' | 'onUnhandledRejection' | 'onUncaughtException';
536
+ type ErrorHookHandler = (error: Error, context?: Record<string, unknown>) => Awaitable<boolean | void>;
537
+ declare class ErrorHooks {
538
+ private hooks;
539
+ private app;
540
+ private readonly handleUnhandledRejection;
541
+ private readonly handleUncaughtException;
542
+ private globalHandlersAttached;
543
+ constructor(app: App);
544
+ on(name: ErrorHookName, handler: ErrorHookHandler): this;
545
+ off(name: ErrorHookName, handler: ErrorHookHandler): boolean;
546
+ emit(name: ErrorHookName, error: Error, context?: Record<string, unknown>): Promise<boolean>;
547
+ private setupGlobalHandlers;
548
+ has(name: ErrorHookName): boolean;
549
+ count(name: ErrorHookName): number;
550
+ clear(name?: ErrorHookName): void;
551
+ destroy(): void;
552
+ }
553
+
554
+ interface Plugin {
555
+ readonly name: string;
556
+ readonly version?: string;
557
+ readonly priority?: number;
558
+ setup(app: App): Awaitable<void>;
559
+ dispose?(app: App): Awaitable<void>;
560
+ onMessage?(ctx: Context): Awaitable<boolean | void>;
561
+ onNotice?(event: NoticeEvent): Awaitable<void>;
562
+ onRequest?(event: RequestEvent): Awaitable<void>;
563
+ }
564
+ interface PluginHooks {
565
+ lifecycle?: Partial<Record<LifecycleHookName, (app: App) => Awaitable<void>>>;
566
+ events?: {
567
+ beforeMessage?: (ctx: Context, event: MessageEvent) => Awaitable<boolean | void>;
568
+ afterMessage?: (ctx: Context, event: MessageEvent) => Awaitable<void>;
569
+ beforeNotice?: (event: NoticeEvent) => Awaitable<boolean | void>;
570
+ afterNotice?: (event: NoticeEvent) => Awaitable<void>;
571
+ beforeRequest?: (event: RequestEvent) => Awaitable<boolean | void>;
572
+ afterRequest?: (event: RequestEvent) => Awaitable<void>;
573
+ };
574
+ errors?: Partial<Record<ErrorHookName, (error: Error) => Awaitable<boolean | void>>>;
575
+ }
576
+ type PluginSetup = (app: App) => Awaitable<void>;
577
+ type PluginDispose = (app: App) => Awaitable<void>;
578
+ interface DefinePluginOptions {
579
+ name: string;
580
+ version?: string;
581
+ priority?: number;
582
+ setup: PluginSetup;
583
+ dispose?: PluginDispose;
584
+ }
585
+ declare abstract class BasePlugin implements Plugin {
586
+ abstract readonly name: string;
587
+ readonly version?: string;
588
+ readonly priority: number;
589
+ readonly hooks?: PluginHooks;
590
+ abstract setup(app: App): Awaitable<void>;
591
+ dispose?(app: App): Awaitable<void>;
592
+ onMessage?(ctx: Context): Awaitable<boolean | void>;
593
+ onNotice?(event: NoticeEvent): Awaitable<void>;
594
+ onRequest?(event: RequestEvent): Awaitable<void>;
595
+ }
596
+ declare function definePlugin(options: DefinePluginOptions): Plugin;
597
+
598
+ interface PluginManagerOptions {
599
+ autoDispose?: boolean;
600
+ }
601
+ declare class PluginManager {
602
+ private plugins;
603
+ private app;
604
+ private options;
605
+ constructor(app: App, options?: PluginManagerOptions);
606
+ getAutoDispose(): boolean;
607
+ register(plugin: Plugin): this;
608
+ unregister(name: string): this;
609
+ get(name: string): Plugin | undefined;
610
+ has(name: string): boolean;
611
+ setupAll(): Promise<void>;
612
+ disposeAll(): Promise<void>;
613
+ private getSortedPlugins;
614
+ list(): Plugin[];
615
+ clear(): void;
616
+ }
617
+
618
+ type MiddlewareNext = () => Awaitable<void>;
619
+ interface MiddlewareContext {
620
+ type: 'message' | 'notice' | 'request';
621
+ payload: MessagePayload | NoticePayload | RequestPayload;
622
+ event?: MessageEvent | NoticeEvent | RequestEvent;
623
+ ctx?: Context;
624
+ }
625
+ type Middleware = (ctx: MiddlewareContext, next: MiddlewareNext) => Awaitable<void>;
626
+ declare class MiddlewareManager {
627
+ private middlewares;
628
+ use(middleware: Middleware): this;
629
+ remove(middleware: Middleware): boolean;
630
+ execute(ctx: MiddlewareContext): Promise<void>;
631
+ clear(): void;
632
+ get count(): number;
633
+ }
634
+ declare function compose(middlewares: Middleware[]): Middleware;
635
+
636
+ declare function text(value: string): TextSegment;
637
+ declare function image(source: string | ImageSegment['data']): ImageSegment;
638
+ declare function audio(source: string | AudioSegment['data']): AudioSegment;
639
+ declare function video(source: string | VideoSegment['data']): VideoSegment;
640
+ declare function file(source: string | FileSegment['data'], name?: string): FileSegment;
641
+ declare function at(userId: string, name?: string): AtSegment;
642
+ declare function face(id: number, name?: string): FaceSegment;
643
+ declare function reply(messageId: string): ReplySegment;
644
+ declare function forward(id: string): ForwardSegment;
645
+ declare function forward(messages: ForwardNode[]): ForwardSegment;
646
+ declare function forward(data: ForwardSegment['data']): ForwardSegment;
647
+ declare function location(latitude: number, longitude: number, title?: string, content?: string): LocationSegment;
648
+ declare function location(data: LocationSegment['data']): LocationSegment;
649
+ declare function json(data: string | Record<string, unknown>): JsonSegment;
650
+ declare function xml(data: string): XmlSegment;
651
+ declare function custom(data: Record<string, unknown>): CustomSegment;
652
+ declare function custom(type: string, data: Record<string, unknown>): MessageSegment;
653
+ declare const segment: {
654
+ text: typeof text;
655
+ image: typeof image;
656
+ audio: typeof audio;
657
+ video: typeof video;
658
+ file: typeof file;
659
+ at: typeof at;
660
+ face: typeof face;
661
+ reply: typeof reply;
662
+ forward: typeof forward;
663
+ location: typeof location;
664
+ json: typeof json;
665
+ xml: typeof xml;
666
+ custom: typeof custom;
667
+ };
668
+ declare function normalizeMessageContent(content: MessageContent): MessageContent;
669
+ declare function normalizeMessageSegment(segment: MessageSegment): MessageSegment;
670
+ declare function extractMessageText(content: MessageContent): string;
671
+ declare function formatMessageContent(content: MessageContent): string;
672
+ declare function renderMessageSegment(segment: MessageSegment): string;
673
+ declare function formatMessageSegment(segment: MessageSegment): string;
674
+
675
+ interface AppConfig {
676
+ name?: string;
677
+ logger?: {
678
+ level?: LogLevel;
679
+ prefix?: string;
680
+ };
681
+ }
682
+ interface SendMessageOptions {
683
+ replyTo?: string;
684
+ at?: boolean;
685
+ reply?: boolean;
686
+ recallMsg?: number;
687
+ retryCount?: number;
688
+ }
689
+ type ReplyInput = MessageContent | MessageSegment | Array<string | MessageSegment>;
690
+ interface FunctionalCommandOptions {
691
+ name?: string;
692
+ log?: boolean;
693
+ event?: 'message';
694
+ perm?: string;
695
+ at?: boolean;
696
+ reply?: boolean;
697
+ recallMsg?: number;
698
+ retryCount?: number;
699
+ rank?: number;
700
+ adapter?: string[];
701
+ dsbAdapter?: string[];
702
+ delay?: number;
703
+ stop?: boolean;
704
+ authFailMsg?: string;
705
+ }
706
+ interface CommandOptions {
707
+ aliases?: string[];
708
+ prefix?: string | string[];
709
+ caseSensitive?: boolean;
710
+ }
711
+ interface CommandContext {
712
+ app: App;
713
+ command: string;
714
+ args: string[];
715
+ rawArgs: string;
716
+ event: MessageEvent;
717
+ text: string;
718
+ sender: MessageEvent['sender'];
719
+ userId: MessageEvent['userId'];
720
+ groupId: MessageEvent['groupId'];
721
+ isPrivate: boolean;
722
+ isGroup: boolean;
723
+ reply: (content: MessageContent) => Promise<APIResponse<SendMessageResult>>;
724
+ }
725
+ type CommandHandler = (command: CommandContext) => Awaitable<unknown>;
726
+ interface CommandDefinition extends CommandOptions {
727
+ handler: CommandHandler;
728
+ }
729
+ type AppCommandMap = Record<string, CommandHandler | CommandDefinition>;
730
+ type AppModuleSetup = (app: App, logger: LogService) => Awaitable<void>;
731
+ type FunctionalCommandNext = () => void;
732
+ type FunctionalCommandContext = Context & {
733
+ logger: LogService;
734
+ match: RegExpMatchArray;
735
+ };
736
+ type PlumeEvent = FunctionalCommandContext;
737
+ type PlumeNext = FunctionalCommandNext;
738
+ type FunctionalCommandHandler = (e: FunctionalCommandContext, next: FunctionalCommandNext) => Awaitable<unknown>;
739
+ type FunctionalCommandReply = FunctionalCommandHandler | ReplyInput;
740
+ interface DefineAppOptions {
741
+ log?: boolean;
742
+ commands?: AppCommandMap;
743
+ }
744
+ interface AppModuleDefinition {
745
+ __plumeAppModule?: true;
746
+ name?: string;
747
+ log?: boolean;
748
+ setup?: AppModuleSetup;
749
+ commands?: AppCommandMap;
750
+ }
751
+ declare function defineApp(definition: Omit<AppModuleDefinition, '__plumeAppModule'>): AppModuleDefinition;
752
+ declare function defineApp(name: string, setup: AppModuleSetup, options?: DefineAppOptions): AppModuleDefinition;
753
+ declare function command(pattern: string | RegExp, handler: FunctionalCommandReply, options?: FunctionalCommandOptions): AppModuleDefinition;
754
+ declare const Plume: {
755
+ command: typeof command;
756
+ };
757
+ interface AppEventMap {
758
+ [key: string]: unknown;
759
+ 'ready': void;
760
+ 'message': {
761
+ ctx: Context;
762
+ event: MessageEvent;
763
+ };
764
+ 'notice': {
765
+ event: NoticeEvent;
766
+ };
767
+ 'request': {
768
+ event: RequestEvent;
769
+ };
770
+ 'error': {
771
+ error: unknown;
772
+ };
773
+ 'stop': void;
774
+ }
775
+ declare class App {
776
+ readonly services: ServiceContainer;
777
+ readonly events: EventEmitter<AppEventMap>;
778
+ readonly logger: Logger;
779
+ readonly name: string;
780
+ private running;
781
+ private readonly plugins;
782
+ constructor(config?: AppConfig);
783
+ use(plugin: Plugin): this;
784
+ plugin(plugin: Plugin): this;
785
+ registerService<T>(name: string, service: T): this;
786
+ on<K extends keyof AppEventMap>(event: K, handler: (data: AppEventMap[K]) => Awaitable<void>): this;
787
+ ready(handler: (data: AppEventMap['ready']) => Awaitable<void>): this;
788
+ message(handler: (data: AppEventMap['message']) => Awaitable<void>): this;
789
+ command(name: string, handler: CommandHandler, options?: CommandOptions): this;
790
+ commands(commandMap: AppCommandMap): this;
791
+ notice(handler: (data: AppEventMap['notice']) => Awaitable<void>): this;
792
+ request(handler: (data: AppEventMap['request']) => Awaitable<void>): this;
793
+ error(handler: (data: AppEventMap['error']) => Awaitable<void>): this;
794
+ stopped(handler: (data: AppEventMap['stop']) => Awaitable<void>): this;
795
+ once<K extends keyof AppEventMap>(event: K, handler: (data: AppEventMap[K]) => Awaitable<void>): this;
796
+ off<K extends keyof AppEventMap>(event: K, handler: (data: AppEventMap[K]) => Awaitable<void>): this;
797
+ start(): Promise<void>;
798
+ stop(): Promise<void>;
799
+ isRunning(): boolean;
800
+ get api(): APIClient;
801
+ get transport(): APITransportServer | undefined;
802
+ setMessageSender(sender: MessageSender): this;
803
+ getMessageService(): MessageService | undefined;
804
+ action<T = unknown, R = unknown>(name: string, handler: APIHandler<T, R>): this;
805
+ actions(handlers: Record<string, APIHandler>): this;
806
+ service<T>(name: string): T;
807
+ getService<T>(name: string): T | undefined;
808
+ listPlugins(): Plugin[];
809
+ pluginCount(): number;
810
+ call<T = unknown>(request: APIRequest): Promise<APIResponse<T>>;
811
+ sendMessage(target: SendTarget, content: MessageContent, options?: SendMessageOptions): Promise<APIResponse<SendMessageResult>>;
812
+ dispatch(payload: EventPayload): Promise<void>;
813
+ private handleError;
814
+ private getPluginsInOrder;
815
+ }
816
+
817
+ interface ConsoleAdapterOptions {
818
+ selfId?: string;
819
+ adapter?: string;
820
+ userId?: string;
821
+ nickname?: string;
822
+ targetType?: 'private' | 'group';
823
+ groupId?: string;
824
+ loggerPrefix?: string;
825
+ }
826
+ declare function createConsoleAdapter(options?: ConsoleAdapterOptions): Plugin;
827
+
828
+ interface LauncherOptions {
829
+ entry?: string;
830
+ cwd?: string;
831
+ watch?: boolean;
832
+ env?: Record<string, string>;
833
+ }
834
+ interface LauncherStats {
835
+ startTime: number;
836
+ restartCount: number;
837
+ lastRestartTime: number;
838
+ }
839
+ type LauncherState = 'idle' | 'starting' | 'running' | 'stopping' | 'stopped';
840
+ type LauncherEvent = 'start' | 'restart' | 'stop' | 'exit' | 'error';
841
+ interface LauncherEventHandler {
842
+ (event: LauncherEvent, data?: unknown): void;
843
+ }
844
+ declare class ProcessLauncher {
845
+ private process;
846
+ private state;
847
+ private stats;
848
+ private eventHandlers;
849
+ private options;
850
+ private shutdownPromise;
851
+ private resolveShutdown;
852
+ private static readonly DEFAULT_OPTIONS;
853
+ constructor(options?: LauncherOptions);
854
+ private setupSignalHandlers;
855
+ start(): Promise<ChildProcess>;
856
+ restart(): Promise<ChildProcess | null>;
857
+ stop(): Promise<void>;
858
+ kill(): void;
859
+ getState(): LauncherState;
860
+ getStats(): LauncherStats;
861
+ getUptime(): number;
862
+ on(event: LauncherEvent, handler: LauncherEventHandler): this;
863
+ off(event: LauncherEvent, handler: LauncherEventHandler): this;
864
+ private emit;
865
+ private setupProcessEventHandlers;
866
+ private handleProcessExit;
867
+ private handleProcessError;
868
+ private handleProcessMessage;
869
+ private resolveEntry;
870
+ }
871
+ declare function launch(options?: LauncherOptions): Promise<ProcessLauncher>;
872
+
873
+ declare global {
874
+ var logger: LogService;
875
+ }
876
+
877
+ interface StartOptions extends AppConfig {
878
+ app?: App;
879
+ plugins?: Plugin[];
880
+ services?: Record<string, unknown>;
881
+ config?: ConfigOptions;
882
+ transport?: APITransportOptions | false;
883
+ setup?: (app: App) => Awaitable<void>;
884
+ onStarted?: (app: App) => Awaitable<void>;
885
+ }
886
+ type AppSetup = (app: App) => Awaitable<void>;
887
+ interface FrameworkServices {
888
+ logger: LogService;
889
+ lifecycleHooks: LifecycleHookManager;
890
+ errorHooks: ErrorHooks;
891
+ apiClient: APIClient;
892
+ builtInActions: string[];
893
+ transportServer: APITransportServer;
894
+ config: ConfigService;
895
+ }
896
+ interface StandardInterfaceDescriptor {
897
+ requestFormat: 'APIRequest';
898
+ responseFormat: 'APIResponse';
899
+ authProvider: 'TokenAuth';
900
+ middleware: 'MiddlewareChain';
901
+ actions: string[];
902
+ }
903
+ interface PlumePackageManifest {
904
+ entry?: string;
905
+ appDirs?: string[];
906
+ sourceAppDirs?: string[];
907
+ assetDirs?: string[];
908
+ include?: string[];
909
+ }
910
+ declare const logger: LogService;
911
+ declare function createApp(config?: AppConfig): App;
912
+ declare function getCurrentApp(): App | null;
913
+ declare function getFrameworkServices(app: App): FrameworkServices;
914
+ declare function start(setup: AppSetup): Promise<App>;
915
+ declare function start(options?: StartOptions): Promise<App>;
916
+ declare function stop(app?: App | null): Promise<void>;
917
+
918
+ export { APIClient, type APIClientOptions, APIErrorClass as APIError, APIRouter, type APITransportAddress, type APITransportOptions, APITransportServer, App, type AppCommandMap, type AppConfig, type AppModuleDefinition, type AppModuleSetup, type AppSetup, type AuthConfig, type AuthProvider, BaseEvent, BasePlugin, Bot, type BotOptions, type CommandContext, type CommandDefinition, type CommandHandler, type CommandOptions, type ConfigEntry, type ConfigOptions, ConfigService, type ConfigSource, type ConsoleAdapterOptions, Context, type DatabaseAdapter, type DatabaseOptions, DatabaseService, type DefineAppOptions, type DefinePluginOptions, type DispatchEventParams, type DispatchEventResult, type ErrorHookName, ErrorHooks, EventEmitter, type EventHookName, EventHooks, type EventLogDirection, type EventLogOptions, type FrameworkInfo, type FrameworkPluginInfo, type FrameworkServiceInfo, type FrameworkServices, type FunctionalCommandContext, type FunctionalCommandHandler, type FunctionalCommandNext, type FunctionalCommandOptions, type FunctionalCommandReply, type InitConfigOptions, type InitConfigResult, type LauncherEvent, type LauncherEventHandler, type LauncherOptions, type LauncherState, type LauncherStats, type LifecycleHookHandler, LifecycleHookManager, type LifecycleHookName, type LogEntry, type LogOutput, LogService, type LogServiceOptions, MessageEvent, type MessageLogInput, type MessageSender, MessageService, type Middleware, MiddlewareChain, type MiddlewareContext, MiddlewareManager, type MiddlewareNext, NoticeEvent, type Plugin, type PluginDispose, type PluginHooks, PluginManager, type PluginManagerOptions, type PluginSetup, Plume, type PlumeDefaultConfig, type PlumeEvent, type PlumeNext, type PlumePackageManifest, ProcessLauncher, type QueryResult, type ReplyInput, RequestEvent, STANDARD_ACTION_NAMES, type SendMessageParams, ServiceContainer, type StandardActionMap, type StandardInterfaceDescriptor, type StartOptions, TokenAuth, type TokenPayload, buildEventLog, buildSendMessageLog, command, compose, createApp, createAuthMiddleware, createConsoleAdapter, createErrorResponse, createStandardActions, createSuccessResponse, defineApp, definePlugin, extractMessageText, extractToken, formatMessageContent, formatMessageSegment, getCurrentApp, getFrameworkServices, initConfig, isAPIError, launch, logService, logger, normalizeEventPayload, normalizeMessageContent, normalizeMessageSegment, plumeDefaultConfig, registerStandardActions, renderMessageSegment, segment, start, stop };