@zhin.js/core 1.0.17 → 1.0.19

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.
Files changed (112) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/REFACTORING_COMPLETE.md +178 -0
  3. package/REFACTORING_STATUS.md +263 -0
  4. package/lib/adapter.d.ts +44 -19
  5. package/lib/adapter.d.ts.map +1 -1
  6. package/lib/adapter.js +81 -50
  7. package/lib/adapter.js.map +1 -1
  8. package/lib/bot.d.ts +7 -12
  9. package/lib/bot.d.ts.map +1 -1
  10. package/lib/built/adapter-process.d.ts +36 -0
  11. package/lib/built/adapter-process.d.ts.map +1 -0
  12. package/lib/built/adapter-process.js +77 -0
  13. package/lib/built/adapter-process.js.map +1 -0
  14. package/lib/built/command.d.ts +46 -0
  15. package/lib/built/command.d.ts.map +1 -0
  16. package/lib/built/command.js +54 -0
  17. package/lib/built/command.js.map +1 -0
  18. package/lib/built/component.d.ts +42 -0
  19. package/lib/built/component.d.ts.map +1 -0
  20. package/lib/built/component.js +66 -0
  21. package/lib/built/component.js.map +1 -0
  22. package/lib/built/config.d.ts +31 -0
  23. package/lib/built/config.d.ts.map +1 -0
  24. package/lib/built/config.js +141 -0
  25. package/lib/built/config.js.map +1 -0
  26. package/lib/built/cron.d.ts +53 -0
  27. package/lib/built/cron.d.ts.map +1 -0
  28. package/lib/built/cron.js +79 -0
  29. package/lib/built/cron.js.map +1 -0
  30. package/lib/built/database.d.ts +17 -0
  31. package/lib/built/database.d.ts.map +1 -0
  32. package/lib/built/database.js +28 -0
  33. package/lib/built/database.js.map +1 -0
  34. package/lib/{permissions.d.ts → built/permission.d.ts} +5 -10
  35. package/lib/built/permission.d.ts.map +1 -0
  36. package/lib/{permissions.js → built/permission.js} +11 -10
  37. package/lib/built/permission.js.map +1 -0
  38. package/lib/command.d.ts +7 -7
  39. package/lib/command.d.ts.map +1 -1
  40. package/lib/command.js +5 -15
  41. package/lib/command.js.map +1 -1
  42. package/lib/component.d.ts.map +1 -1
  43. package/lib/component.js.map +1 -1
  44. package/lib/cron.d.ts +1 -0
  45. package/lib/cron.d.ts.map +1 -1
  46. package/lib/cron.js +2 -0
  47. package/lib/cron.js.map +1 -1
  48. package/lib/index.d.ts +11 -3
  49. package/lib/index.d.ts.map +1 -1
  50. package/lib/index.js +14 -4
  51. package/lib/index.js.map +1 -1
  52. package/lib/jsx-runtime.d.ts +2 -2
  53. package/lib/message.d.ts +2 -2
  54. package/lib/message.d.ts.map +1 -1
  55. package/lib/plugin.d.ts +164 -51
  56. package/lib/plugin.d.ts.map +1 -1
  57. package/lib/plugin.js +521 -150
  58. package/lib/plugin.js.map +1 -1
  59. package/lib/prompt.d.ts +1 -1
  60. package/lib/prompt.d.ts.map +1 -1
  61. package/lib/prompt.js +2 -1
  62. package/lib/prompt.js.map +1 -1
  63. package/lib/types.d.ts +33 -33
  64. package/lib/types.d.ts.map +1 -1
  65. package/lib/utils.d.ts +16 -1
  66. package/lib/utils.d.ts.map +1 -1
  67. package/lib/utils.js +166 -66
  68. package/lib/utils.js.map +1 -1
  69. package/package.json +19 -9
  70. package/src/adapter.ts +131 -80
  71. package/src/bot.ts +8 -13
  72. package/src/built/adapter-process.ts +77 -0
  73. package/src/built/command.ts +102 -0
  74. package/src/built/component.ts +111 -0
  75. package/src/built/config.ts +126 -0
  76. package/src/built/cron.ts +140 -0
  77. package/src/built/database.ts +38 -0
  78. package/src/{permissions.ts → built/permission.ts} +9 -12
  79. package/src/command.ts +11 -20
  80. package/src/component.ts +0 -1
  81. package/src/cron.ts +2 -0
  82. package/src/index.ts +15 -5
  83. package/src/message.ts +2 -2
  84. package/src/plugin.ts +671 -202
  85. package/src/prompt.ts +4 -3
  86. package/src/types.ts +41 -35
  87. package/src/utils.ts +418 -296
  88. package/test/minimal-bot.ts +31 -0
  89. package/test/stress-test.ts +123 -0
  90. package/tests/command.test.ts +47 -44
  91. package/ASYNC-JSX-SUPPORT.md +0 -173
  92. package/lib/app.d.ts +0 -191
  93. package/lib/app.d.ts.map +0 -1
  94. package/lib/app.js +0 -604
  95. package/lib/app.js.map +0 -1
  96. package/lib/config.d.ts +0 -54
  97. package/lib/config.d.ts.map +0 -1
  98. package/lib/config.js +0 -308
  99. package/lib/config.js.map +0 -1
  100. package/lib/log-transport.d.ts +0 -37
  101. package/lib/log-transport.d.ts.map +0 -1
  102. package/lib/log-transport.js +0 -136
  103. package/lib/log-transport.js.map +0 -1
  104. package/lib/permissions.d.ts.map +0 -1
  105. package/lib/permissions.js.map +0 -1
  106. package/src/app.ts +0 -772
  107. package/src/config.ts +0 -397
  108. package/src/log-transport.ts +0 -163
  109. package/tests/app.test.ts +0 -265
  110. package/tests/permissions.test.ts +0 -358
  111. package/tests/plugin.test.ts +0 -234
  112. package/tests/prompt.test.ts +0 -223
