@zhin.js/core 1.1.34 → 1.1.35

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 (386) hide show
  1. package/README.md +121 -65
  2. package/lib/adapter.d.ts +72 -23
  3. package/lib/adapter.js +222 -62
  4. package/lib/built/adapter-process.d.ts +20 -5
  5. package/lib/built/adapter-process.js +54 -7
  6. package/lib/built/agent-preset.d.ts +1 -2
  7. package/lib/built/agent-preset.js +1 -2
  8. package/lib/built/ai-access.d.ts +36 -0
  9. package/lib/built/ai-access.js +46 -0
  10. package/lib/built/ai-outbound/adapter-access.d.ts +3 -0
  11. package/lib/built/ai-outbound/adapter-access.js +9 -0
  12. package/lib/built/ai-outbound/extensions/onebot-keyboard.d.ts +2 -0
  13. package/lib/built/ai-outbound/extensions/onebot-keyboard.js +67 -0
  14. package/lib/built/ai-outbound/extensions/qq-message.d.ts +3 -0
  15. package/lib/built/ai-outbound/extensions/qq-message.js +23 -0
  16. package/lib/built/ai-outbound/index.d.ts +9 -0
  17. package/lib/built/ai-outbound/index.js +9 -0
  18. package/lib/built/ai-outbound/parse.d.ts +13 -0
  19. package/lib/built/ai-outbound/parse.js +104 -0
  20. package/lib/built/ai-outbound/plain-mention-rewrite.d.ts +6 -0
  21. package/lib/built/ai-outbound/plain-mention-rewrite.js +37 -0
  22. package/lib/built/ai-outbound/prompt.d.ts +11 -0
  23. package/lib/built/ai-outbound/prompt.js +44 -0
  24. package/lib/built/ai-outbound/resolve.d.ts +4 -0
  25. package/lib/built/ai-outbound/resolve.js +64 -0
  26. package/lib/built/ai-outbound/structured-detect.d.ts +3 -0
  27. package/lib/built/ai-outbound/structured-detect.js +6 -0
  28. package/lib/built/ai-outbound/types.d.ts +58 -0
  29. package/lib/built/ai-outbound/types.js +5 -0
  30. package/lib/built/ai-trigger.d.ts +17 -17
  31. package/lib/built/ai-trigger.js +65 -70
  32. package/lib/built/authorization.d.ts +10 -0
  33. package/lib/built/authorization.js +76 -0
  34. package/lib/built/command.d.ts +9 -5
  35. package/lib/built/command.js +20 -7
  36. package/lib/built/common-adapter-tools.d.ts +35 -29
  37. package/lib/built/common-adapter-tools.js +83 -67
  38. package/lib/built/component.d.ts +1 -3
  39. package/lib/built/component.js +2 -4
  40. package/lib/built/config.d.ts +4 -5
  41. package/lib/built/config.js +26 -9
  42. package/lib/built/connect-endpoint-instance.d.ts +17 -0
  43. package/lib/built/connect-endpoint-instance.js +42 -0
  44. package/lib/built/database.d.ts +5 -3
  45. package/lib/built/database.js +10 -4
  46. package/lib/built/dispatcher.d.ts +10 -8
  47. package/lib/built/dispatcher.js +31 -9
  48. package/lib/built/endpoint-commands.d.ts +3 -0
  49. package/lib/built/endpoint-commands.js +99 -0
  50. package/lib/built/endpoint-lifecycle-service.d.ts +28 -0
  51. package/lib/built/endpoint-lifecycle-service.js +242 -0
  52. package/lib/built/endpoint-lifecycle.d.ts +27 -0
  53. package/lib/built/endpoint-lifecycle.js +36 -0
  54. package/lib/built/endpoint-manager.d.ts +34 -0
  55. package/lib/built/endpoint-manager.js +1 -0
  56. package/lib/built/generated-qrcode.d.ts +24 -0
  57. package/lib/built/generated-qrcode.js +45 -0
  58. package/lib/built/generic-segment-mapper.d.ts +4 -0
  59. package/lib/built/generic-segment-mapper.js +190 -0
  60. package/lib/built/html-renderer-loader.d.ts +13 -0
  61. package/lib/built/html-renderer-loader.js +33 -0
  62. package/lib/built/html-segment-fallback.d.ts +2 -2
  63. package/lib/built/html-segment-fallback.js +0 -1
  64. package/lib/built/html-to-text.d.ts +0 -1
  65. package/lib/built/html-to-text.js +15 -15
  66. package/lib/built/inbound-pipeline.d.ts +37 -0
  67. package/lib/built/inbound-pipeline.js +63 -0
  68. package/lib/built/inbound-runner.d.ts +0 -1
  69. package/lib/built/inbound-runner.js +0 -3
  70. package/lib/built/interactive-segment-contract.d.ts +6 -0
  71. package/lib/built/interactive-segment-contract.js +9 -0
  72. package/lib/built/interactive-segments/action.d.ts +17 -0
  73. package/lib/built/interactive-segments/action.js +69 -0
  74. package/lib/built/interactive-segments/button-spec.d.ts +10 -0
  75. package/lib/built/interactive-segments/button-spec.js +21 -0
  76. package/lib/built/interactive-segments/fallback-store.d.ts +29 -0
  77. package/lib/built/interactive-segments/fallback-store.js +63 -0
  78. package/lib/built/interactive-segments/handlers.d.ts +16 -0
  79. package/lib/built/interactive-segments/handlers.js +74 -0
  80. package/lib/built/interactive-segments/index.d.ts +8 -0
  81. package/lib/built/interactive-segments/index.js +8 -0
  82. package/lib/built/interactive-segments/keyboard-segment.d.ts +11 -0
  83. package/lib/built/interactive-segments/keyboard-segment.js +12 -0
  84. package/lib/built/interactive-segments/onebot-keyboard.d.ts +7 -0
  85. package/lib/built/interactive-segments/onebot-keyboard.js +51 -0
  86. package/lib/built/interactive-segments/resolve.d.ts +15 -0
  87. package/lib/built/interactive-segments/resolve.js +110 -0
  88. package/lib/built/interactive-segments/types.d.ts +50 -0
  89. package/lib/built/interactive-segments/types.js +9 -0
  90. package/lib/built/introspection-format.d.ts +10 -0
  91. package/lib/built/introspection-format.js +28 -0
  92. package/lib/built/login-assist.d.ts +43 -9
  93. package/lib/built/login-assist.js +113 -11
  94. package/lib/built/management-command-guard.d.ts +15 -0
  95. package/lib/built/management-command-guard.js +25 -0
  96. package/lib/built/message-enrich.d.ts +38 -0
  97. package/lib/built/message-enrich.js +75 -0
  98. package/lib/built/message-filter.d.ts +4 -5
  99. package/lib/built/message-filter.js +5 -7
  100. package/lib/built/optional-peer-import.d.ts +3 -0
  101. package/lib/built/optional-peer-import.js +33 -0
  102. package/lib/built/outbound-media-contract.d.ts +22 -0
  103. package/lib/built/outbound-media-contract.js +10 -0
  104. package/lib/built/outbound-media-utils.d.ts +9 -0
  105. package/lib/built/outbound-media-utils.js +62 -0
  106. package/lib/built/permission.d.ts +3 -7
  107. package/lib/built/permission.js +39 -52
  108. package/lib/built/permit-check.d.ts +7 -0
  109. package/lib/built/permit-check.js +35 -0
  110. package/lib/built/permit-parse.d.ts +16 -0
  111. package/lib/built/permit-parse.js +32 -0
  112. package/lib/built/platform-permit.d.ts +20 -0
  113. package/lib/built/platform-permit.js +91 -0
  114. package/lib/built/queue-im-field-contract.d.ts +7 -2
  115. package/lib/built/queue-im-field-contract.js +13 -4
  116. package/lib/built/rich-segments/adapter-policies.d.ts +9 -0
  117. package/lib/built/rich-segments/adapter-policies.js +27 -0
  118. package/lib/built/rich-segments/base.d.ts +11 -0
  119. package/lib/built/rich-segments/base.js +24 -0
  120. package/lib/built/rich-segments/builtins.d.ts +4 -0
  121. package/lib/built/rich-segments/builtins.js +40 -0
  122. package/lib/built/rich-segments/capabilities.d.ts +6 -0
  123. package/lib/built/rich-segments/capabilities.js +38 -0
  124. package/lib/built/rich-segments/html-segment.d.ts +15 -0
  125. package/lib/built/rich-segments/html-segment.js +62 -0
  126. package/lib/built/rich-segments/index.d.ts +13 -0
  127. package/lib/built/rich-segments/index.js +13 -0
  128. package/lib/built/rich-segments/markdown-segment.d.ts +14 -0
  129. package/lib/built/rich-segments/markdown-segment.js +58 -0
  130. package/lib/built/rich-segments/markdown-to-text.d.ts +3 -0
  131. package/lib/built/rich-segments/markdown-to-text.js +27 -0
  132. package/lib/built/rich-segments/qrcode-segment.d.ts +18 -0
  133. package/lib/built/rich-segments/qrcode-segment.js +73 -0
  134. package/lib/built/rich-segments/registry.d.ts +16 -0
  135. package/lib/built/rich-segments/registry.js +52 -0
  136. package/lib/built/rich-segments/resolve.d.ts +5 -0
  137. package/lib/built/rich-segments/resolve.js +87 -0
  138. package/lib/built/rich-segments/tts-segment.d.ts +13 -0
  139. package/lib/built/rich-segments/tts-segment.js +51 -0
  140. package/lib/built/rich-segments/types.d.ts +79 -0
  141. package/lib/built/rich-segments/types.js +17 -0
  142. package/lib/built/roles.d.ts +4 -5
  143. package/lib/built/roles.js +4 -5
  144. package/lib/built/runtime-io.d.ts +0 -1
  145. package/lib/built/runtime-io.js +0 -1
  146. package/lib/built/schedule.d.ts +54 -0
  147. package/lib/built/schedule.js +112 -0
  148. package/lib/built/schema-endpoint-manager.d.ts +17 -0
  149. package/lib/built/schema-endpoint-manager.js +73 -0
  150. package/lib/built/schema-feature.d.ts +0 -1
  151. package/lib/built/schema-feature.js +1 -3
  152. package/lib/built/segment-contract/assert.d.ts +7 -0
  153. package/lib/built/segment-contract/assert.js +39 -0
  154. package/lib/built/segment-contract/delivery.d.ts +5 -0
  155. package/lib/built/segment-contract/delivery.js +40 -0
  156. package/lib/built/segment-contract/image.d.ts +5 -0
  157. package/lib/built/segment-contract/image.js +10 -0
  158. package/lib/built/segment-contract/index.d.ts +10 -0
  159. package/lib/built/segment-contract/index.js +9 -0
  160. package/lib/built/segment-contract/json-schema.d.ts +28 -0
  161. package/lib/built/segment-contract/json-schema.js +128 -0
  162. package/lib/built/segment-contract/media.d.ts +12 -0
  163. package/lib/built/segment-contract/media.js +22 -0
  164. package/lib/built/segment-contract/mention.d.ts +10 -0
  165. package/lib/built/segment-contract/mention.js +26 -0
  166. package/lib/built/segment-contract/preview.d.ts +3 -0
  167. package/lib/built/segment-contract/preview.js +159 -0
  168. package/lib/built/segment-contract/text.d.ts +7 -0
  169. package/lib/built/segment-contract/text.js +34 -0
  170. package/lib/built/segment-contract/types.d.ts +58 -0
  171. package/lib/built/segment-contract/types.js +1 -0
  172. package/lib/built/segment-contract/validate.d.ts +229 -0
  173. package/lib/built/segment-contract/validate.js +174 -0
  174. package/lib/built/skill.d.ts +0 -1
  175. package/lib/built/skill.js +0 -1
  176. package/lib/built/speech-loader.d.ts +14 -0
  177. package/lib/built/speech-loader.js +32 -0
  178. package/lib/built/tool.d.ts +14 -13
  179. package/lib/built/tool.js +30 -25
  180. package/lib/built/user-interaction.d.ts +30 -0
  181. package/lib/built/user-interaction.js +248 -0
  182. package/lib/command.d.ts +19 -11
  183. package/lib/command.js +42 -11
  184. package/lib/component.d.ts +0 -1
  185. package/lib/component.js +30 -14
  186. package/lib/endpoint-capabilities.d.ts +46 -0
  187. package/lib/endpoint-capabilities.js +55 -0
  188. package/lib/endpoint.d.ts +19 -0
  189. package/lib/endpoint.js +3 -0
  190. package/lib/errors.d.ts +2 -3
  191. package/lib/errors.js +4 -5
  192. package/lib/feature/adapter.d.ts +2 -0
  193. package/lib/feature/adapter.js +2 -0
  194. package/lib/feature/command.d.ts +2 -0
  195. package/lib/feature/command.js +2 -0
  196. package/lib/feature/component.d.ts +2 -0
  197. package/lib/feature/component.js +2 -0
  198. package/lib/feature/handler.d.ts +52 -0
  199. package/lib/feature/handler.js +26 -0
  200. package/lib/feature/middleware.d.ts +2 -0
  201. package/lib/feature/middleware.js +2 -0
  202. package/lib/host-plugin-registry.d.ts +8 -0
  203. package/lib/host-plugin-registry.js +12 -0
  204. package/lib/im-scene.d.ts +29 -0
  205. package/lib/im-scene.js +75 -0
  206. package/lib/im-session-id.d.ts +39 -0
  207. package/lib/im-session-id.js +47 -0
  208. package/lib/index.d.ts +59 -25
  209. package/lib/index.js +53 -31
  210. package/lib/jsx-dev-runtime.d.ts +0 -1
  211. package/lib/jsx-dev-runtime.js +0 -1
  212. package/lib/jsx-runtime.d.ts +1 -1
  213. package/lib/jsx-runtime.js +0 -1
  214. package/lib/jsx.d.ts +19 -22
  215. package/lib/jsx.js +0 -1
  216. package/lib/message.d.ts +16 -10
  217. package/lib/message.js +16 -13
  218. package/lib/models/system-log.d.ts +0 -1
  219. package/lib/models/system-log.js +0 -1
  220. package/lib/models/user.d.ts +0 -1
  221. package/lib/models/user.js +0 -1
  222. package/lib/notice.d.ts +16 -59
  223. package/lib/notice.js +1 -4
  224. package/lib/plugin-context.d.ts +27 -0
  225. package/lib/plugin-context.js +64 -0
  226. package/lib/plugin-runtime/im/contracts.d.ts +191 -0
  227. package/lib/plugin-runtime/im/contracts.js +169 -0
  228. package/lib/plugin-runtime/im/im-runtime.d.ts +177 -0
  229. package/lib/plugin-runtime/im/im-runtime.js +1204 -0
  230. package/lib/plugin-runtime/im/index.d.ts +9 -0
  231. package/lib/plugin-runtime/im/index.js +9 -0
  232. package/lib/plugin-runtime/im/interactive.d.ts +26 -0
  233. package/lib/plugin-runtime/im/interactive.js +46 -0
  234. package/lib/plugin-runtime/im/login-assist-host.d.ts +6 -0
  235. package/lib/plugin-runtime/im/login-assist-host.js +6 -0
  236. package/lib/plugin-runtime/im/message-bus.d.ts +38 -0
  237. package/lib/plugin-runtime/im/message-bus.js +40 -0
  238. package/lib/plugin-runtime/im/message-dispatcher.d.ts +18 -0
  239. package/lib/plugin-runtime/im/message-dispatcher.js +107 -0
  240. package/lib/plugin-runtime/im/outbound-renderer.d.ts +7 -0
  241. package/lib/plugin-runtime/im/outbound-renderer.js +70 -0
  242. package/lib/plugin-runtime/im/outbound-segments.d.ts +72 -0
  243. package/lib/plugin-runtime/im/outbound-segments.js +220 -0
  244. package/lib/plugin-runtime/im/public-api.d.ts +6 -0
  245. package/lib/plugin-runtime/im/public-api.js +6 -0
  246. package/lib/plugin-runtime/im/service-tokens.d.ts +18 -0
  247. package/lib/plugin-runtime/im/service-tokens.js +13 -0
  248. package/lib/plugin.d.ts +34 -24
  249. package/lib/plugin.js +119 -224
  250. package/lib/request.d.ts +17 -61
  251. package/lib/request.js +0 -4
  252. package/lib/{prompt.d.ts → schema-interaction.d.ts} +6 -7
  253. package/lib/{prompt.js → schema-interaction.js} +20 -17
  254. package/lib/side-event/base.d.ts +52 -0
  255. package/lib/side-event/base.js +30 -0
  256. package/lib/side-event/dispatch.d.ts +15 -0
  257. package/lib/side-event/dispatch.js +140 -0
  258. package/lib/side-event/index.d.ts +4 -0
  259. package/lib/side-event/index.js +4 -0
  260. package/lib/side-event/normalize.d.ts +42 -0
  261. package/lib/side-event/normalize.js +121 -0
  262. package/lib/side-event/types.d.ts +23 -0
  263. package/lib/side-event/types.js +55 -0
  264. package/lib/system-event.d.ts +15 -0
  265. package/lib/system-event.js +7 -0
  266. package/lib/tool-zod.d.ts +18 -3
  267. package/lib/tool-zod.js +140 -54
  268. package/lib/types.d.ts +44 -95
  269. package/lib/types.js +0 -1
  270. package/lib/utils.d.ts +61 -13
  271. package/lib/utils.js +66 -25
  272. package/package.json +98 -10
  273. package/lib/adapter.d.ts.map +0 -1
  274. package/lib/adapter.js.map +0 -1
  275. package/lib/agent-prompt.d.ts +0 -37
  276. package/lib/agent-prompt.d.ts.map +0 -1
  277. package/lib/agent-prompt.js +0 -2
  278. package/lib/agent-prompt.js.map +0 -1
  279. package/lib/bot.d.ts +0 -38
  280. package/lib/bot.d.ts.map +0 -1
  281. package/lib/bot.js +0 -2
  282. package/lib/bot.js.map +0 -1
  283. package/lib/built/adapter-process.d.ts.map +0 -1
  284. package/lib/built/adapter-process.js.map +0 -1
  285. package/lib/built/agent-preset.d.ts.map +0 -1
  286. package/lib/built/agent-preset.js.map +0 -1
  287. package/lib/built/ai-trigger.d.ts.map +0 -1
  288. package/lib/built/ai-trigger.js.map +0 -1
  289. package/lib/built/command.d.ts.map +0 -1
  290. package/lib/built/command.js.map +0 -1
  291. package/lib/built/common-adapter-tools.d.ts.map +0 -1
  292. package/lib/built/common-adapter-tools.js.map +0 -1
  293. package/lib/built/component.d.ts.map +0 -1
  294. package/lib/built/component.js.map +0 -1
  295. package/lib/built/config.d.ts.map +0 -1
  296. package/lib/built/config.js.map +0 -1
  297. package/lib/built/cron.d.ts +0 -75
  298. package/lib/built/cron.d.ts.map +0 -1
  299. package/lib/built/cron.js +0 -122
  300. package/lib/built/cron.js.map +0 -1
  301. package/lib/built/database.d.ts.map +0 -1
  302. package/lib/built/database.js.map +0 -1
  303. package/lib/built/dispatcher.d.ts.map +0 -1
  304. package/lib/built/dispatcher.js.map +0 -1
  305. package/lib/built/html-segment-fallback.d.ts.map +0 -1
  306. package/lib/built/html-segment-fallback.js.map +0 -1
  307. package/lib/built/html-to-text.d.ts.map +0 -1
  308. package/lib/built/html-to-text.js.map +0 -1
  309. package/lib/built/inbound-runner.d.ts.map +0 -1
  310. package/lib/built/inbound-runner.js.map +0 -1
  311. package/lib/built/login-assist.d.ts.map +0 -1
  312. package/lib/built/login-assist.js.map +0 -1
  313. package/lib/built/mcp-mesh-registrar.d.ts +0 -9
  314. package/lib/built/mcp-mesh-registrar.d.ts.map +0 -1
  315. package/lib/built/mcp-mesh-registrar.js +0 -17
  316. package/lib/built/mcp-mesh-registrar.js.map +0 -1
  317. package/lib/built/message-filter.d.ts.map +0 -1
  318. package/lib/built/message-filter.js.map +0 -1
  319. package/lib/built/permission.d.ts.map +0 -1
  320. package/lib/built/permission.js.map +0 -1
  321. package/lib/built/prepend-quote-context.d.ts +0 -35
  322. package/lib/built/prepend-quote-context.d.ts.map +0 -1
  323. package/lib/built/prepend-quote-context.js +0 -131
  324. package/lib/built/prepend-quote-context.js.map +0 -1
  325. package/lib/built/queue-im-field-contract.d.ts.map +0 -1
  326. package/lib/built/queue-im-field-contract.js.map +0 -1
  327. package/lib/built/roles.d.ts.map +0 -1
  328. package/lib/built/roles.js.map +0 -1
  329. package/lib/built/runtime-io.d.ts.map +0 -1
  330. package/lib/built/runtime-io.js.map +0 -1
  331. package/lib/built/schema-feature.d.ts.map +0 -1
  332. package/lib/built/schema-feature.js.map +0 -1
  333. package/lib/built/skill.d.ts.map +0 -1
  334. package/lib/built/skill.js.map +0 -1
  335. package/lib/built/tool.d.ts.map +0 -1
  336. package/lib/built/tool.js.map +0 -1
  337. package/lib/command.d.ts.map +0 -1
  338. package/lib/command.js.map +0 -1
  339. package/lib/component.d.ts.map +0 -1
  340. package/lib/component.js.map +0 -1
  341. package/lib/errors.d.ts.map +0 -1
  342. package/lib/errors.js.map +0 -1
  343. package/lib/index.d.ts.map +0 -1
  344. package/lib/index.js.map +0 -1
  345. package/lib/jsx-dev-runtime.d.ts.map +0 -1
  346. package/lib/jsx-dev-runtime.js.map +0 -1
  347. package/lib/jsx-runtime.d.ts.map +0 -1
  348. package/lib/jsx-runtime.js.map +0 -1
  349. package/lib/jsx.d.ts.map +0 -1
  350. package/lib/jsx.js.map +0 -1
  351. package/lib/message-quote.d.ts +0 -11
  352. package/lib/message-quote.d.ts.map +0 -1
  353. package/lib/message-quote.js +0 -91
  354. package/lib/message-quote.js.map +0 -1
  355. package/lib/message.d.ts.map +0 -1
  356. package/lib/message.js.map +0 -1
  357. package/lib/models/system-log.d.ts.map +0 -1
  358. package/lib/models/system-log.js.map +0 -1
  359. package/lib/models/user.d.ts.map +0 -1
  360. package/lib/models/user.js.map +0 -1
  361. package/lib/notice.d.ts.map +0 -1
  362. package/lib/notice.js.map +0 -1
  363. package/lib/plugin.d.ts.map +0 -1
  364. package/lib/plugin.js.map +0 -1
  365. package/lib/prompt.d.ts.map +0 -1
  366. package/lib/prompt.js.map +0 -1
  367. package/lib/request.d.ts.map +0 -1
  368. package/lib/request.js.map +0 -1
  369. package/lib/scheduler/scheduler.d.ts +0 -49
  370. package/lib/scheduler/scheduler.d.ts.map +0 -1
  371. package/lib/scheduler/scheduler.js +0 -352
  372. package/lib/scheduler/scheduler.js.map +0 -1
  373. package/lib/scheduler/types.d.ts +0 -71
  374. package/lib/scheduler/types.d.ts.map +0 -1
  375. package/lib/scheduler/types.js +0 -8
  376. package/lib/scheduler/types.js.map +0 -1
  377. package/lib/tool-zod.d.ts.map +0 -1
  378. package/lib/tool-zod.js.map +0 -1
  379. package/lib/types-generator.d.ts +0 -6
  380. package/lib/types-generator.d.ts.map +0 -1
  381. package/lib/types-generator.js +0 -72
  382. package/lib/types-generator.js.map +0 -1
  383. package/lib/types.d.ts.map +0 -1
  384. package/lib/types.js.map +0 -1
  385. package/lib/utils.d.ts.map +0 -1
  386. package/lib/utils.js.map +0 -1
