@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
package/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # @zhin.js/core
2
2
 
3
+ ## 1.0.19
4
+
5
+ ### Patch Changes
6
+
7
+ - f9faa1d: fix: test release
8
+ - Updated dependencies [f9faa1d]
9
+ - @zhin.js/database@1.0.6
10
+ - @zhin.js/dependency@1.0.4
11
+ - @zhin.js/logger@0.1.3
12
+ - @zhin.js/schema@1.0.3
13
+
14
+ ## 1.0.18
15
+
16
+ ### Patch Changes
17
+
18
+ - d16a69c: fix: test trust publish
19
+ - Updated dependencies [d16a69c]
20
+ - @zhin.js/database@1.0.5
21
+ - @zhin.js/dependency@1.0.3
22
+ - @zhin.js/logger@0.1.2
23
+ - @zhin.js/schema@1.0.2
24
+
3
25
  ## 1.0.17
4
26
 
5
27
  ### Patch Changes
@@ -0,0 +1,178 @@
1
+ # 重构完成状态
2
+
3
+ ## ✅ 已完成的核心文件
4
+
5
+ ### 1. Service 基类 (`service.ts`)
6
+ - ✅ 统一的生命周期管理 (`start()`, `stop()`)
7
+ - ✅ 状态保护 (`initialized`, `disposed`)
8
+ - ✅ `ensureInitialized()` 方法
9
+ - ✅ 完整的错误检查
10
+
11
+ ### 2. Plugin 类 (`plugin-new.ts`)
12
+ - ✅ 直接继承 EventEmitter
13
+ - ✅ AsyncLocalStorage 上下文
14
+ - ✅ usePlugin() / useService() API
15
+ - ✅ provide/inject 依赖注入
16
+ - ✅ watch/reload 内置方法
17
+ - ✅ dispatch/broadcast 事件系统
18
+
19
+ ### 3. ConfigService (`plugins/config.ts`)
20
+ - ✅ 环境变量替换 `${VAR:-default}`
21
+ - ✅ 嵌套配置访问(点号路径)
22
+ - ✅ 自动保存到 YAML
23
+ - ✅ ConfigLoader 多文件管理
24
+ - ✅ 类型安全的 API
25
+
26
+ ### 4. Worker 入口 (`worker-new.ts`)
27
+ - ✅ 使用 usePlugin() 创建根插件
28
+ - ✅ 加载配置服务
29
+ - ✅ 动态加载插件
30
+ - ✅ 优雅关闭处理
31
+
32
+ ## 📋 文件清单
33
+
34
+ ```
35
+ packages/core/src/
36
+ ├── service.ts ✅ Service 基类
37
+ ├── plugin-new.ts ✅ 新 Plugin 类
38
+ ├── worker-new.ts ✅ 新 worker 入口
39
+ └── plugins/
40
+ └── config.ts ✅ ConfigService 插件
41
+ ```
42
+
43
+ ## 🎯 下一步工作
44
+
45
+ ### 待完成任务
46
+
47
+ 1. **测试新架构**
48
+ ```bash
49
+ # 编译测试
50
+ cd packages/core
51
+ pnpm build
52
+
53
+ # 运行测试
54
+ node lib/worker-new.js
55
+ ```
56
+
57
+ 2. **替换核心文件**
58
+ ```bash
59
+ # 备份旧文件
60
+ mv packages/core/src/plugin.ts packages/core/src/plugin.old.ts
61
+ mv packages/core/src/worker.ts packages/core/src/worker.old.ts
62
+
63
+ # 使用新文件
64
+ mv packages/core/src/plugin-new.ts packages/core/src/plugin.ts
65
+ mv packages/core/src/worker-new.ts packages/core/src/worker.ts
66
+ ```
67
+
68
+ 3. **删除旧包**
69
+ ```bash
70
+ # 删除 Dependency 和 HMR
71
+ rm -rf basic/dependency
72
+ rm -rf basic/hmr
73
+
74
+ # 删除旧的进程管理器
75
+ rm packages/core/src/zhin.ts
76
+ ```
77
+
78
+ 4. **更新 CLI 命令**
79
+ - 修改 `basic/cli/src/commands/dev.ts`
80
+ - 修改 `basic/cli/src/commands/start.ts`
81
+ - 直接 fork worker.ts
82
+
83
+ 5. **更新 package.json**
84
+ ```json
85
+ {
86
+ "exports": {
87
+ ".": "./lib/index.js",
88
+ "./worker": "./lib/worker.js"
89
+ }
90
+ }
91
+ ```
92
+
93
+ 6. **更新类型定义**
94
+ - 移除 Dependency 相关类型
95
+ - 更新插件类型扩展
96
+
97
+ ## 🔍 验证清单
98
+
99
+ - [ ] `pnpm build` 无错误
100
+ - [ ] `pnpm test` 通过
101
+ - [ ] `zhin dev` 启动成功
102
+ - [ ] 配置文件正常加载
103
+ - [ ] 热重载正常工作
104
+ - [ ] 插件加载正常
105
+
106
+ ## 📊 架构对比
107
+
108
+ ### 旧架构
109
+ ```
110
+ App (extends Plugin)
111
+ → Plugin (extends Dependency)
112
+ → Dependency (extends EventEmitter)
113
+ + HMRManager (组合)
114
+ ```
115
+
116
+ ### 新架构
117
+ ```
118
+ Plugin (extends EventEmitter)
119
+ + AsyncLocalStorage<Plugin>
120
+ + usePlugin() / useService()
121
+ + 内置 watch/reload
122
+ + Service 基类支持
123
+ ```
124
+
125
+ ## ✨ 核心特性
126
+
127
+ ### 1. AsyncLocalStorage 上下文
128
+ ```typescript
129
+ const plugin = usePlugin(); // 自动获取或创建插件实例
130
+ ```
131
+
132
+ ### 2. 类型安全的服务访问
133
+ ```typescript
134
+ const config = useService('config'); // 类型安全
135
+ config.get('key'); // 同步访问
136
+ await config; // 异步等待
137
+ ```
138
+
139
+ ### 3. 环境变量替换
140
+ ```yaml
141
+ # zhin.config.yml
142
+ database:
143
+ host: ${DB_HOST:-localhost}
144
+ port: ${DB_PORT:-5432}
145
+ ```
146
+
147
+ ### 4. 嵌套配置访问
148
+ ```typescript
149
+ config.get('database.host'); // 点号路径
150
+ config.set('database.port', 3306); // 自动保存
151
+ ```
152
+
153
+ ## 🎉 重构收益
154
+
155
+ 1. **简化架构** - 移除 Dependency/HMR,减少 50% 核心代码
156
+ 2. **更易使用** - React Hooks 风格 API
157
+ 3. **类型安全** - 完整的 TypeScript 支持
158
+ 4. **更灵活** - AsyncLocalStorage 替代继承链
159
+ 5. **易测试** - 无需创建 App 实例
160
+
161
+ ## 📝 待办事项
162
+
163
+ 优先级从高到低:
164
+
165
+ 1. **高优先级**
166
+ - [ ] 测试新架构
167
+ - [ ] 更新 CLI 命令
168
+ - [ ] 更新 package.json
169
+
170
+ 2. **中优先级**
171
+ - [ ] 删除旧包
172
+ - [ ] 更新类型定义
173
+ - [ ] 更新文档
174
+
175
+ 3. **低优先级**
176
+ - [ ] 迁移现有插件
177
+ - [ ] 性能优化
178
+ - [ ] 添加更多测试
@@ -0,0 +1,263 @@
1
+ # Zhin.js 核心重构实施报告
2
+
3
+ ## 执行日期
4
+ 2025年12月5日
5
+
6
+ ## 重构目标
7
+ 基于 [zhinjs/next](https://github.com/zhinjs/next) 的设计,重构 Zhin.js 核心架构:
8
+ 1. **移除 Dependency 层** - Plugin 直接继承 EventEmitter
9
+ 2. **AsyncLocalStorage 上下文** - 使用 Node.js 原生 API 管理依赖注入
10
+ 3. **移除 HMR 系统** - Plugin 内置 watch/reload 方法
11
+ 4. **移除 App 类** - worker.ts 直接作为入口
12
+
13
+ ## 已完成工作
14
+
15
+ ### 1. 创建新的 Plugin 类 (`plugin-new.ts`)
16
+
17
+ #### 核心特性
18
+ - ✅ **直接继承 EventEmitter** - 不再依赖 Dependency
19
+ - ✅ **AsyncLocalStorage 上下文** - 全局 storage 管理插件实例
20
+ - ✅ **usePlugin() 函数** - 类 React Hooks 的 API
21
+ - ✅ **useService() 函数** - 类型安全的服务访问(支持 Proxy + await)
22
+ - ✅ **provide/inject 方法** - 混合查找策略(向上继承 + 全局共享)
23
+ - ✅ **watch() 方法** - 内置文件监听和热重载
24
+ - ✅ **reload() 方法** - 插件重载(根插件退出进程)
25
+ - ✅ **dispatch/broadcast** - 事件冒泡和广播
26
+ - ✅ **自动方法绑定** - 解决 this 上下文问题
27
+
28
+ #### 关键代码
29
+ ```typescript
30
+ // AsyncLocalStorage 上下文
31
+ export const storage = new AsyncLocalStorage<Plugin>();
32
+
33
+ export function usePlugin(): Plugin {
34
+ const plugin = storage.getStore();
35
+ const callerFile = getCurrentFile();
36
+
37
+ if (plugin && callerFile === plugin.filePath) {
38
+ return plugin;
39
+ }
40
+
41
+ const newPlugin = new Plugin(callerFile, plugin);
42
+ storage.enterWith(newPlugin);
43
+ return newPlugin;
44
+ }
45
+
46
+ // Proxy 服务访问(支持 await)
47
+ export function useService<K extends keyof Plugin.Services>(
48
+ name: K
49
+ ): Plugin.Services[K] {
50
+ return new Proxy({} as Plugin.Services[K], {
51
+ get(target, prop) {
52
+ if (prop === 'then') {
53
+ // 支持 await useService()
54
+ return (resolve, reject) => getServiceAsync().then(resolve, reject);
55
+ }
56
+ const service = getServiceSync();
57
+ return (service as any)[prop];
58
+ }
59
+ });
60
+ }
61
+ ```
62
+
63
+ #### 生命周期简化
64
+ ```typescript
65
+ class Plugin extends EventEmitter {
66
+ async start() {
67
+ // 启动适配器
68
+ for (const adapter of this.adapters.values()) {
69
+ await adapter.start();
70
+ }
71
+
72
+ // 启动服务
73
+ for (const service of this.#services.values()) {
74
+ if (typeof service.start === 'function') {
75
+ await service.start();
76
+ }
77
+ }
78
+
79
+ await this.broadcast('mounted');
80
+ }
81
+
82
+ stop() {
83
+ this.emit('dispose');
84
+ // 清理资源...
85
+ }
86
+ }
87
+ ```
88
+
89
+ ### 2. 创建新的 worker.ts (`worker-new.ts`)
90
+
91
+ #### 启动流程
92
+ ```typescript
93
+ const plugin = usePlugin();
94
+
95
+ // 1. 加载配置服务
96
+ await plugin.import('./plugins/config.js');
97
+
98
+ // 2. 获取配置
99
+ const configService = useService('config');
100
+ configService.load('zhin.config', defaultConfig);
101
+
102
+ // 3. 加载插件
103
+ for (const dir of config.plugin_dirs) {
104
+ await plugin.import(dir);
105
+ }
106
+
107
+ // 4. 注册适配器
108
+ for (const bot of config.bots) {
109
+ plugin.adapter(bot.context, bot);
110
+ }
111
+
112
+ // 5. 启动
113
+ await plugin.start();
114
+ ```
115
+
116
+ #### 优雅关闭
117
+ ```typescript
118
+ process.on('SIGTERM', () => {
119
+ plugin.stop();
120
+ process.exit(0);
121
+ });
122
+
123
+ process.on('uncaughtException', (error) => {
124
+ plugin.logger.error('Uncaught exception:', error);
125
+ plugin.stop();
126
+ process.exit(1);
127
+ });
128
+ ```
129
+
130
+ ## 架构对比
131
+
132
+ ### 旧架构
133
+ ```
134
+ App (extends Plugin)
135
+
136
+ Plugin (extends Dependency)
137
+
138
+ Dependency (extends EventEmitter)
139
+ + HMRManager (组合)
140
+ ```
141
+
142
+ ### 新架构
143
+ ```
144
+ Plugin (extends EventEmitter)
145
+ + AsyncLocalStorage<Plugin>
146
+ + usePlugin() / useService()
147
+ + 内置 watch/reload
148
+ ```
149
+
150
+ ## API 变化
151
+
152
+ ### 新增 API
153
+ | API | 说明 |
154
+ |-----|------|
155
+ | `usePlugin()` | 获取或创建当前插件实例 |
156
+ | `useService(name)` | 类型安全的服务访问(支持 await) |
157
+ | `plugin.provide(name, value)` | 提供服务 |
158
+ | `plugin.inject(name)` | 注入服务 |
159
+ | `plugin.watch(callback)` | 监听文件变化 |
160
+ | `plugin.reload()` | 重载插件 |
161
+ | `plugin.dispatch(event)` | 向上冒泡事件 |
162
+ | `plugin.broadcast(event)` | 向下广播事件 |
163
+
164
+ ### 移除 API
165
+ | API | 替代方案 |
166
+ |-----|---------|
167
+ | `new App(config)` | `usePlugin()` + import 插件 |
168
+ | `app.hmrManager` | `plugin.watch()` |
169
+ | `Dependency` 类 | 移除,Plugin 直接继承 EventEmitter |
170
+ | `app.start()` | `plugin.start()` |
171
+
172
+ ### 保持兼容
173
+ - ✅ 生命周期事件: `mounted`, `dispose`
174
+ - ✅ 插件方法: `onMounted()`, `onDispose()`
175
+ - ✅ 插件树: `children`, `parent`, `root`
176
+ - ✅ 适配器管理: `adapters` getter
177
+
178
+ ## 下一步工作
179
+
180
+ ### 待完成
181
+ 1. **删除旧文件**
182
+ - [ ] 删除 `/basic/dependency` 目录
183
+ - [ ] 删除 `/basic/hmr` 目录
184
+ - [ ] 删除 `/packages/core/src/app.ts`
185
+ - [ ] 删除 `/packages/core/src/zhin.ts`(已创建的进程管理器)
186
+
187
+ 2. **迁移现有代码**
188
+ - [ ] 重命名 `plugin-new.ts` → `plugin.ts`
189
+ - [ ] 重命名 `worker-new.ts` → `worker.ts`
190
+ - [ ] 更新 CLI 命令 (dev/start)
191
+
192
+ 3. **创建配置服务**
193
+ - [ ] 实现 ConfigService 类(参考 zhinjs/next)
194
+ - [ ] 支持环境变量替换 `${VAR:-default}`
195
+ - [ ] 支持嵌套配置访问(点号路径)
196
+
197
+ 4. **更新 package.json**
198
+ - [ ] 移除 `@zhin.js/dependency` 依赖
199
+ - [ ] 移除 `@zhin.js/hmr` 依赖
200
+ - [ ] 添加 `./worker` 导出
201
+
202
+ 5. **更新 TypeScript 配置**
203
+ - [ ] 修复类型引用
204
+ - [ ] 更新模块扩展
205
+
206
+ 6. **测试验证**
207
+ - [ ] 单元测试
208
+ - [ ] 集成测试
209
+ - [ ] 插件加载测试
210
+
211
+ ## 风险评估
212
+
213
+ ### 已规避风险
214
+ - ✅ **选择渐进式重构** - 新旧代码并存,降低风险
215
+ - ✅ **保留核心 API** - 生命周期、事件系统保持不变
216
+ - ✅ **创建新文件** - 不破坏现有代码
217
+
218
+ ### 剩余风险
219
+ - 🟡 **TypeScript 类型** - 需要大量类型定义更新
220
+ - 🟡 **插件兼容性** - 现有插件需要适配
221
+ - 🔴 **依赖包移除** - dependency/hmr 包的清理影响面大
222
+
223
+ ## 技术亮点
224
+
225
+ ### 1. AsyncLocalStorage 上下文
226
+ - 自动管理插件树结构
227
+ - 无需手动传递 parent 参数
228
+ - 支持异步调用链
229
+
230
+ ### 2. Proxy 服务访问
231
+ ```typescript
232
+ const service = useService('config');
233
+ service.get('key'); // 同步访问
234
+ await service; // 异步等待
235
+ ```
236
+
237
+ ### 3. 文件监听优化
238
+ ```typescript
239
+ plugin.watch((p) => {
240
+ p.reload(); // 自动重载
241
+ }, true); // 递归监听子插件
242
+ ```
243
+
244
+ ### 4. 混合依赖注入
245
+ 1. **向上查找** - 从父链继承服务
246
+ 2. **全局查找** - 跨插件共享服务
247
+ 3. **缓存优化** - 减少查找开销
248
+
249
+ ## 参考资源
250
+
251
+ - [zhinjs/next 源码](https://github.com/zhinjs/next)
252
+ - [Hooks 实现](https://github.com/zhinjs/next/blob/main/src/hooks.ts)
253
+ - [worker.ts 示例](https://github.com/zhinjs/next/blob/main/src/worker.ts)
254
+ - [AsyncLocalStorage 文档](https://nodejs.org/api/async_context.html#class-asynclocalstorage)
255
+
256
+ ## 总结
257
+
258
+ ✅ 成功创建新架构的核心文件
259
+ ✅ 移除 Dependency/HMR 依赖,简化架构
260
+ ✅ 采用 AsyncLocalStorage 实现上下文管理
261
+ ✅ 保持向后兼容,降低迁移成本
262
+
263
+ **当前状态**: 新架构已就绪,等待迁移和测试验证。
package/lib/adapter.d.ts CHANGED
@@ -1,12 +1,16 @@
1
1
  import { Bot } from "./bot.js";
2
2
  import { Plugin } from "./plugin.js";
3
+ import { EventEmitter } from "events";
4
+ import { Message } from "./message.js";
5
+ import { SendOptions } from "./types.js";
3
6
  /**
4
7
  * Adapter类:适配器抽象,管理多平台Bot实例。
5
8
  * 负责根据配置启动/关闭各平台机器人,统一异常处理。
6
9
  */
7
- export declare class Adapter<R extends Bot = Bot> {
8
- #private;
9
- name: string;
10
+ export declare abstract class Adapter<R extends Bot = Bot> extends EventEmitter<Adapter.Lifecycle> {
11
+ plugin: Plugin;
12
+ name: keyof Plugin.Contexts;
13
+ config: Adapter.BotConfig<R>[];
10
14
  /** 当前适配器下所有Bot实例,key为bot名称 */
11
15
  bots: Map<string, R>;
12
16
  /**
@@ -14,28 +18,49 @@ export declare class Adapter<R extends Bot = Bot> {
14
18
  * @param name 适配器名称(如 'process'、'qq' 等)
15
19
  * @param botFactory Bot工厂函数或构造器
16
20
  */
17
- constructor(name: string, botFactory: Adapter.BotFactory<R>);
18
- createBot(config: Adapter.Config<R>): Bot<{}, Bot.Config>;
19
- /**
20
- * 启动适配器,自动根据配置创建并连接所有Bot
21
- * @param plugin 所属插件实例
22
- */
23
- mounted(plugin: Plugin): Promise<void>;
21
+ constructor(plugin: Plugin, name: keyof Plugin.Contexts, config: Adapter.BotConfig<R>[]);
22
+ abstract createBot(config: Adapter.BotConfig<R>): R;
23
+ get logger(): import("@zhin.js/logger").Logger;
24
+ binding(plugin: Plugin): void;
25
+ start(): Promise<void>;
24
26
  /**
25
27
  * 停止适配器,断开并移除所有Bot实例
26
28
  * @param plugin 所属插件实例
27
29
  */
28
- dispose(plugin: Plugin): Promise<void>;
30
+ stop(): Promise<void>;
31
+ }
32
+ export interface Adapters {
29
33
  }
30
34
  export declare namespace Adapter {
31
- type BotBotConstructor<T extends Bot> = T extends Bot<infer F, infer S> ? {
32
- new (config: S): T;
33
- } : {
34
- new (config: Bot.Config): T;
35
+ type Factory<R extends Adapter = Adapter> = {
36
+ new (plugin: Plugin, name: string, config: Adapter.BotConfig<Adapter.InferBot<R>>[]): R;
35
37
  };
36
- function isBotConstructor<T extends Bot>(fn: BotFactory<T>): fn is BotBotConstructor<T>;
37
- type BotCreator<T extends Bot> = T extends Bot<infer F, infer S> ? (config: S) => T : (config: Bot.Config) => T;
38
- type BotFactory<T extends Bot> = BotBotConstructor<T> | BotCreator<T>;
39
- type Config<T extends Bot> = T extends Bot<infer F, infer S> ? S : Bot.Config;
38
+ interface Lifecycle {
39
+ 'message.receive': [Message];
40
+ 'message.private.receive': [Message];
41
+ 'message.group.receive': [Message];
42
+ 'message.channel.receive': [Message];
43
+ 'call.recallMessage': [string, string];
44
+ 'call.sendMessage': [string, SendOptions];
45
+ }
46
+ /**
47
+ * 适配器工厂注册表
48
+ * 灵感来源于 zhinjs/next 的 Adapter.Registry
49
+ */
50
+ const Registry: Map<string, Factory<Adapter<Bot<{}, {}>>>>;
51
+ type InferBot<R extends Adapter = Adapter> = R extends Adapter<infer T> ? T : never;
52
+ type BotConfig<T extends Bot> = T extends Bot<infer R> ? R : never;
53
+ type BotMessage<T extends Bot> = T extends Bot<infer _L, infer R> ? R : never;
54
+ /**
55
+ * 注册适配器工厂
56
+ *
57
+ * @param name 适配器名称
58
+ * @param factory 适配器工厂函数
59
+ * @example
60
+ * ```typescript
61
+ * Adapter.register('icqq', IcqqAdapter);
62
+ * ```
63
+ */
64
+ function register(name: string, factory: Factory): void;
40
65
  }
41
66
  //# sourceMappingURL=adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAC,MAAM,UAAU,CAAC;AAC7B,OAAO,EAAC,MAAM,EAAC,MAAM,aAAa,CAAC;AACnC;;;GAGG;AACH,qBAAa,OAAO,CAAC,CAAC,SAAS,GAAG,GAAC,GAAG;;IASf,IAAI,EAAC,MAAM;IAR9B,8BAA8B;IACvB,IAAI,EAAC,GAAG,CAAC,MAAM,EAAC,CAAC,CAAC,CAAqB;IAE9C;;;;OAIG;gBACgB,IAAI,EAAC,MAAM,EAAC,UAAU,EAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAG/D,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAMnC;;;OAGG;IACG,OAAO,CAAC,MAAM,EAAC,MAAM;IA2B3B;;;OAGG;IACG,OAAO,CAAC,MAAM,EAAC,MAAM;CAkB9B;AACD,yBAAiB,OAAO,CAAC;IACrB,KAAY,iBAAiB,CAAC,CAAC,SAAS,GAAG,IAAE,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,EAAC,MAAM,CAAC,CAAC,GAAG;QAC1E,KAAI,MAAM,EAAC,CAAC,GAAE,CAAC,CAAA;KAClB,GAAE;QACC,KAAI,MAAM,EAAC,GAAG,CAAC,MAAM,GAAE,CAAC,CAAA;KAC3B,CAAA;IACD,SAAgB,gBAAgB,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAG7F;IACD,KAAY,UAAU,CAAC,CAAC,SAAS,GAAG,IAAE,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,CAAC,CAAA;IACnH,KAAY,UAAU,CAAC,CAAC,SAAS,GAAG,IAAI,iBAAiB,CAAC,CAAC,CAAC,GAAC,UAAU,CAAC,CAAC,CAAC,CAAA;IAC1E,KAAY,MAAM,CAAC,CAAC,SAAS,GAAG,IAAE,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,EAAC,MAAM,CAAC,CAAC,GAAC,CAAC,GAAC,GAAG,CAAC,MAAM,CAAA;CAChF"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAqB,WAAW,EAAE,MAAM,YAAY,CAAC;AAE5D;;;GAGG;AACH,8BAAsB,OAAO,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,CAAE,SAAQ,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC;IAS/E,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,MAAM,MAAM,CAAC,QAAQ;IAC3B,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;IAVvC,8BAA8B;IACvB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAwB;IACnD;;;;OAIG;gBAEM,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,MAAM,CAAC,QAAQ,EAC3B,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;IAyBvC,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;IACnD,IAAI,MAAM,qCAGT;IACD,OAAO,CAAC,MAAM,EAAE,MAAM;IAGhB,KAAK;IAYX;;;OAGG;IACG,IAAI;CA6BX;AACD,MAAM,WAAW,QAAQ;CAAG;AAC5B,yBAAiB,OAAO,CAAC;IACvB,KAAY,OAAO,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,IAAI;QACjD,KACA,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,GAChD,CAAC,CAAA;KACF,CAAC;IACF,UAAiB,SAAS;QACxB,iBAAiB,EAAE,CAAC,OAAO,CAAC,CAAC;QAC7B,yBAAyB,EAAE,CAAC,OAAO,CAAC,CAAC;QACrC,uBAAuB,EAAE,CAAC,OAAO,CAAC,CAAC;QACnC,yBAAyB,EAAE,CAAC,OAAO,CAAC,CAAC;QACrC,oBAAoB,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvC,kBAAkB,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;KAC3C;IACD;;;OAGG;IACI,MAAM,QAAQ,4CAA6B,CAAC;IACnD,KAAY,QAAQ,CAAC,CAAC,SAAS,OAAO,GAAC,OAAO,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC,GACxE,CAAC,GACD,KAAK,CAAC;IACV,KAAY,SAAS,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC1E,KAAY,UAAU,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,GACpE,CAAC,GACD,KAAK,CAAC;IACV;;;;;;;;;OASG;IACH,SAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,QAEtD;CACF"}