@@ -0,0 +1,31 @@
1
+ import { App } from '../src/app';
2
+ import { LogLevel } from '@zhin.js/logger';
3
+ import { fileURLToPath } from 'url';
4
+ import * as path from 'path';
5
+
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = path.dirname(__filename);
8
+
9
+ async function runMinimalBot() {
10
+ const app = new App({
11
+ log_level: LogLevel.INFO,
12
+ plugin_dirs: [path.join(__dirname, 'plugins')],
13
+ plugins: [],
14
+ bots: [],
15
+ debug: true
16
+ });
17
+
18
+ console.log('Starting Minimal Bot...');
19
+ await app.start();
20
+ console.log('Minimal Bot Started');
21
+
22
+ // Simulate a message
23
+ // await app.receiveMessage(...)
24
+
25
+ await app.stop();
26
+ }
27
+
28
+ if (process.argv[1] === __filename) {
29
+ runMinimalBot().catch(console.error);
30
+ }
31
+
@@ -0,0 +1,123 @@
1
+ import { App } from '../src/app';
2
+ import { LogLevel } from '@zhin.js/logger';
3
+ import { fileURLToPath } from 'url';
4
+ import * as path from 'path';
5
+ import * as fs from 'fs';
6
+ // import { Message } from '../src/message'; // Message is a type/namespace, not a class
7
+
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = path.dirname(__filename);
10
+
11
+ async function runStressTest() {
12
+ const PLUGIN_COUNT = 50;
13
+ const MSG_COUNT = 10000;
14
+ const WORK_DIR = path.join(__dirname, 'stress_plugins');
15
+
16
+ console.log('Starting Core Stress Test');
17
+
18
+ // Setup workspace
19
+ if (fs.existsSync(WORK_DIR)) fs.rmSync(WORK_DIR, { recursive: true, force: true });
20
+ fs.mkdirSync(WORK_DIR, { recursive: true });
21
+
22
+ // Generate plugins
23
+ let loadedCount = 0;
24
+ for (let i = 0; i < PLUGIN_COUNT; i++) {
25
+ fs.writeFileSync(path.join(WORK_DIR, `plugin-${i}.ts`), `
26
+ import { useContext } from '${path.resolve(__dirname, '../src/plugin').replace(/\\/g, '/')}';
27
+
28
+ export function install(ctx) {
29
+ ctx.on('message.receive', (msg) => {
30
+ // console.log('Plugin ${i} received message');
31
+ });
32
+
33
+ ctx.middleware(async (msg, next) => {
34
+ await next();
35
+ });
36
+ }
37
+ `);
38
+ }
39
+
40
+ const CONFIG_FILE = path.join(WORK_DIR, 'zhin.test.yaml');
41
+ // Write config to file to avoid reload overriding it with defaults
42
+ const config = {
43
+ log_level: LogLevel.WARN,
44
+ plugin_dirs: [WORK_DIR],
45
+ plugins: Array.from({ length: PLUGIN_COUNT }, (_, i) => `plugin-${i}`),
46
+ bots: [],
47
+ debug: false
48
+ };
49
+
50
+ // Simple YAML stringify since we can't require 'yaml' easily in ESM without import
51
+ const yamlString = `
52
+ log_level: ${config.log_level}
53
+ debug: ${config.debug}
54
+ plugin_dirs:
55
+ ${config.plugin_dirs.map(d => ` - ${d}`).join('\n')}
56
+ plugins:
57
+ ${config.plugins.map(p => ` - ${p}`).join('\n')}
58
+ bots: []
59
+ `;
60
+
61
+ fs.writeFileSync(CONFIG_FILE, yamlString);
62
+
63
+ const app = new App(CONFIG_FILE);
64
+
65
+ console.log('Starting App...');
66
+ const startBoot = performance.now();
67
+ await app.start();
68
+ console.log(`App started in ${(performance.now() - startBoot).toFixed(2)}ms`);
69
+
70
+ // Verify plugins loaded
71
+ const loadedPlugins = app.hmrManager.dependencyList.length; // App itself + plugins
72
+ console.log(`Loaded Dependencies: ${loadedPlugins}`);
73
+ if (loadedPlugins < PLUGIN_COUNT) {
74
+ console.warn(`WARNING: Only ${loadedPlugins} dependencies loaded (expected >= ${PLUGIN_COUNT})`);
75
+ }
76
+
77
+ const initialMem = process.memoryUsage();
78
+ console.log(`Initial RSS: ${(initialMem.rss / 1024 / 1024).toFixed(2)} MB`);
79
+
80
+ console.log(`Sending ${MSG_COUNT} messages...`);
81
+ const startMsg = performance.now();
82
+
83
+ // Mock message factory
84
+ const createMockMsg = (id: number) => ({
85
+ $id: `msg-${id}`,
86
+ $adapter: 'mock',
87
+ $bot: 'bot1',
88
+ $content: [{ type: 'text', data: { text: 'hello' } }],
89
+ $sender: { id: 'user1' },
90
+ $channel: { id: 'group1', type: 'group' as const },
91
+ $timestamp: Date.now(),
92
+ $raw: 'hello',
93
+ $reply: async () => 'reply-id',
94
+ $recall: async () => {},
95
+ // Custom fields usually added by adapters
96
+ raw_message: 'hello',
97
+ message_type: 'group',
98
+ sender: { id: 'user1' },
99
+ });
100
+
101
+ for (let i = 0; i < MSG_COUNT; i++) {
102
+ const msg = createMockMsg(i);
103
+ await app.receiveMessage(msg as any);
104
+
105
+ if (i % 1000 === 0) {
106
+ const mem = process.memoryUsage();
107
+ process.stdout.write(`\rMsgs: ${i}, RSS: ${(mem.rss / 1024 / 1024).toFixed(2)} MB`);
108
+ }
109
+ }
110
+
111
+ console.log(`\nProcessed ${MSG_COUNT} messages in ${(performance.now() - startMsg).toFixed(2)}ms`);
112
+ console.log(`Avg: ${((performance.now() - startMsg) / MSG_COUNT).toFixed(3)}ms/msg`);
113
+
114
+ const finalMem = process.memoryUsage();
115
+ console.log(`Final RSS: ${(finalMem.rss / 1024 / 1024).toFixed(2)} MB`);
116
+ console.log(`Memory Delta: ${((finalMem.rss - initialMem.rss) / 1024 / 1024).toFixed(2)} MB`);
117
+
118
+ await app.stop();
119
+ fs.rmSync(WORK_DIR, { recursive: true, force: true });
120
+ }
121
+
122
+ runStressTest().catch(console.error);
123
+
@@ -49,55 +49,58 @@ vi.mock('segment-matcher', () => {
49
49
  })