@@ -1,24 +1,25 @@
1
1
  /**
2
- * Group Management — 方法规范与 Tool 工厂
2
+ * Scene Management — 方法规范与 Tool 工厂
3
3
  *
4
4
  * 设计理念:
5
- * 各 IM 平台在适配器内自行实现群管方法(kickMember、muteMember 等),
5
+ * 各 IM 平台在适配器内自行实现场景治理方法(removeMember、muteMember 等),
6
6
  * 并自行注册 Tool;平台说明使用包内 `skills/<adapter>/SKILL.md`。
7
7
  *
8
8
  * 使用方式(在各适配器 start 或注册方法中):
9
9
  *
10
- * import { createGroupManagementTools, GROUP_MANAGEMENT_SKILL_KEYWORDS, GROUP_MANAGEMENT_SKILL_TAGS } from 'zhin.js';
11
- * const tools = createGroupManagementTools(this, this.name);
10
+ * import { createSceneManagementTools, SCENE_MANAGEMENT_SKILL_KEYWORDS, SCENE_MANAGEMENT_SKILL_TAGS } from 'zhin.js';
11
+ * const tools = createSceneManagementTools(this, this.name);
12
12
  * tools.forEach(t => this.addTool(t));
13
13
  * // 另:包内 skills/<name>/SKILL.md 供 Agent 发现
14
14
  */