50
50
 
51
51
  // Mock App with permissions
52
+ const mockPermissionService = {
53
+ check: vi.fn(async (perm: string, message: any) => {
54
+ if (perm === 'adapter(discord)') {
55
+ return message.$adapter === 'discord'
56
+ }
57
+ if (perm === 'adapter(telegram)') {
58
+ return message.$adapter === 'telegram'
59
+ }
60
+ if (perm === 'adapter(email)') {
61
+ return message.$adapter === 'email'
62
+ }
63
+ if (perm === 'adapter(test)') {
64
+ return message.$adapter === 'test'
65
+ }
66
+ return true
67
+ })
68
+ }
69
+
52
70
  const mockApp = {
53
- permissions: {
54
- get: vi.fn((permission: string) => {
55
- // Mock permit checker
56
- return {
57
- check: vi.fn(async (perm: string, message: any) => {
58
- if (permission === 'adapter(discord)') {
59
- return message.$adapter === 'discord'
60
- }
61
- if (permission === 'adapter(telegram)') {
62
- return message.$adapter === 'telegram'
63
- }
64
- if (permission === 'adapter(email)') {
65
- return message.$adapter === 'email'
66
- }
67
- if (permission === 'adapter(test)') {
68
- return message.$adapter === 'test'
69
- }
70
- return true
71
- })
72
- }
73
- })
74
- }
71
+ contextIsReady: vi.fn((name: string) => name === 'permission'),
72
+ inject: vi.fn((name: string) => {
73
+ if (name === 'permission') return mockPermissionService
74
+ return null
75
+ })
75
76
  } as any
76
77
 
77
78
  // 为多个权限测试创建特殊的 mock app
79
+ const multiPermitPermissionService = {
80
+ check: vi.fn(async (perm: string, message: any) => {
81
+ // 对于多个权限,只要有一个匹配就返回 true
82
+ if (perm === 'adapter(discord)' && message.$adapter === 'discord') {
83
+ return true
84
+ }
85
+ if (perm === 'adapter(telegram)' && message.$adapter === 'telegram') {
86
+ return true
87
+ }
88
+ if (perm === 'adapter(email)' && message.$adapter === 'email') {
89
+ return true
90
+ }
91
+ if (perm === 'adapter(test)' && message.$adapter === 'test') {
92
+ return true
93
+ }
94
+ return false
95
+ })
96
+ }
97
+
78
98
  const multiPermitMockApp = {
79
- permissions: {
80
- get: vi.fn((permission: string) => {
81
- return {
82
- check: vi.fn(async (perm: string, message: any) => {
83
- // 对于多个权限,只要有一个匹配就返回 true
84
- if (permission === 'adapter(discord)' && message.$adapter === 'discord') {
85
- return true
86
- }
87
- if (permission === 'adapter(telegram)' && message.$adapter === 'telegram') {
88
- return true
89
- }
90
- if (permission === 'adapter(email)' && message.$adapter === 'email') {
91
- return true
92
- }
93
- if (permission === 'adapter(test)' && message.$adapter === 'test') {
94
- return true
95
- }
96
- return false
97
- })
98
- }
99
- })
100
- }
99
+ contextIsReady: vi.fn((name: string) => name === 'permission'),
100
+ inject: vi.fn((name: string) => {
101
+ if (name === 'permission') return multiPermitPermissionService
102
+ return null
103
+ })
101
104
  } as any
102
105
 