15
- export const GROUP_METHOD_SPECS = [
15
+ import { registerDefaultScenePlatformPermitChecker } from './platform-permit.js';
16
+ export const SCENE_MANAGEMENT_METHOD_SPECS = [
16
17
  {
17
- method: 'kickMember',
18
- toolSuffix: 'kick_member',
19
- description: '将成员踢出群/服务器。适用于严重违规、广告号等需要移除的场景。踢出后该成员将无法再进入群聊(部分平台可重新邀请)。如果只需要用户名而没有 user_id,请先调用 list_members 查询',
18
+ method: 'removeMember',
19
+ toolSuffix: 'remove_member',
20
+ description: '将成员移出当前 IM 场景。适用于严重违规、广告号等需要移除的场景。如果只需要用户名而没有 user_id,请先调用 list_members 查询',
20
21
  keywords: ['踢', 'kick', '移除', '踢出'],
21
- requiredAnyRole: ['group_admin'],
22
+ permit: 'scene_admin',
22
23
  extraParams: {
23
24
  user_id: { type: 'string', description: '目标用户 ID(如果只有昵称,先用 list_members 查询获取)' },
24
25
  },
@@ -29,7 +30,7 @@ export const GROUP_METHOD_SPECS = [
29
30
  toolSuffix: 'mute_member',
30
31
  description: '禁言或解除禁言群成员。适用于违规发言、刷屏、骚扰他人等需要临时限制发言的场景。duration 单位为秒,传 0 表示解除禁言。默认禁言 10 分钟(600秒)。如果只有昵称而没有 user_id,请先调用 list_members 查询',
31
32
  keywords: ['禁言', 'mute', '静音', '解除禁言', '解禁', '闭嘴'],
32
- requiredAnyRole: ['group_admin'],
33
+ permit: 'scene_admin',
33
34
  extraParams: {
34
35
  user_id: { type: 'string', description: '目标用户 ID(如果只有昵称,先用 list_members 查询获取)' },
35
36
  duration: { type: 'number', description: '禁言时长(秒),0=解除禁言,默认600(10分钟)。常用值:60=1分钟, 600=10分钟, 3600=1小时, 86400=1天', default: 600 },
@@ -41,7 +42,7 @@ export const GROUP_METHOD_SPECS = [
41
42
  toolSuffix: 'set_nickname',
42
43
  description: '设置群成员的群昵称/名片。仅修改群内显示名称,不影响用户的全局昵称。如果只有昵称而没有 user_id,请先调用 list_members 查询',
43
44
  keywords: ['昵称', '名片', 'nickname', 'card', '改名片'],
44
- requiredAnyRole: ['group_admin'],
45
+ permit: 'scene_admin',
45
46
  extraParams: {
46
47
  user_id: { type: 'string', description: '目标用户 ID(如果只有昵称,先用 list_members 查询获取)' },
47
48
  nickname: { type: 'string', description: '新的群昵称/名片' },
@@ -49,11 +50,11 @@ export const GROUP_METHOD_SPECS = [
49
50
  extraRequired: ['user_id', 'nickname'],
50
51
  },
51
52
  {
52
- method: 'setAdmin',
53
- toolSuffix: 'set_admin',
54
- description: '设置或取消群管理员。注意:此操作需要群主权限,普通管理员无法执行。enable=true 为设置管理员,enable=false 为取消管理员。如果只有昵称而没有 user_id,请先调用 list_members 查询',
53
+ method: 'setModerator',
54
+ toolSuffix: 'set_moderator',
55
+ description: '设置或取消场景管理员。注意:此操作通常需要场景所有者权限。enable=true 为设置管理员,enable=false 为取消管理员。如果只有昵称而没有 user_id,请先调用 list_members 查询',
55
56
  keywords: ['管理员', 'admin', '设置管理', '取消管理', '提升管理', '撤销管理'],
56
- requiredAnyRole: ['group_owner'],
57
+ permit: 'scene_owner',
57
58
  extraParams: {
58
59
  user_id: { type: 'string', description: '目标用户 ID(如果只有昵称,先用 list_members 查询获取)' },
59
60
  enable: { type: 'boolean', description: 'true=设置为管理员,false=取消管理员身份', default: true },
@@ -73,7 +74,7 @@ export const GROUP_METHOD_SPECS = [
73
74
  toolSuffix: 'ban_member',
74
75
  description: '永久封禁成员(拉入黑名单)。与踢人(kick)不同,封禁后该成员无法再加入群聊。适用于恶意用户、严重违规等需要永久禁止的场景。如果只有昵称而没有 user_id,请先调用 list_members 查询',
75
76
  keywords: ['封禁', 'ban', '拉黑', '黑名单'],
76
- requiredAnyRole: ['group_admin'],
77
+ permit: 'scene_admin',
77
78
  extraParams: {
78
79
  user_id: { type: 'string', description: '目标用户 ID(如果只有昵称,先用 list_members 查询获取)' },
79
80
  reason: { type: 'string', description: '封禁原因(将记录在封禁日志中)' },
@@ -85,37 +86,37 @@ export const GROUP_METHOD_SPECS = [
85
86
  toolSuffix: 'unban_member',
86
87
  description: '解除封禁,将成员从黑名单中移除。解除后该成员可以重新加入群聊。如果只有昵称而没有 user_id,请先调用 list_members 查询',
87
88
  keywords: ['解封', 'unban', '解除封禁', '移出黑名单'],
88
- requiredAnyRole: ['group_admin'],
89
+ permit: 'scene_admin',
89
90
  extraParams: {
90
91
  user_id: { type: 'string', description: '目标用户 ID(如果只有昵称,先用 list_members 查询获取)' },
91
92
  },
92
93
  extraRequired: ['user_id'],
93
94
  },
94
95
  {
95
- method: 'setGroupName',
96
- toolSuffix: 'set_group_name',
97
- description: '修改群/服务器名称。修改后所有成员立即可见新群名',
96
+ method: 'renameScene',
97
+ toolSuffix: 'rename_scene',
98
+ description: '修改 IM 场景名称。修改后所有成员立即可见新名称',
98
99
  keywords: ['群名', '改名', 'group name', '修改群名'],
99
- requiredAnyRole: ['group_admin'],
100
+ permit: 'scene_admin',
100
101
  extraParams: {
101
102
  name: { type: 'string', description: '新群名称' },
102
103
  },
103
104
  extraRequired: ['name'],
104
105
  },
105
106
  {
106
- method: 'muteAll',
107
- toolSuffix: 'mute_all',
108
- description: '开启或关闭全员禁言。开启后除管理员外所有成员都无法发言。适用于紧急维护、重要通知、聊天秩序混乱等场景。enable=true 开启,enable=false 解除',
107
+ method: 'setSceneMuted',
108
+ toolSuffix: 'set_scene_muted',
109
+ description: '开启或关闭场景全员禁言。开启后除管理员外所有成员都无法发言。适用于紧急维护、重要通知、聊天秩序混乱等场景。enable=true 开启,enable=false 解除',
109
110
  keywords: ['全员禁言', 'mute all', '全体禁言', '全体解禁'],
110
- requiredAnyRole: ['group_admin'],
111
+ permit: 'scene_admin',
111
112
  extraParams: {
112
113
  enable: { type: 'boolean', description: 'true=开启全员禁言,false=解除全员禁言', default: true },
113
114
  },
114
115
  },
115
116
  {
116
- method: 'getGroupInfo',
117
- toolSuffix: 'get_group_info',
118
- description: '获取群/服务器基本信息,包括群名、群主、成员数量、创建时间等。用于了解群聊概况',
117
+ method: 'getSceneInfo',
118
+ toolSuffix: 'get_scene_info',
119
+ description: '获取 IM 场景基本信息,包括名称、所有者、成员数量、创建时间等。用于了解场景概况',
119
120
  keywords: ['群信息', 'group info', '群资料', '群详情'],
120
121
  extraParams: {},
121
122
  preExecutable: true,
@@ -124,42 +125,58 @@ export const GROUP_METHOD_SPECS = [
124
125
  // ============================================================================
125
126
  // Skill 常量(群管相关 SKILL.md 与文档可复用 keywords/tags)
126
127
  // ============================================================================
127
- export const GROUP_MANAGEMENT_SKILL_TAGS = ['group', 'management', 'im', 'admin'];
128
- export const GROUP_MANAGEMENT_SKILL_KEYWORDS = [
129
- '群管理', '踢人', '禁言', '封禁', '管理员', '群名',
128
+ export const SCENE_MANAGEMENT_SKILL_TAGS = ['scene', 'management', 'im', 'admin'];
129
+ export const SCENE_MANAGEMENT_SKILL_KEYWORDS = [
130
+ '场景治理', '群管理', '踢人', '禁言', '封禁', '管理员', '群名',
130
131
  '成员', 'kick', 'mute', 'ban', 'admin', 'members',
131
132
  ];
132
- export function createGroupManagementTools(adapter, prefix) {
133
- return createGroupManagementToolsRaw(adapter, prefix, (spec, prefix, execute) => ({
134
- name: `${prefix}_${spec.toolSuffix}`,
135
- description: `${spec.description} (${prefix})`,
136
- parameters: {
137
- type: 'object',
138
- properties: {
139
- bot_id: { type: 'string', description: 'Bot ID', contextKey: 'botId' },
140
- scene_id: { type: 'string', description: '群/服务器 ID', contextKey: 'sceneId' },
141
- ...Object.fromEntries(Object.entries(spec.extraParams)),
133
+ export function defaultScenePermitResolver(adapterPrefix) {
134
+ return (logicalPerm) => `platform(${adapterPrefix},${logicalPerm})`;
135
+ }
136
+ function resolveSpecPermit(specPerm, prefix, permitResolver) {
137
+ if (!specPerm)
138
+ return undefined;
139
+ const resolved = permitResolver(specPerm);
140
+ return resolved ? [resolved] : undefined;
141
+ }
142
+ export function createSceneManagementTools(adapter, prefix, options = {}) {
143
+ const permitResolver = options.permitResolver ?? defaultScenePermitResolver(prefix);
144
+ if (options.registerChecker !== false) {
145
+ registerDefaultScenePlatformPermitChecker(prefix);
146
+ }
147
+ return createSceneManagementToolsRaw(adapter, prefix, (spec, prefix, execute) => {
148
+ const specPermissions = resolveSpecPermit(spec.permit, prefix, permitResolver);
149
+ return {
150
+ name: `${prefix}_${spec.toolSuffix}`,
151
+ description: `${spec.description} (${prefix})`,
152
+ parameters: {
153
+ type: 'object',
154
+ properties: {
155
+ endpoint_id: { type: 'string', description: 'Endpoint ID', contextKey: 'endpointKey' },
156
+ scene_id: { type: 'string', description: 'IM 场景 ID', contextKey: 'sceneId' },
157
+ ...Object.fromEntries(Object.entries(spec.extraParams)),
158
+ },
159
+ required: ['endpoint_id', 'scene_id', ...(spec.extraRequired ?? [])],
142
160
  },
143
- required: ['bot_id', 'scene_id', ...(spec.extraRequired ?? [])],
144
- },
145
- execute,
146
- tags: ['group', 'management', prefix],
147
- keywords: spec.keywords,
148
- ...(spec.requiredAnyRole?.length ? { requiredAnyRole: spec.requiredAnyRole } : {}),
149
- scopes: ['group', 'channel'],
150
- preExecutable: spec.preExecutable,
151
- }));
161
+ execute,
162
+ tags: ['scene', 'management', prefix],
163
+ keywords: spec.keywords,
164
+ ...(specPermissions ? { permissions: specPermissions } : {}),
165
+ scopes: ['group', 'channel'],
166
+ preExecutable: spec.preExecutable,
167
+ };
168
+ });
152
169
  }
153
- export function createGroupManagementToolsRaw(adapter, prefix, factory) {
170
+ export function createSceneManagementToolsRaw(adapter, prefix, factory) {
154
171
  const tools = [];
155
- for (const spec of GROUP_METHOD_SPECS) {
172
+ for (const spec of SCENE_MANAGEMENT_METHOD_SPECS) {
156
173
  const fn = adapter[spec.method];
157
174
  if (typeof fn !== 'function')
158
175
  continue;
159
176
  const boundFn = fn.bind(adapter);
160
177
  const execute = async (args) => {
161
- const { bot_id, scene_id, ...rest } = args;
162
- const methodArgs = buildMethodArgs(spec.method, bot_id, scene_id, rest);
178
+ const { endpoint_id, scene_id, ...rest } = args;
179
+ const methodArgs = buildSceneMethodArgs(spec.method, endpoint_id, scene_id, rest);
163
180
  return boundFn.apply(adapter, methodArgs);
164
181
  };
165
182
  tools.push(factory(spec, prefix, execute));
@@ -169,19 +186,18 @@ export function createGroupManagementToolsRaw(adapter, prefix, factory) {
169
186
  // ============================================================================
170
187
  // 参数映射(method → 有序参数列表)
171
188
  // ============================================================================
172
- export function buildMethodArgs(method, botId, sceneId, rest) {
189
+ export function buildSceneMethodArgs(method, endpointKey, sceneId, rest) {
173
190
  switch (method) {
174
- case 'kickMember': return [botId, sceneId, rest.user_id];
175
- case 'muteMember': return [botId, sceneId, rest.user_id, rest.duration ?? 600];
176
- case 'setMemberNickname': return [botId, sceneId, rest.user_id, rest.nickname];
177
- case 'setAdmin': return [botId, sceneId, rest.user_id, rest.enable ?? true];
178
- case 'listMembers': return [botId, sceneId];
179
- case 'banMember': return [botId, sceneId, rest.user_id, rest.reason];
180
- case 'unbanMember': return [botId, sceneId, rest.user_id];
181
- case 'setGroupName': return [botId, sceneId, rest.name];
182
- case 'muteAll': return [botId, sceneId, rest.enable ?? true];
183
- case 'getGroupInfo': return [botId, sceneId];
184
- default: return [botId, sceneId, ...Object.values(rest)];
191
+ case 'removeMember': return [endpointKey, sceneId, rest.user_id];
192
+ case 'muteMember': return [endpointKey, sceneId, rest.user_id, rest.duration ?? 600];
193
+ case 'setMemberNickname': return [endpointKey, sceneId, rest.user_id, rest.nickname];
194
+ case 'setModerator': return [endpointKey, sceneId, rest.user_id, rest.enable ?? true];
195
+ case 'listMembers': return [endpointKey, sceneId];
196
+ case 'banMember': return [endpointKey, sceneId, rest.user_id, rest.reason];
197
+ case 'unbanMember': return [endpointKey, sceneId, rest.user_id];
198
+ case 'renameScene': return [endpointKey, sceneId, rest.name];
199
+ case 'setSceneMuted': return [endpointKey, sceneId, rest.enable ?? true];
200
+ case 'getSceneInfo': return [endpointKey, sceneId];
201
+ default: return [endpointKey, sceneId, ...Object.values(rest)];
185
202
  }
186
203
  }
187
- //# sourceMappingURL=common-adapter-tools.js.map
@@ -2,9 +2,8 @@
2
2
  * ComponentFeature
3
3
  * 管理所有插件注册的组件,继承自 Feature 抽象类
4
4
  */
5
- import { Feature, FeatureJSON } from "@zhin.js/kernel";
5
+ import { Feature, FeatureJSON, type PluginLike } from '@zhin.js/kernel';
6
6
  import { Component } from "../component.js";
7
- import type { PluginLike } from '@zhin.js/kernel';
8
7
  /**
9
8
  * ComponentContext 扩展方法类型
10
9
  */
@@ -66,4 +65,3 @@ export declare class ComponentFeature extends Feature<Component<any>> {
66
65
  addComponent<T extends Component<any>>(component: T): () => void;
67
66
  };
68
67
  }
69
- //# sourceMappingURL=component.d.ts.map
@@ -2,9 +2,8 @@
2
2
  * ComponentFeature
3
3
  * 管理所有插件注册的组件,继承自 Feature 抽象类
4
4
  */
5
- import { Feature } from "@zhin.js/kernel";
5
+ import { Feature } from '@zhin.js/kernel';
6
6
  import { renderComponents } from "../component.js";
7
- import { getPlugin } from "../plugin.js";
8
7
  /**
9
8
  * 组件服务 Feature
10
9
  */
@@ -87,7 +86,7 @@ export class ComponentFeature extends Feature {
87
86
  const feature = this;
88
87
  return {
89
88
  addComponent(component) {
90
- const plugin = getPlugin();
89
+ const plugin = this;
91
90
  const dispose = feature.add(component, plugin.name);
92
91
  plugin.recordFeatureContribution(feature.name, component.name);
93
92
  plugin.onDispose(dispose);
@@ -96,4 +95,3 @@ export class ComponentFeature extends Feature {
96
95
  };
97
96
  }
98
97
  }
99
- //# sourceMappingURL=component.js.map
@@ -10,6 +10,8 @@ export declare class ConfigLoader<T extends object> {
10
10
  get data(): T;
11
11
  get raw(): T;
12
12
  get extension(): string;
13
+ /** `load()` / `patchKey()` 使用的绝对路径 */
14
+ get resolvedPath(): string;
13
15
  constructor(filename: string, initial: T, schema?: Schema<T> | undefined);
14
16
  resolvePath(baseDir?: string): string;
15
17
  load(baseDir?: string): void;
@@ -20,6 +22,8 @@ export declare class ConfigLoader<T extends object> {
20
22
  */
21
23
  patchKey(key: string, value: any): void;
22
24
  }
25
+ /** 解析 endpoint 配置中的 `${ENV}` 引用(运行时 add 后热连接用) */
26
+ export declare function resolveEndpointConfigEnv(config: Record<string, unknown>): Record<string, unknown>;
23
27
  export declare function mergeConfigDefaults<T>(defaults: T, overrides: unknown): T;
24
28
  export declare namespace ConfigLoader {
25
29
  const supportedExtensions: string[];
@@ -92,8 +96,3 @@ export declare class ConfigFeature extends Feature<ConfigRecord> {
92
96
  addConfig(key: string, defaultValue: any): () => void;
93
97
  };
94
98
  }
95
- /**
96
- * @deprecated Use ConfigFeature instead
97
- */
98
- export declare const ConfigService: typeof ConfigFeature;
99
- //# sourceMappingURL=config.d.ts.map
@@ -8,7 +8,6 @@ import fs from "node:fs";
8
8
  import { stringify as stringifyYaml, parse as parseYaml, parseDocument } from "yaml";
9
9
  import { parse as parseToml, stringify as stringifyToml } from "smol-toml";
10
10
  import { Feature } from "@zhin.js/kernel";
11
- import { getPlugin } from "../plugin.js";
12
11
  /** Deno / Node 统一的工作目录(`Deno.chdir` 后应与 `process.cwd()` 一致) */
13
12
  export function runtimeCwd() {
14
13
  const g = globalThis;
@@ -37,6 +36,10 @@ export class ConfigLoader {
37
36
  get extension() {
38
37
  return path.extname(this.filename).toLowerCase();
39
38
  }
39
+ /** `load()` / `patchKey()` 使用的绝对路径 */
40
+ get resolvedPath() {
41
+ return this.#resolvedPath || this.resolvePath();
42
+ }
40
43
  constructor(filename, initial, schema) {
41
44
  this.filename = filename;
42
45
  this.initial = initial;
@@ -96,8 +99,10 @@ export class ConfigLoader {
96
99
  ? this.filename
97
100
  : path.resolve(baseDir, this.filename);
98
101
  }
99
- load(baseDir = runtimeCwd()) {
100
- const fullPath = this.resolvePath(baseDir);
102
+ load(baseDir) {
103
+ const fullPath = baseDir !== undefined
104
+ ? this.resolvePath(baseDir)
105
+ : (this.#resolvedPath || this.resolvePath());
101
106
  this.#resolvedPath = fullPath;
102
107
  if (!fs.existsSync(fullPath)) {
103
108
  try {
@@ -197,6 +202,23 @@ function isPlainObject(value) {
197
202
  && !Array.isArray(value)
198
203
  && Object.getPrototypeOf(value) === Object.prototype;
199
204
  }
205
+ /** 解析 endpoint 配置中的 `${ENV}` 引用(运行时 add 后热连接用) */
206
+ export function resolveEndpointConfigEnv(config) {
207
+ const out = { ...config };
208
+ for (const [key, value] of Object.entries(out)) {
209
+ if (typeof value !== 'string')
210
+ continue;
211
+ const match = value.match(/^\$\{([^}]+)\}$/);
212
+ if (!match)
213
+ continue;
214
+ const envKey = match[1];
215
+ const resolved = envLookup(envKey);
216
+ if (resolved != null && resolved !== '') {
217
+ out[key] = resolved;
218
+ }
219
+ }
220
+ return out;
221
+ }
200
222
  export function mergeConfigDefaults(defaults, overrides) {
201
223
  if (Array.isArray(defaults)) {
202
224
  return (Array.isArray(overrides) ? overrides : defaults);
@@ -327,7 +349,7 @@ export class ConfigFeature extends Feature {
327
349
  const feature = this;
328
350
  return {
329
351
  addConfig(key, defaultValue) {
330
- const plugin = getPlugin();
352
+ const plugin = this;
331
353
  // 尝试写入主配置文件(如果 key 不存在)
332
354
  if (feature.#primaryConfigFile) {
333
355
  const config = feature.configs.get(feature.#primaryConfigFile);
@@ -348,8 +370,3 @@ export class ConfigFeature extends Feature {
348
370
  };
349
371
  }
350
372
  }
351
- /**
352
- * @deprecated Use ConfigFeature instead
353
- */
354
- export const ConfigService = ConfigFeature;
355
- //# sourceMappingURL=config.js.map
@@ -0,0 +1,17 @@
1
+ import type { Adapter } from '../adapter.js';
2
+ import type { Endpoint } from '../endpoint.js';
3
+ import type { Plugin } from '../plugin.js';
4
+ import { type EndpointCapabilitiesConfig } from '../endpoint-capabilities.js';
5
+ export interface ConnectEndpointInstanceOptions {
6
+ plugin: Plugin;
7
+ adapter: Adapter;
8
+ config: EndpointCapabilitiesConfig & Record<string, unknown>;
9
+ }
10
+ /**
11
+ * 按 Endpoint capabilities 连接或注册单个实例(connectEndpoints 与 Adapter.start 共用)。
12
+ */
13
+ export declare function connectEndpointInstance(options: ConnectEndpointInstanceOptions): Promise<Endpoint>;
14
+ /**
15
+ * 按 Endpoint capabilities 断开单个实例。
16
+ */
17
+ export declare function disconnectEndpointInstance(plugin: Plugin, adapter: Adapter, endpoint: Endpoint): Promise<void>;
@@ -0,0 +1,42 @@
1
+ import { assertInbound, getAdapterCapabilities, hasInbound, registerEndpointCapabilities, resolveEndpointCapabilities, } from '../endpoint-capabilities.js';
2
+ import { emitEndpointLifecycle } from './endpoint-lifecycle.js';
3
+ import { resolveEndpointConfigEnv } from './config.js';
4
+ /**
5
+ * 按 Endpoint capabilities 连接或注册单个实例(connectEndpoints 与 Adapter.start 共用)。
6
+ */
7
+ export async function connectEndpointInstance(options) {
8
+ const { plugin, adapter, config } = options;
9
+ const adapterCaps = getAdapterCapabilities(adapter);
10
+ const caps = resolveEndpointCapabilities(adapterCaps, config.capabilities);
11
+ const resolvedConfig = resolveEndpointConfigEnv(config);
12
+ const endpoint = adapter.createEndpoint(resolvedConfig);
13
+ registerEndpointCapabilities(endpoint, caps);
14
+ if (caps.includes('inbound')) {
15
+ assertInbound(endpoint);
16
+ try {
17
+ await endpoint.$connect();
18
+ await emitEndpointLifecycle(plugin, adapter, endpoint, 'connect');
19
+ }
20
+ catch (error) {
21
+ await emitEndpointLifecycle(plugin, adapter, endpoint, 'error', {
22
+ error: error instanceof Error ? error.message : String(error),
23
+ phase: 'connect',
24
+ });
25
+ throw error;
26
+ }
27
+ }
28
+ else {
29
+ endpoint.$connected = true;
30
+ }
31
+ return endpoint;
32
+ }
33
+ /**
34
+ * 按 Endpoint capabilities 断开单个实例。
35
+ */
36
+ export async function disconnectEndpointInstance(plugin, adapter, endpoint) {
37
+ if (!hasInbound(endpoint))
38
+ return;
39
+ assertInbound(endpoint);
40
+ await endpoint.$disconnect();
41
+ await emitEndpointLifecycle(plugin, adapter, endpoint, 'disconnect');
42
+ }
@@ -4,8 +4,7 @@
4
4
  */
5
5
  import { Definition, Database } from "@zhin.js/database";
6
6
  import { DatabaseConfig, Models } from "../types.js";
7
- import { Feature, FeatureJSON } from "@zhin.js/kernel";
8
- import type { PluginLike } from '@zhin.js/kernel';
7
+ import { Feature, FeatureJSON, type PluginLike } from '@zhin.js/kernel';
9
8
  /**
10
9
  * 模型定义记录
11
10
  */
@@ -23,6 +22,9 @@ declare module "../plugin.js" {
23
22
  }
24
23
  }
25
24
  }
25
+ type DatabaseAfterStartHook = (db: Database<any, Models, any>) => void | Promise<void>;
26
+ /** 在 `db.start()` 完成之后、`context.mounted` 发出之前执行(用于 schema 迁移) */
27
+ export declare function onDatabaseAfterStart(hook: DatabaseAfterStartHook): void;
26
28
  export declare class DatabaseFeature extends Feature<ModelRecord> {
27
29
  readonly name: "database";
28
30
  readonly icon = "Database";
@@ -63,4 +65,4 @@ export declare class DatabaseFeature extends Feature<ModelRecord> {
63
65
  defineModel<K extends keyof Models>(name: K, definition: Definition<Models[K]>): void;
64
66
  };
65
67
  }
66
- //# sourceMappingURL=database.d.ts.map
68
+ export {};
@@ -4,10 +4,14 @@
4
4
  */
5
5
  import { Registry } from "@zhin.js/database";
6
6
  import { formatCompact } from '@zhin.js/logger';
7
- import { Feature } from "@zhin.js/kernel";
8
- import { getPlugin } from "../plugin.js";
7
+ import { Feature } from '@zhin.js/kernel';
9
8
  import { SystemLogDefinition } from "../models/system-log.js";
10
9
  import { UserDefinition } from "../models/user.js";
10
+ const databaseAfterStartHooks = [];
11
+ /** 在 `db.start()` 完成之后、`context.mounted` 发出之前执行(用于 schema 迁移) */
12
+ export function onDatabaseAfterStart(hook) {
13
+ databaseAfterStartHooks.push(hook);
14
+ }
11
15
  export class DatabaseFeature extends Feature {
12
16
  name = 'database';
13
17
  icon = 'Database';
@@ -59,6 +63,9 @@ export class DatabaseFeature extends Feature {
59
63
  async mounted(plugin) {
60
64
  plugin.logger.debug(formatCompact({ ready: true }));
61
65
  await this.db.start();
66
+ for (const hook of databaseAfterStartHooks) {
67
+ await hook(this.db);
68
+ }
62
69
  }
63
70
  /**
64
71
  * 生命周期: 停止数据库
@@ -88,7 +95,7 @@ export class DatabaseFeature extends Feature {
88
95
  const feature = this;
89
96
  return {
90
97
  defineModel(name, definition) {
91
- const plugin = getPlugin();
98
+ const plugin = this;
92
99
  const record = { name: name, definition };
93
100
  const dispose = feature.add(record, plugin.name);
94
101
  plugin.recordFeatureContribution(feature.name, name);
@@ -97,4 +104,3 @@ export class DatabaseFeature extends Feature {
97
104
  };
98
105
  }
99
106
  }
100
- //# sourceMappingURL=database.js.map
@@ -27,12 +27,10 @@
27
27
  * 默认路由为 exclusive(命令与 AI 互斥);需双轨时请显式 dualRoute.mode: 'dual'。
28
28
  */
29
29
  import { Message } from '../message.js';
30
- import type { MessageMiddleware, RegisteredAdapter, MaybePromise, SendContent, OutboundReplySource, OutboundPolishMiddleware } from '../types.js';
31
- import type { Context } from '../plugin.js';
32
- export declare function getOutboundReplyStore(): {
33
- message: Message<any>;
34
- source: OutboundReplySource;
35
- } | undefined;
30
+ import { type Context } from '../plugin.js';
31
+ import { type PermissionHost } from '@zhin.js/permission';
32
+ import type { MessageMiddleware, RegisteredAdapter, MaybePromise, SendContent, OutboundReplySource, OutboundPolishMiddleware, OutboundReplyStore } from '../types.js';
33
+ export declare function getOutboundReplyStore(): OutboundReplyStore | undefined;
36
34
  /**
37
35
  * 路由判定结果(互斥模式 legacy)
38
36
  */
@@ -82,7 +80,7 @@ export type AITriggerMatcher = (message: Message<any>) => {
82
80
  */
83
81
  export type GroupPassiveContextHandler = (message: Message<any>) => MaybePromise<void>;
84
82
  export type GuardrailMiddleware = MessageMiddleware<RegisteredAdapter>;
85
- /** @alias OutboundReplySource:出站回复来源(指令 / AI */
83
+ /** Backward-compatible name for the command or AI outbound reply source. */
86
84
  export type ReplySource = OutboundReplySource;
87
85
  /** replyWithPolish 可选参数 */
88
86
  export interface ReplyWithPolishOptions {
@@ -91,6 +89,7 @@ export interface ReplyWithPolishOptions {
91
89
  }
92
90
  export interface CreateMessageDispatcherOptions {
93
91
  dualRoute?: Partial<DualRouteConfig>;
92
+ permissionHost?: PermissionHost | null;
94
93
  }
95
94
  export interface MessageDispatcherService {
96
95
  dispatch(message: Message<any>): Promise<void>;
@@ -110,6 +109,10 @@ export interface MessageDispatcherService {
110
109
  * 在 `before.sendMessage` 管道内调用 `message.$reply`(与 Adapter#sendMessage 同一出站链)
111
110
  */
112
111
  replyWithPolish(message: Message<any>, source: ReplySource, content: SendContent, options?: ReplyWithPolishOptions): Promise<unknown>;
112
+ /** Proactive 出站:在 ALS 内执行 send,触发 outbound polish / before.sendMessage */
113
+ runWithOutboundPolish<T>(store: Pick<OutboundReplyStore, 'message' | 'trigger' | 'proactiveSource'> & {
114
+ source?: OutboundReplySource;
115
+ }, fn: () => Promise<T>): Promise<T>;
113
116
  /**
114
117
  * 是否匹配为指令路径(与 dispatch 内判定一致)
115
118
  */
@@ -136,4 +139,3 @@ declare module '../plugin.js' {
136
139
  }
137
140
  }
138
141
  export declare function createMessageDispatcher(options?: CreateMessageDispatcherOptions): Context<'dispatcher', DispatcherContextExtensions>;
139
- //# sourceMappingURL=dispatcher.d.ts.map