103
106
  describe('Command系统测试', () => {
@@ -1,173 +0,0 @@
1
- # 异步 JSX 组件支持
2
-
3
- ## 概述
4
-
5
- Zhin Core 现在原生支持异步 JSX 组件,允许你像使用普通组件一样使用异步组件,无需额外的类型断言或注释。
6
-
7
- ## 核心改动
8
-
9
- ### 1. 类型系统扩展
10
-
11
- **`packages/core/src/jsx.ts`**:
12
- - 修改 `JSX.Element` 类型为联合类型,支持 `Promise<SendContent>`
13
- - `renderJSX` 函数自动检测并 await Promise 返回值
14
- - 错误时自动捕获并返回错误信息
15
-
16
- **`packages/core/src/message.ts`**:
17
- - `MessageComponent` 类型支持异步组件函数
18
-
19
- ### 2. 运行时支持
20
-
21
- **自动 Promise 处理**:
22
- ```typescript
23
- export async function renderJSX(element: MessageComponent<any>, context?: ComponentContext): Promise<SendContent> {
24
- try {
25
- // ... 组件渲染逻辑
26
- const result = await component(element.data, context || {} as ComponentContext);
27
-
28
- // 如果组件返回 Promise,自动 await
29
- if (result && typeof result === 'object' && 'then' in result) {
30
- return await result;
31
- }
32
-
33
- return result;
34
- } catch (error) {
35
- // 渲染错误时返回错误信息
36
- const errorMessage = error instanceof Error ? error.message : String(error);
37
- return `❌ 组件渲染失败: ${errorMessage}`;
38
- }
39
- }
40
- ```
41
-
42
- **子组件 Promise 处理**:
43
- ```typescript
44
- async function renderChildren(children: JSXChildren, context?: ComponentContext): Promise<SendContent> {
45
- // ...
46
- // 如果子元素是 Promise,自动 await
47
- if (children && typeof children === 'object' && 'then' in children) {
48
- try {
49
- return await children;
50
- } catch (error) {
51
- return `❌ 组件渲染失败: ${errorMessage}`;
52
- }
53
- }
54
- }
55
- ```
56
-
57
- ## 使用方式
58
-
59
- ### 定义异步组件
60
-
61
- ```tsx
62
- import { defineComponent, addComponent } from 'zhin.js';
63
-
64
- const AsyncComponent = defineComponent(async function AsyncComponent({ userId }: { userId: string }) {
65
- // 执行异步操作
66
- const user = await fetchUserFromDatabase(userId);
67
- const profile = await fetchUserProfile(userId);
68
-
69
- return `👤 ${user.name}\n📧 ${profile.email}`;
70
- }, 'AsyncComponent');
71
-
72
- addComponent(AsyncComponent);
73
- ```
74
-
75
- ### 在 JSX 中使用(现在完全类型安全)
76
-
77
- ```tsx
78
- addCommand(
79
- new MessageCommand('用户 <userId:text>')
80
- .action(async (message, result) => {
81
- // ✅ 直接使用 JSX 语法,无需 @ts-expect-error
82
- return <AsyncComponent userId={result.params.userId} />
83
- })
84
- );
85
- ```
86
-
87
- ### 嵌套异步组件
88
-
89
- ```tsx
90
- const UserProfile = defineComponent(async function UserProfile({ userId }: { userId: string }) {
91
- const user = await fetchUser(userId);
92
-
93
- // 嵌套使用其他异步组件
94
- return (
95
- <div>
96
- <h1>{user.name}</h1>
97
- <AsyncComponent userId={userId} />
98
- </div>
99
- );
100
- }, 'UserProfile');
101
- ```
102
-
103
- ## 错误处理
104
-
105
- 异步组件中的错误会自动被捕获并返回友好的错误信息:
106
-
107
- ```tsx
108
- const FailingComponent = defineComponent(async function FailingComponent() {
109
- throw new Error('数据加载失败');
110
- }, 'FailingComponent');
111
-
112
- // 使用时会自动返回: "❌ 组件渲染失败: 数据加载失败"
113
- ```
114
-
115
- ## 性能考虑
116
-
117
- - **自动 await**:框架自动检测 Promise 并等待,无额外开销
118
- - **并行渲染**:多个异步组件可以并行加载(使用 `Promise.all`)
119
- - **错误隔离**:单个组件错误不会影响整体渲染
120
-
121
- ## 迁移指南
122
-
123
- 如果你之前使用了 `@ts-expect-error` 或直接函数调用:
124
-
125
- ```tsx
126
- // ❌ 旧方式(已废弃)
127
- return await ShareMusic({ platform: 'qq', musicId: '123' });
128
-
129
- // ✅ 新方式(推荐)
130
- return <ShareMusic platform="qq" musicId="123" />
131
- ```
132
-
133
- ## TypeScript 类型
134
-
135
- ```typescript
136
- // JSX.Element 现在支持 Promise
137
- declare global {
138
- namespace JSX {
139
- type Element = MessageComponent<any> | Promise<MessageComponent<any>> | Promise<SendContent>
140
- }
141
- }
142
-
143
- // MessageComponent 支持异步函数
144
- export type MessageComponent<T extends object> = {
145
- type: Component<T & {children?: SendContent}> | ((props: T & {children?: SendContent}) => Promise<SendContent>)
146
- data: T
147
- }
148
- ```
149
-
150
- ## 测试
151
-
152
- 确保你的异步组件正确工作:
153
-
154
- ```typescript
155
- import { describe, it, expect } from 'vitest';
156
-
157
- describe('Async Components', () => {
158
- it('should render async component', async () => {
159
- const result = await renderJSX(<AsyncComponent userId="123" />);
160
- expect(result).toBe('👤 User Name\n📧 user@example.com');
161
- });
162
-
163
- it('should handle errors gracefully', async () => {
164
- const result = await renderJSX(<FailingComponent />);
165
- expect(result).toMatch(/❌ 组件渲染失败/);
166
- });
167
- });
168
- ```
169
-
170
- ---
171
-
172
- **版本**: 1.0.15+
173
- **文档更新**: 2025-11-19
package/lib/app.d.ts DELETED
@@ -1,191 +0,0 @@
1
- import { SideEffect, GlobalContext, Models } from "@zhin.js/types";
2
- import { Schema } from '@zhin.js/hmr';
3
- import { HMR, Context, Logger } from "@zhin.js/hmr";
4
- import { AdapterMessage, AppConfig, BeforeSendHandler, RegisteredAdapter, SendOptions, MessageMiddleware } from "./types.js";
5
- import { Config } from "./config.js";
6
- import { Message } from "./message.js";
7
- import { PermissionChecker, Permissions } from "./permissions.js";
8
- import { Plugin } from "./plugin.js";
9
- import { Adapter } from "./adapter";
10
- import { MessageCommand } from "./command";
11
- import { Component } from "./component";
12
- import { RelatedDatabase, DocumentDatabase, KeyValueDatabase, Definition } from "@zhin.js/database";
13
- import { SystemLog } from "./models/system-log.js";
14
- import { User } from "./models/user.js";
15
- declare module "@zhin.js/types" {
16
- interface Models {
17
- SystemLog: SystemLog;
18
- User: User;
19
- }
20
- }
21
- /**
22
- * App类:Zhin.js 应用主入口,负责插件热重载、配置管理、消息分发等。
23
- * 继承自 HMR,支持插件生命周期、适配器管理、数据库集成等。
24
- */
25
- export declare class App extends HMR<Plugin> {
26
- #private;
27
- static currentPlugin: Plugin;
28
- middlewares: MessageMiddleware[];
29
- adapters: string[];
30
- database?: RelatedDatabase<any, Models> | DocumentDatabase<any, Models> | KeyValueDatabase<any, Models>;
31
- permissions: Permissions;
32
- private logTransport?;
33
- /** 配置变更处理锁 */
34
- private configChangeLock;
35
- /**
36
- * 构造函数:初始化应用,加载配置,注册全局异常处理
37
- * @param config 可选,应用配置,若为空则自动查找配置文件
38
- */
39
- constructor(config: AppConfig);
40
- /**
41
- * 构造函数:初始化应用,加载配置,注册全局异常处理
42
- * @param config_file 可选,配置文件路径,默认为 'zhin.config.yml'
43
- */
44
- constructor(config_file?: string);
45
- /**
46
- * 处理配置变更
47
- * 如果上一次变更未完成,等待其完成后再处理新的变更
48
- */
49
- private handleConfigChange;
50
- /**
51
- * 应用配置变更
52
- */
53
- private applyConfigChanges;
54
- /**
55
- * 更新监听目录
56
- */
57
- private updateWatchDirs;
58
- /**
59
- * 更新插件加载
60
- */
61
- private updatePlugins;
62
- /**
63
- * 卸载插件
64
- */
65
- private unloadPlugin;
66
- receiveMessage<P extends RegisteredAdapter>(message: Message<AdapterMessage<P>>): Promise<void>;
67
- messageMiddleware(message: Message, next: () => Promise<void>): Promise<void>;
68
- get commands(): MessageCommand<never>[];
69
- /** 默认配置 */
70
- /**
71
- * 默认配置
72
- * - plugin_dirs: 插件目录
73
- * - plugins: 启用插件
74
- * - bots: 机器人配置
75
- * - debug: 是否调试模式
76
- */
77
- static defaultConfig: AppConfig;
78
- middleware(middleware: MessageMiddleware): void;
79
- /**
80
- * 发送消息到指定适配器和机器人
81
- * @param options 消息发送参数(包含 context、bot、内容等)
82
- * @throws 找不到适配器或机器人时抛出异常
83
- */
84
- sendMessage(options: SendOptions): Promise<string>;
85
- recallMessage(adapter_name: string, bot_name: string, id: string): Promise<void>;
86
- /** 同步加载配置文件 */
87
- /**
88
- * 同步加载配置文件(暂不支持,建议使用异步创建)
89
- * @throws 始终抛出异常,提示使用异步方法
90
- */
91
- static loadConfigSync(): AppConfig;
92
- /** 创建插件依赖 */
93
- /**
94
- * 创建插件依赖
95
- * @param name 插件名
96
- * @param filePath 插件文件路径
97
- */
98
- createDependency(name: string, filePath: string): Plugin;
99
- /** 获取App配置 */
100
- /**
101
- * 获取App配置(只读)
102
- */
103
- getConfig(): Readonly<AppConfig>;
104
- getConfig<T extends Config.Paths<AppConfig>>(key: T): Readonly<Config.Value<AppConfig, T>>;
105
- setConfig(value: AppConfig): void;
106
- setConfig<T extends Config.Paths<AppConfig>>(key: T, value: Config.Value<AppConfig, T>): void;
107
- changeSchema(key: string, value: Schema): void;
108
- get config(): AppConfig;
109
- set config(newConfig: AppConfig);
110
- get definitions(): Map<string, Definition<any>>;
111
- /** 使用插件 */
112
- use(filePath: string): void;
113
- /** 启动App */
114
- start(mode?: "dev" | "prod"): Promise<void>;
115
- /** 停止App */
116
- stop(): Promise<void>;
117
- getContext<T>(name: string): T;
118
- handleBeforeSend(options: SendOptions): Promise<SendOptions>;
119
- }
120
- export declare namespace App {
121
- const schema: Schema<{
122
- database?: any;
123
- bots?: any[] | undefined;
124
- log_level?: number | undefined;
125
- log?: {
126
- maxDays?: number | undefined;
127
- maxRecords?: number | undefined;
128
- cleanupInterval?: number | undefined;
129
- } | undefined;
130
- plugin_dirs?: string[] | undefined;
131
- plugins?: string[] | undefined;
132
- debug?: boolean | undefined;
133
- }, {
134
- database?: any;
135
- bots?: any[] | undefined;
136
- log_level?: number | undefined;
137
- log?: {
138
- maxDays?: number | undefined;
139
- maxRecords?: number | undefined;
140
- cleanupInterval?: number | undefined;
141
- } | undefined;
142
- plugin_dirs?: string[] | undefined;
143
- plugins?: string[] | undefined;
144
- debug?: boolean | undefined;
145
- }>;
146
- }
147
- /** 获取App实例 */
148
- export declare function useApp(): App;
149
- export declare function defineModel<T extends Record<string, any>>(name: string, schema: Definition<T>): Plugin;
150
- export declare function addPermit<T extends RegisteredAdapter>(name: string | RegExp, checker: PermissionChecker<T>): Plugin;
151
- /** 获取当前插件实例 */
152
- export declare function usePlugin(): Plugin;
153
- export declare function beforeSend(handler: BeforeSendHandler): void;
154
- /** 创建Context */
155
- export declare function register<T>(context: Context<T, Plugin>): Context<T, Plugin>;
156
- export declare function registerAdapter<T extends Adapter>(adapter: T): void;
157
- /** 标记必需的Context */
158
- export declare function useContext<T extends (keyof GlobalContext)[]>(...args: [...T, sideEffect: SideEffect<T>]): void;
159
- /** 添加中间件 */
160
- export declare function addMiddleware(middleware: MessageMiddleware): void;
161
- export declare function onDatabaseReady(callback: (database: RelatedDatabase<any, Models> | DocumentDatabase<any, Models> | KeyValueDatabase<any, Models>) => PromiseLike<void>): void;
162
- export declare function useDatabase(): RelatedDatabase<any, Models> | DocumentDatabase<any, Models> | KeyValueDatabase<any, Models> | undefined;
163
- export declare function onAppReady(callback: () => PromiseLike<void>): void;
164
- /** 添加指令 */
165
- export declare function addCommand(command: MessageCommand): void;
166
- /** 添加组件 */
167
- export declare function addComponent<P = any>(component: Component<P>): void;
168
- /** 监听事件 */
169
- export declare function onEvent(event: string, listener: (...args: any[]) => any): void;
170
- /** 监听群组消息 */
171
- export declare function onGroupMessage(handler: (message: Message) => void | Promise<void>): void;
172
- /** 监听私聊消息 */
173
- export declare function onPrivateMessage(handler: (message: Message) => void | Promise<void>): void;
174
- /** 监听所有消息 */
175
- export declare function onMessage<T extends RegisteredAdapter>(handler: (message: Message<AdapterMessage<T>>) => void | Promise<void>): void;
176
- /** 获取下一条消息 */
177
- export declare function usePrompt<P extends RegisteredAdapter>(message: Message<AdapterMessage<P>>): import("./prompt.js").Prompt<P>;
178
- /** 监听插件挂载事件 */
179
- export declare function onMounted(hook: (plugin: Plugin) => Promise<void> | void): void;
180
- /** 监听插件销毁事件 */
181
- export declare function onDispose(hook: () => void): void;
182
- /** 发送消息 */
183
- export declare function sendMessage(options: SendOptions): Promise<void>;
184
- export declare function defineSchema<S extends Schema>(rules: S): S;
185
- /** 获取App实例(用于高级操作) */
186
- export declare function getAppInstance(): App;
187
- /** 获取插件日志记录器 */
188
- export declare function useLogger(): Logger;
189
- /** 创建App实例的工厂函数 */
190
- export declare function createApp(config_file?: string): Promise<App>;
191
- //# sourceMappingURL=app.d.ts.map
package/lib/app.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EACL,GAAG,EACH,OAAO,EACP,MAAM,EAIP,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,iBAAiB,EAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAKvC,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGlE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EAEX,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,SAAS,EAAuB,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,IAAI,EAAkB,MAAM,kBAAkB,CAAC;AAExD,OAAO,QAAQ,gBAAgB,CAAC;IAC9B,UAAU,MAAM;QACd,SAAS,EAAE,SAAS,CAAC;QACrB,IAAI,EAAE,IAAI,CAAC;KACZ;CACF;AAKD;;;GAGG;AACH,qBAAa,GAAI,SAAQ,GAAG,CAAC,MAAM,CAAC;;IAClC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC;IAC7B,WAAW,EAAE,iBAAiB,EAAE,CAAM;IACtC,QAAQ,EAAE,MAAM,EAAE,CAAM;IAExB,QAAQ,CAAC,EACL,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,GAC5B,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,GAC7B,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAClC,WAAW,EAAE,WAAW,CAAyB;IACjD,OAAO,CAAC,YAAY,CAAC,CAAuB;IAC5C,cAAc;IACd,OAAO,CAAC,gBAAgB,CAA8B;IACtD;;;OAGG;gBACS,MAAM,EAAE,SAAS;IAC7B;;;OAGG;gBACS,WAAW,CAAC,EAAE,MAAM;IAuChC;;;OAGG;YACW,kBAAkB;IAqBhC;;OAEG;YACW,kBAAkB;IAoChC;;OAEG;YACW,eAAe;IA0B7B;;OAEG;YACW,aAAa;IA8B3B;;OAEG;YACW,YAAY;IAkBpB,cAAc,CAAC,CAAC,SAAS,iBAAiB,EAC9C,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAY/B,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC;IAOnE,IAAI,QAAQ,4BAKX;IACD,WAAW;IACX;;;;;;OAMG;IACH,MAAM,CAAC,aAAa,EAAE,SAAS,CAM7B;IACF,UAAU,CAAC,UAAU,EAAE,iBAAiB;IAGxC;;;;OAIG;IACG,WAAW,CAAC,OAAO,EAAE,WAAW;IAWhC,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IAStE,eAAe;IACf;;;OAGG;IACH,MAAM,CAAC,cAAc,IAAI,SAAS;IAMlC,aAAa;IACb;;;;OAIG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAIxD,cAAc;IACd;;OAEG;IACH,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC;IAChC,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EACzC,GAAG,EAAE,CAAC,GACL,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAOvC,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IACjC,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EACzC,GAAG,EAAE,CAAC,EACN,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,GAChC,IAAI;IAWP,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAOvC,IAAI,MAAM,IAGY,SAAS,CAD9B;IACD,IAAI,MAAM,CAAC,SAAS,EAAE,SAAS,EAqB9B;IACD,IAAI,WAAW,iCAad;IACD,WAAW;IACX,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IA4B3B,YAAY;IACN,KAAK,CAAC,IAAI,GAAE,KAAK,GAAG,MAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAazD,YAAY;IACN,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB3B,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC;IAcxB,gBAAgB,CAAC,OAAO,EAAE,WAAW;CAW5C;AACD,yBAAiB,GAAG,CAAC;IACZ,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;MAyCjB,CAAC;CACJ;AA2BD,cAAc;AACd,wBAAgB,MAAM,IAAI,GAAG,CAI5B;AACD,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACvD,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,UAItB;AACD,wBAAgB,SAAS,CAAC,CAAC,SAAS,iBAAiB,EACnD,IAAI,EAAE,MAAM,GAAG,MAAM,EACrB,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,UAI9B;AACD,eAAe;AACf,wBAAgB,SAAS,IAAI,MAAM,CAclC;AACD,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,QAGpD;AACD,gBAAgB;AAChB,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAG3E;AACD,wBAAgB,eAAe,CAAC,CAAC,SAAS,OAAO,EAAE,OAAO,EAAE,CAAC,QAc5D;AAED,mBAAmB;AACnB,wBAAgB,UAAU,CAAC,CAAC,SAAS,CAAC,MAAM,aAAa,CAAC,EAAE,EAC1D,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,GACzC,IAAI,CAGN;AAED,YAAY;AACZ,wBAAgB,aAAa,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI,CAGjE;AACD,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,CACR,QAAQ,EACJ,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,GAC5B,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,GAC7B,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,KAC9B,WAAW,CAAC,IAAI,CAAC,QAKvB;AACD,wBAAgB,WAAW,6GAG1B;AACD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,WAAW,CAAC,IAAI,CAAC,QAI3D;AACD,WAAW;AACX,wBAAgB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAGxD;AAED,WAAW;AACX,wBAAgB,YAAY,CAAC,CAAC,GAAG,GAAG,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAGnE;AAED,WAAW;AACX,wBAAgB,OAAO,CACrB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,GAChC,IAAI,CAGN;AAED,aAAa;AACb,wBAAgB,cAAc,CAC5B,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAClD,IAAI,CAEN;AAED,aAAa;AACb,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAClD,IAAI,CAEN;AAED,aAAa;AACb,wBAAgB,SAAS,CAAC,CAAC,SAAS,iBAAiB,EACnD,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GACrE,IAAI,CAEN;AACD,cAAc;AACd,wBAAgB,SAAS,CAAC,CAAC,SAAS,iBAAiB,EACnD,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,mCAIpC;AAED,eAAe;AACf,wBAAgB,SAAS,CACvB,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAC7C,IAAI,CAIN;AAED,eAAe;AACf,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,IAAI,GAAG,IAAI,CAIhD;AAED,WAAW;AACX,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAGrE;AACD,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAG1D;AACD,sBAAsB;AACtB,wBAAgB,cAAc,IAAI,GAAG,CAEpC;AAED,gBAAgB;AAChB,wBAAgB,SAAS,IAAI,MAAM,CAGlC;AAED,mBAAmB;AACnB,wBAAsB,SAAS,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAIlE"}