@zaofan/dsh-qqbot 1.8.6 → 1.9.2

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 (76) hide show
  1. package/README.md +114 -27
  2. package/README_EN.md +122 -8
  3. package/dist/features/ext-capabilities.d.ts +85 -0
  4. package/dist/features/ext-capabilities.d.ts.map +1 -1
  5. package/dist/features/ext-capabilities.js +4 -0
  6. package/dist/features/ext-capabilities.js.map +1 -1
  7. package/dist/features/ext-hooks.d.ts +84 -0
  8. package/dist/features/ext-hooks.d.ts.map +1 -0
  9. package/dist/features/ext-hooks.js +299 -0
  10. package/dist/features/ext-hooks.js.map +1 -0
  11. package/dist/features/ext-inbound-context.d.ts +202 -0
  12. package/dist/features/ext-inbound-context.d.ts.map +1 -0
  13. package/dist/features/ext-inbound-context.js +724 -0
  14. package/dist/features/ext-inbound-context.js.map +1 -0
  15. package/dist/features/ext-inbound-state.d.ts +153 -0
  16. package/dist/features/ext-inbound-state.d.ts.map +1 -0
  17. package/dist/features/ext-inbound-state.js +419 -0
  18. package/dist/features/ext-inbound-state.js.map +1 -0
  19. package/dist/features/ext-inbound.d.ts +117 -0
  20. package/dist/features/ext-inbound.d.ts.map +1 -0
  21. package/dist/features/ext-inbound.js +518 -0
  22. package/dist/features/ext-inbound.js.map +1 -0
  23. package/dist/features/ext-reload.d.ts +22 -0
  24. package/dist/features/ext-reload.d.ts.map +1 -1
  25. package/dist/features/ext-reload.js +32 -0
  26. package/dist/features/ext-reload.js.map +1 -1
  27. package/dist/features/extension-store.d.ts +13 -0
  28. package/dist/features/extension-store.d.ts.map +1 -1
  29. package/dist/features/extension-store.js +76 -18
  30. package/dist/features/extension-store.js.map +1 -1
  31. package/dist/gateway/bootstrap.d.ts +14 -1
  32. package/dist/gateway/bootstrap.d.ts.map +1 -1
  33. package/dist/gateway/bootstrap.js +61 -2
  34. package/dist/gateway/bootstrap.js.map +1 -1
  35. package/dist/gateway/debounce.d.ts +43 -1
  36. package/dist/gateway/debounce.d.ts.map +1 -1
  37. package/dist/gateway/debounce.js +71 -35
  38. package/dist/gateway/debounce.js.map +1 -1
  39. package/dist/gateway/middleware-setup.d.ts.map +1 -1
  40. package/dist/gateway/middleware-setup.js +88 -1
  41. package/dist/gateway/middleware-setup.js.map +1 -1
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +49 -9
  44. package/dist/index.js.map +1 -1
  45. package/dist/session/session-manager.d.ts.map +1 -1
  46. package/dist/session/session-manager.js +7 -3
  47. package/dist/session/session-manager.js.map +1 -1
  48. package/dist/session/surface-guard.d.ts +1 -1
  49. package/dist/shared/index.d.ts +1 -1
  50. package/dist/shared/index.d.ts.map +1 -1
  51. package/dist/shared/index.js +1 -1
  52. package/dist/shared/index.js.map +1 -1
  53. package/dist/shared/utils.d.ts +40 -0
  54. package/dist/shared/utils.d.ts.map +1 -1
  55. package/dist/shared/utils.js +59 -2
  56. package/dist/shared/utils.js.map +1 -1
  57. package/dist/transport/inbound.d.ts.map +1 -1
  58. package/dist/transport/inbound.js +23 -3
  59. package/dist/transport/inbound.js.map +1 -1
  60. package/docs/USER-GUIDE.md +93 -36
  61. package/docs/botplay-contract.md +2 -0
  62. package/examples/ext-hooks/README.md +95 -0
  63. package/examples/ext-hooks/hello-hook.mjs +54 -0
  64. package/examples/ext-hooks/session-watch-hook.mjs +119 -0
  65. package/examples/ext-inbound/README.md +230 -0
  66. package/examples/ext-inbound/class-advisor.mjs +306 -0
  67. package/examples/ext-inbound/no-wake-on-child-quote.mjs +192 -0
  68. package/examples/ext-tools/README.md +22 -0
  69. package/examples/ext-tools/lib/preset_resolve.mjs +85 -0
  70. package/examples/ext-tools/lib/session_watch_lib.mjs +350 -0
  71. package/examples/ext-tools/session_create.mjs +201 -0
  72. package/examples/ext-tools/session_send.mjs +141 -0
  73. package/examples/ext-tools/session_watch.mjs +93 -0
  74. package/examples/ext-tools/sessions_list.mjs +180 -0
  75. package/package.json +141 -141
  76. package/settings-host.js +22 -5
package/README.md CHANGED
@@ -44,7 +44,7 @@ QQ 官方**没有开放踢人接口**,所以这一块走"你自己的 QQ 号 +
44
44
  **🔝 QQ 一有动静,她的会话自己爬到最上面**(v1.6.8)
45
45
  侧边栏里正在跟你聊的那个会话,不该被别的压着 —— QQ 里一有消息、她**真的回了话**,对应会话就会自动插到「**还热着**」的那批之后(10 分钟内聊过的算热,**置顶的永不动**),冷掉的会话自然被它越过。全程事件驱动、不轮询;宿主没起来、或聊天页没开着时天然不排序。
46
46
 
47
- ![侧边栏会话自动重排:刚聊过的「鲸鱼娘舒尔特诗格权限修复」跃到工作区最前,越过了 12 小时 / 1 天前的那批](docs/screenshots/session-reorder.png)
47
+ ![侧边栏会话自动重排:刚聊过的那个会话跃到工作区最前,越过了 12 小时 / 1 天前的那批](docs/screenshots/session-reorder.png)
48
48
 
49
49
  **🖥️ 不碰配置文件,设置面板点点点**
50
50
  怎么回、能发什么图、什么时候开口、什么人格——面板上改完保存即生效(只有增删账号才要重启)。还有 ✏️ 预设人格编辑器,直接在网页里改她的"性格文件"。
@@ -352,32 +352,119 @@ dsh: disabling profile plugin row "mcp-chrome": Plugin ... is incompatible with
352
352
 
353
353
  ---
354
354
 
355
- ## 🧩 扩展工具:自己写 QQ 工具,还能"跨通道"(v1.8.0+)
356
-
357
- 把 `.mjs` 放进 `{dataRoot}/.qqbot-extensions/tools/`,AI 就能调用它(写完发 `/tools-reload` 即生效,无需重启)。
358
- **默认**:扩展工具**只在 QQ 会话里存在**——别处的会话完全看不到它,所以也不占一点 token。
359
-
360
- **加一行 `expose: 'all'`**,它就对**所有会话可见**(web 对话、终端…),并在那边**直接操作 QQ**:
361
-
362
- ```js
363
- export default {
364
- name: 'qq_send',
365
- expose: 'all',
366
- description: '查 QQ 聊天对象 / 向群或私聊发消息',
367
- inputSchema: { action: { type: 'string' }, target: { type: 'string' }, text: { type: 'string' } },
368
- run: async (args, env) => {
369
- const qq = env.qq; // 账号包:appId / 群与私聊清单 / sender / sendText / apiCall…
370
- return { ok: true, msg: (await qq.sendText('group', args.target, args.text)) ? '已发送 ✓' : '发送失败' };
371
- },
372
- };
373
- ```
374
-
375
- - 注册名会带上**人设 id**(如 `qq_send__whale-girl`),归属一眼可见;
376
- ⚠️ **工具名只能用 `[a-zA-Z0-9_-]`** —— 用 `@` 之类的字符会被 LLM API **整轮拒绝**(会让机器人全面瘫痪)。插件现在会**直接拒绝注册**这类名字,不会再把整条链路带崩。
377
- - 发送**被动优先、失败转主动**:先拿目标会话最近的 `msgId` 走被动回复(不吃主动配额、也不被 QQ 吞),失败再去掉 `msgId` 重发。冷群没有被动窗口,会直接走主动。
378
- - **新用户不用自己搬示例**:插件启动时会把自带的 `examples/ext-tools`、`examples/botplay` **只补不覆盖**地铺进你的扩展目录 —— 装上就有能跑的工具(如 `qq_send`)和卡片示例。
379
-
380
- 细节见 **[用户手册](./docs/USER-GUIDE.md)** 的「自定义 QQ 工具」一节。
355
+ ## 🧩 扩展工具:自己写 QQ 工具,还能"跨通道"(v1.8.0+)
356
+
357
+ 把 `.mjs` 放进 `{dataRoot}/.qqbot-extensions/tools/`,AI 就能调用它(写完发 `/tools-reload` 即生效,无需重启)。
358
+ **默认**:扩展工具**只在 QQ 会话里存在**——别处的会话完全看不到它,所以也不占一点 token。
359
+
360
+ **加一行 `expose: 'all'`**,它就对**所有会话可见**(web 对话、终端…),并在那边**直接操作 QQ**:
361
+
362
+ ```js
363
+ export default {
364
+ name: 'qq_send',
365
+ expose: 'all',
366
+ description: '查 QQ 聊天对象 / 向群或私聊发消息',
367
+ inputSchema: { action: { type: 'string' }, target: { type: 'string' }, text: { type: 'string' } },
368
+ run: async (args, env) => {
369
+ const qq = env.qq; // 账号包:appId / 群与私聊清单 / sender / sendText / apiCall…
370
+ return { ok: true, msg: (await qq.sendText('group', args.target, args.text)) ? '已发送 ✓' : '发送失败' };
371
+ },
372
+ };
373
+ ```
374
+
375
+ - 注册名会带上**人设 id**(如 `qq_send__whale-girl`),归属一眼可见;
376
+ ⚠️ **工具名只能用 `[a-zA-Z0-9_-]`** —— 用 `@` 之类的字符会被 LLM API **整轮拒绝**(会让机器人全面瘫痪)。插件现在会**直接拒绝注册**这类名字,不会再把整条链路带崩。
377
+ - 发送**被动优先、失败转主动**:先拿目标会话最近的 `msgId` 走被动回复(不吃主动配额、也不被 QQ 吞),失败再去掉 `msgId` 重发。冷群没有被动窗口,会直接走主动。
378
+ - **新用户不用自己搬示例**:插件启动时会把自带的 `examples/ext-tools`、`examples/botplay`、`examples/ext-hooks` **只补不覆盖**地铺进你的扩展目录 —— 装上就有能跑的工具(如 `qq_send`)、卡片示例和启动钩子示例。
379
+
380
+ 细节见 **[用户手册](./docs/USER-GUIDE.md)** 的「自定义 QQ 工具」一节。
381
+
382
+ ## 🪝 启动钩子:没人调用也自己跑(v1.8.9+)
383
+
384
+ 前面的扩展都要「有人触发」才动:`commands/` 等用户敲命令、`tools/` 等 LLM 调用、`botplay/` 等人点卡片。
385
+ 但有些事**没人触发也得跑** —— 恢复上次没跑完的长期任务、注册监听、起定时器、预取数据。
386
+ 把 `.mjs` 放进 `{dataRoot}/.qqbot-extensions/hooks/`,它就会在**插件启动(apply)时自动执行一次**:
387
+
388
+ ```js
389
+ // {dataRoot}/.qqbot-extensions/hooks/my-hook.mjs
390
+ export async function run(env) {
391
+ env.logger.info(`插件 v${env.pluginVersion} 起来了;数据根 = ${env.dataRoot}`);
392
+ const timer = setInterval(() => { /* 周期任务 */ }, 60_000);
393
+ timer.unref?.();
394
+ env.registerDispose(() => clearInterval(timer)); // 卸载时收尾
395
+ }
396
+
397
+ export async function dispose(env) { // 可选:卸载 / 宿主退出时调用
398
+ env.logger.info('收尾完成');
399
+ }
400
+ ```
401
+
402
+ 三种写法都认:`export function run(env)`、`export default { name, run, dispose }`、`export default async (env) => {}`。
403
+
404
+ | `env` 字段 | 说明 |
405
+ |---|---|
406
+ | `ctx` | 插件 cordis Context(`ctx.on()` / `ctx.get()` / `ctx.webServer.register()`…) |
407
+ | `logger` / `dataRoot` / `config` | 日志 / 数据根 / 当前实例配置(只读用途) |
408
+ | `registerDispose(fn)` | 注册清理函数(与导出的 `dispose()` 一样在卸载时调用,**逆序**执行) |
409
+ | `pluginVersion` | 插件版本号(如 `1.8.9`),可按版本分支 |
410
+ | `caps` / `store` | 与 tools / commands **同一套能力包**;`store.load()/save()` 落 `hooks/data/<文件名>.json` |
411
+
412
+ **和 tools / commands 的区别**:钩子**不需要任何人调用**,也不出现在工具列表里(不占 AI 的 token)。
413
+ `hooks/` 根下的 `*.mjs` 逐个执行;**子目录不扫描**(与 `tools/` 的既有约定一致,可安全放私有模块)。
414
+
415
+ **插件侧的硬保证**:
416
+
417
+ - 单个钩子抛错**绝不影响插件启动、也不影响其它钩子**(逐个独立 try/catch,失败只记警告);
418
+ - 单钩子超时 **30s**,超时只告警并放行 —— 异步钩子拖不死启动(注意:超时不会真的杀掉代码,
419
+ 长任务请用定时器/后台异步跑,别直接写在 `run()` 里);
420
+ - `hooks/` 目录**不存在或为空完全安静**(不报错、不刷日志);每个钩子的名字与结果
421
+ (成功 / 失败 / 超时)都会写进日志。
422
+
423
+ 示例见 [`examples/ext-hooks/`](./examples/ext-hooks/README.md)(`hello-hook.mjs` 最小可跑;
424
+ `session-watch-hook.mjs` 演示"注册监听 + dispose 清理");插件启动时会自动铺一份到你的扩展目录。
425
+ ⚠️ 钩子**只在启动时跑一次**(没有热重载),改完要重启插件/宿主才生效。
426
+
427
+ ## 🚦 入站中间件:让扩展管"每条消息的命运"(v1.9.0)
428
+
429
+ 前面四套扩展都要**有人触发**才跑(敲命令 / LLM 调用 / 点卡片 / 启动)。但有些规则得管**每一条**消息:
430
+ 这条广告别进群、这句敏感话换掉、这条必须叫醒她、这条引用的是子会话转发**不算 @ 她**。
431
+
432
+ 把 `.mjs` 放进 `{dataRoot}/.qqbot-extensions/inbound/` 就生效:
433
+
434
+ ```js
435
+ // {dataRoot}/.qqbot-extensions/inbound/my-rule.mjs
436
+ export async function onInbound(ctx, next) { // 早:记群历史之前
437
+ if (isAd(ctx.text)) {
438
+ ctx.silentInto(); // 内容仍静默进她上下文
439
+ ctx.annihilate({ reason: '广告' }); // 消灭:不进历史/不进上下文/不占冷却
440
+ return; // ★ 不调 next()
441
+ }
442
+ return next();
443
+ }
444
+ export default async function (ctx, next) { // 晚:@门控之后
445
+ if (isChildForwardQuote(ctx.state?.quote?.text)) {
446
+ ctx.decide({ mention: 'ignore', reason: '引用子会话转发' });
447
+ }
448
+ return next();
449
+ }
450
+ ```
451
+
452
+ - **两个挂点**:早(引用解析后、**记群历史之前**)/晚(@门控之后,语义与旧契约一致);
453
+ - **四个动作**:`annihilate` 消灭 · `rewrite` 改写(早挂点连历史一起改)· `forceWake` 跳过 @门控/评分/冷却 ·
454
+ `decide` 覆盖 @ 判定;另有 `silentInto` 静默进上下文、`muteUser` 系列用户维禁言、`kv` 自己的持久化;
455
+ - **能力面对面齐平**:入站扩展和另外四套**共用同一套能力包**(`store` / `api()` / `markdown` /
456
+ `appendSilent` / `user` / `kernel` …),入站专属的那组走 `ctx.caps.inbound`;
457
+ - **四条保命件**:主人白名单最高优先(不可被消灭/禁言)、强唤醒优先于静默、熔断(扩展失控自动停手)、
458
+ 审计 + 可撤销(每次动作一行,带轮转);
459
+ - 目录**不存在或为空完全安静**;单个扩展抛错只告警并放行 —— 你的脚本坏了**永远不会吞掉消息**。
460
+
461
+ 示例见 [`examples/ext-inbound/`](./examples/ext-inbound/README.md)。⚠️ 自动铺到你目录的**只有**
462
+ `no-wake-on-child-quote.mjs`(它只改 @ 判定,不动手);`class-advisor.mjs`(辅导员:删广告/封人/改写/
463
+ 求助优先)**不会自动铺**,要自己拷 —— 示例是给人**看和抄**的,不该在你没读过它之前就自己跑起来。
464
+
465
+ > 📘 **写扩展前先读**:[`docs/extension-contract.md`](./docs/extension-contract.md) —— 五套扩展点、
466
+ > 统一能力包、入站操控、安全红线和常见坑,一份写全。
467
+
381
468
  ## 🔨 锤子面板:禁言 / 踢人(v1.6.3)
382
469
 
383
470
  dock 面板里的 **🔨 锤子**(原来叫「🔇 禁言」),下面分两页:
package/README_EN.md CHANGED
@@ -27,6 +27,10 @@ The little ball at the corner of the settings panel opens a whole control deck:
27
27
 
28
28
  **🛡️ Group-admin helper** — join approval + mute management over official APIs, with human-readable errors (not an admin / cannot mute the owner…).
29
29
 
30
+ **👢 Kick members (v1.6.3)** — QQ's official API has **no kick endpoint**, so this part drives *your own* QQ account through the group website: panel → **🔨 Hammer → 👢 Kick** → refresh the QR code, scan it once with your phone (it keeps you signed in afterwards), then pick a group, search a member (exact uin or fuzzy nickname) and hit kick. The login state is **shared with the AI**, so you can also just tell her “kick X out of the group”. (Credentials stay in `{dataRoot}/qun-cookie.json`, the browser runs in its own throwaway profile, and nothing is kept running.)
31
+
32
+ **💗 She remembers who is close and who is not** (v1.5.1) — two independent dimensions: **familiarity** (how firmly she remembers you — days seen, messages sent, being @-ed, being answered: a slow-moving variable) and **affinity** (her current attitude, which can rise or fall with every interaction). The panel lists one row per person and can **export the whole thing to Excel in one click**. Judging uses a local small model that reads both her reasoning (“inside”) and her actual reply (“outside”): *reluctant inside but still polite outside = a concession*; *warm inside but cold outside = does not count*. Affinity only tunes **how willing she is to speak up on her own** — negative affinity means fewer spontaneous messages, **never coldness, snark or attacks**. Group-chat aggregation weights value × affinity, so a single message cannot bait her.
33
+
30
34
  **🔝 A QQ message brings her session back to the top** (v1.6.8)
31
35
  The web-sidebar session you are actually talking to should not be buried. As soon as a QQ message lands in one of her web sessions **and she really replies**, that session is moved to just after the still-"hot" ones (anything active within 10 minutes counts as hot; **pinned sessions never move**), so it leapfrogs whatever has gone cold. Fully event-driven, no polling — and nothing happens when the chat page is closed or the host is not up yet.
32
36
 
@@ -65,12 +69,18 @@ Right: sticker-battle in action — the bot answers with stickers from its own l
65
69
  - A message containing `@bot` means someone @-ed this bot (`@bot` is yourself).
66
70
  - Host-level fixes (workspace session attachment, upstream PR #21) are included — idempotent and fully fail-soft.
67
71
 
68
- **What's new in v1.1.4** (user-facing):
69
- - **Join-request dual channel**: live QQ event = 【入群申请】 message note (silent, no wake); polling fallback = 【审批轮询】 system alert (wakes the AI to handle it). Notes land in the group-manager (hub) session; ordinary groups follow the dock switches.
70
- - **Four independent group-admin switches (dock settings)**: 唤醒AI (wake hub-session AI) / 注入群管会话 (hub web note) / 通知普通群 (note the requesting group) / 唤醒普通群AI (wake the requesting group's AI) — effective on both the event and polling paths.
71
- - **Inbound `@bot` long-id cleanup**: the bot's own openid in inbound mentions is shortened to `@bot` (saves tokens); outbound `<@other-openid>` mentions are untouched.
72
- - **Web model changes persist** across restarts (QQ-side overrides take precedence); `/model` lists only the current provider's models.
73
- - **Multi-instance isolation**: sticker stores / timers / gates / history buffers are isolated per instance (`settingsNs`).
72
+ **What's new** (user-facing highlights; full history in [CHANGELOG](./CHANGELOG.md)):
73
+
74
+ - **v1.8.8** — saving connection-related settings (AppID / AppSecret / persona / working dir) now **rebuilds the gateway immediately**. Previously only the *first* credential save (fresh install) would connect; anything later updated the config object but never touched the connection, so people had to restart the host manually.
75
+ - **v1.8.7** — settings/credentials are isolated **per dsh profile** (`qqbot-settings/<profile>/<ns>.json`), and the profile name is now derived from the **install location** instead of `DSH_PROFILE` (which the host process never sets). Without that fix every profile silently wrote into `_default/`, and the writer-fingerprint conflict guard never worked.
76
+ - **v1.8.6** — extension **commands** now get the same capability pack as extension tools, and `/tools-reload` reloads commands too.
77
+ - **v1.8.0** — extension tools can declare `expose: 'all'` to become visible **in every conversation** (web / terminal / …) and act on QQ from there — see “Cross-channel tools” below.
78
+ - **v1.6.8** — a QQ message pulls her web-sidebar session back to the top (see above).
79
+ - **v1.6.7** — **custom botplay events**, plus “let the AI write one for you” (see below).
80
+ - **v1.6.3** — **🔨 Hammer panel: mute / kick**; kicking drives *your own* QQ account, because the official API exposes no kick endpoint (see below).
81
+ - **v1.5.1** — **familiarity / affinity ledger** (two separate dimensions, one row per person, one-click Excel export).
82
+ - **v1.4.5** — optional local small model for smart replies (a token saver; see below).
83
+ - **v1.3.0** — token-lean by design (see the developer bullets above).
74
84
 
75
85
  > 🛡️ This repo contains **no** bot credentials, sticker data, logs or personal paths (cleaned before publishing). Inject AppID/AppSecret via env vars or the Web panel — **never commit them**.
76
86
 
@@ -368,7 +378,8 @@ Extensions live under the **account workspace** (never inside the plugin package
368
378
  ```
369
379
  .qqbot-extensions/
370
380
  ├── commands/ # custom slash commands (take effect after /bot-restart)
371
- └── tools/ # custom QQ tools callable by the AI (hot-reload via /tools-reload)
381
+ ├── tools/ # custom QQ tools callable by the AI (hot-reload via /tools-reload)
382
+ └── hooks/ # startup hooks — run once automatically when the plugin starts (v1.8.9+)
372
383
  ```
373
384
 
374
385
  **Slash command** (`.qqbot-extensions/commands/hello.mjs`):
@@ -414,7 +425,17 @@ export default {
414
425
  - **`env.qq`** = that persona's account pack: `{ preset, appId, appSecret, owners, groups:[{gid,name,lastAt}], c2c:[{openid,name,lastAt}], sender, sendText(scope,id,text), sendMarkdown(...), sendImage(...), apiCall(method,path,body) }`.
415
426
  - **Sending is passive-first**: `sendText()` looks up the target conversation's latest inbound `msgId` and replies with it (passive — no active-message quota, and QQ will not drop it); on failure it **retries without the msgId** (active fallback). A passive window only exists in conversations with **recent activity** — a cold group has none and will always go active.
416
427
  - Registration happens **at plugin startup** (no need to wait for a QQ message), idempotent and fail-soft.
417
- - **New users get examples for free**: at startup the plugin copies `examples/ext-tools/*.mjs` and `examples/botplay/*.mjs` into `{dataRoot}/.qqbot-extensions/{tools,botplay}/` — **only missing files**, never overwriting what you wrote.
428
+ - **New users get examples for free**: at startup the plugin copies `examples/ext-tools/**`, `examples/botplay/*.mjs` and `examples/ext-hooks/*.mjs` into `{dataRoot}/.qqbot-extensions/{tools,botplay,hooks}/` — **only missing files**, never overwriting what you wrote. (`examples/ext-tools/lib/` is copied along too: subdirectories are **not** scanned as tools, which makes them the safe place for a tool's private helper modules.)
429
+ - **Cross-session toolchain (shipped as working examples)**: `examples/ext-tools/` contains four tools that let one session **create another session, hand it a task, and receive the result back**:
430
+
431
+ | Tool | What it does |
432
+ |---|---|
433
+ | `session_create` | create a **child session** (optionally in another workspace and/or with another persona — both accept a display name *or* an id) and post the initial task into it |
434
+ | `session_send` | deliver a message to **any session** (the send tool): busy → `inject` (interject into the running turn, no wake), idle → `followup` (start a turn); the first line carries the source session id |
435
+ | `session_watch` | attach / detach a “backfill when the turn ends” hook, so a child's final text is posted back to the parent automatically |
436
+ | `sessions_list` | list workspaces and sessions (read-only; the workspace filter is a **substring** match) |
437
+
438
+ Three lessons are baked into them: **never hand-build message objects** (use `agent.inject` / `agent.followup` — a hand-rolled `user/message` can corrupt a session), **resume before delivering** (a non-live session silently drops `append`), and **control visibility with `expose`** (`'all'` = visible everywhere, anything else = QQ sessions only) so that parent-only tools stay invisible to children.
418
439
 
419
440
  **For AI agents — you can write these yourself (no feature request needed):**
420
441
  - Card bodies are **plain markdown you write** (`#`, bold, `![alt](url)`, fenced code). This plugin has **no template engine — the model is the engine**. Cards with buttons go through a botplay event or the dock card editor (button callbacks must be registered host-side).
@@ -426,6 +447,99 @@ export default {
426
447
  - Example (song request): fetch a search API → build a markdown card (cover / title / artist / lyrics) → `sender.sendMarkdown(replyTarget, card)` → optionally `sender.sendMedia(...)` for a preview → return `{ ok: true, msg: 'card sent' }`.
427
448
  - API reference: when a field/event/error code is unclear, read the official QQ bot api-v2 docs <https://bot.q.qq.com/wiki/develop/api-v2/> instead of guessing (button `action.type` 0=link / 1=callback / 2=command, keyboard 5-row limit, error codes…).
428
449
 
450
+ ## 🪝 Startup hooks: nobody has to call them (v1.8.9+)
451
+
452
+ Every extension above needs a **trigger**: `commands/` waits for a user to type a slash command, `tools/` waits for the LLM to call it, `botplay/` waits for a button click. Some work has no trigger — restoring a long-running job that was interrupted, subscribing to host events, starting a timer, prefetching data. Drop a `.mjs` into `{dataRoot}/.qqbot-extensions/hooks/` and it runs **once, automatically, when the plugin starts (`apply`)**:
453
+
454
+ ```js
455
+ // {dataRoot}/.qqbot-extensions/hooks/my-hook.mjs
456
+ export async function run(env) {
457
+ env.logger.info(`plugin v${env.pluginVersion} booted; dataRoot = ${env.dataRoot}`);
458
+ const timer = setInterval(() => { /* periodic work */ }, 60_000);
459
+ timer.unref?.();
460
+ env.registerDispose(() => clearInterval(timer)); // clean up on unload
461
+ }
462
+
463
+ export async function dispose(env) { // optional: called on unload / host exit
464
+ env.logger.info('torn down');
465
+ }
466
+ ```
467
+
468
+ All three shapes work: `export function run(env)`, `export default { name, run, dispose }`, `export default async (env) => {}`.
469
+
470
+ | `env` field | What it gives you |
471
+ |---|---|
472
+ | `ctx` | the plugin's cordis Context (`ctx.on()` / `ctx.get()` / `ctx.webServer.register()`…) |
473
+ | `logger` / `dataRoot` / `config` | logging / the data root / the live instance config (read-only use) |
474
+ | `registerDispose(fn)` | register a cleanup function — called on unload, in **reverse** order, same as an exported `dispose()` |
475
+ | `pluginVersion` | the plugin package version (e.g. `1.8.9`), so you can branch on it |
476
+ | `caps` / `store` | the **same capability pack** as tools/commands; `store.load()/save()` persists to `hooks/data/<file>.json` |
477
+
478
+ **How it differs from tools/commands**: a hook is **never called by anyone** and never shows up in the tool list (zero token cost for the model). Every `*.mjs` directly under `hooks/` runs, in filename order; **subdirectories are not scanned** (same convention as `tools/` — the safe place for private helper modules).
479
+
480
+ **What the plugin guarantees:**
481
+
482
+ - a throwing hook **never breaks plugin startup or the other hooks** (each one gets its own try/catch; failures are logged as warnings and skipped);
483
+ - **30s timeout per hook** — a slow async hook cannot stall startup (note: the timeout does *not* kill the code; run long work in a timer/background task instead of inline in `run()`);
484
+ - a **missing or empty `hooks/` directory is completely silent** (no errors, no log spam); every hook's name and outcome (ok / failed / timed out) is logged.
485
+
486
+ Examples ship in [`examples/ext-hooks/`](./examples/ext-hooks/README.md) (`hello-hook.mjs` is the minimal one; `session-watch-hook.mjs` shows "subscribe + dispose"), and the plugin copies them into your extension directory at startup.
487
+ ⚠️ Hooks run **once at startup only** (no hot reload) — restart the plugin/host to apply an edit.
488
+
489
+ ## 🔨 Hammer panel: mute / kick (v1.6.3)
490
+
491
+ The dock's **🔨 Hammer** (formerly “🔇 Mute”) has two tabs:
492
+
493
+ | Tab | Path | Notes |
494
+ |---|---|---|
495
+ | **🔇 Mute** | official bot API | works as soon as the bot is a group admin — no login at all |
496
+ | **👢 Kick** | **your own QQ account** (group website API) | the official API exposes no kick endpoint, so you sign in once |
497
+
498
+ **Kick, step by step**
499
+
500
+ 1. Panel → **🔨 Hammer** → **👢 Kick** → **📱 Refresh QR**
501
+ 2. The QR appears **inside the page** — scan it with mobile QQ's “Scan”, pointing the **camera at the screen**
502
+ > Tencent only accepts the camera: picking the image from the gallery / long-press recognition is answered with “本次请求不支持图片识别或长按扫描二维码授权”.
503
+ 3. Once signed in: pick a group → search a member (exact uin or fuzzy nickname) → hit 👢 Kick.
504
+
505
+ ![Hammer · Kick panel: searching “鱼”, one 👢 button per member](docs/screenshots/hammer-kick-panel.png)
506
+
507
+ **Why you do not have to scan again** — after a successful login the credentials are stored in `{dataRoot}/qun-cookie.json`; every later login silently launches a **headless** browser, injects those cookies (CDP `Network.setCookie`), reads them back and closes it. **No window, no scan.** Only the first time (or after the credentials really expire) needs a scan; `skey` lives about a day and re-login uses that same silent path.
508
+
509
+ **The AI shares the same login state** — the panel and the AI read/write the *same* `qun-cookie.json`. The AI-side tool is **`qq_group_admin`**:
510
+
511
+ | action | Effect |
512
+ |---|---|
513
+ | `status` | login state / keep waiting for the scan |
514
+ | `login` | sign in (silent first; returns a QR path only when needed) |
515
+ | `groups` | list groups you own / manage |
516
+ | `members` | look up members (exact uin / fuzzy nickname / all) |
517
+ | `kick` | kick — **requires `confirmed=true`**, otherwise it only answers “please confirm the group and the member with the owner first” |
518
+
519
+ Privacy: the browser runs in its **own profile** inside the plugin data dir (it cannot see your everyday browser), it is **not** kept running (credentials are read, then it closes; a QR wait lasts at most 5 minutes; it goes away with the host), and credentials never leave your machine.
520
+
521
+ ## 🚫 No-context mode (saves tokens per session)
522
+
523
+ Let a given QQ session remember only the last few exchanges — older history is folded away. Handy for busy groups.
524
+
525
+ **Turn it on**: dock panel (bottom-right 🛡) → “⚙ Single-session settings” → tab “🚫 No context” → enable it, set “keep N lines before the @” → save.
526
+
527
+ Worth knowing: the **web transcript is not deleted** (only a “context compacted” fold marker is added), **N counts dsh-side messages** (one of them may bundle several QQ messages), it costs **zero extra model calls** (the placeholder text is static), and it takes effect **from the next turn onward**.
528
+
529
+ ## ✅ QQ approval cards: who may click
530
+
531
+ An approval card is posted **into the requester's conversation** (a group request posts to the group), but only these people can press the buttons: **① the requester, ② the owner allow-list** (`groupAdmin.owners`).
532
+
533
+ > ⚠️ **In group chats, set the allow-list**: Settings → QQ Bot → “Owner openids allowed to act (comma-separated; empty = no check)”. Otherwise the owner's clicks on somebody else's approval do nothing.
534
+
535
+ ## 🤖 Custom events + “let the AI write one for you” (v1.6.7)
536
+
537
+ `botplay` events let you ship interactive cards (check-ins, mini-games, polls) whose button presses the plugin routes back to you — the full contract lives in [docs/botplay-contract.md](./docs/botplay-contract.md).
538
+
539
+ - Button capacity is **`5 × buttonsPerRow`** — an event registered with `buttonsPerRow: 3` really fits only 15 buttons; extra ones are silently dropped.
540
+ - **Do not rely on a `card.dirty` repaint alone** to push new content into the group. The proven pattern: send an idempotent aggregate card on phase change / game over, and answer explicit user requests (view state, reveal, self-healing old buttons) with `post: true`.
541
+ - You do not have to write the JavaScript yourself — just ask the AI to *“write me a botplay event that does X”*; it can author it into your data root and a reload picks it up.
542
+
429
543
  ## Core Modules
430
544
 
431
545
  ```
@@ -59,6 +59,8 @@ export interface ExtCapsDeps {
59
59
  * 由调用方把插件的 cordis Context 原样传进来;不传 = 没有这个能力。
60
60
  */
61
61
  kernel?: unknown;
62
+ /** ★ 入站操控(只有入站扩展能提供;见 {@link ExtInboundCaps}) */
63
+ inbound?: ExtInboundCaps;
62
64
  /**
63
65
  * 自重启实现(仅供测试注入;生产走内置 `selfRestart`)。
64
66
  * ⚠️ 真跑它会 spawn 一个助手去 kill 宿主进程 —— 测试里**必须**用这个接缝替换。
@@ -66,6 +68,83 @@ export interface ExtCapsDeps {
66
68
  restartImpl?: (delayMs?: number) => boolean;
67
69
  }
68
70
  /** 能力包对外形状(写扩展时看到的就是这个) */
71
+ /**
72
+ * ★ **入站操控**(2026-10-12 主人定:并入统一能力包)。
73
+ *
74
+ * 为什么单独成组、而且是**可选**的:这几项只有在"手上有一条正在进站的消息"时才有意义 ——
75
+ * 也就是**入站扩展**(第五套,挂点 onInbound / onDecide)手里。其余四套(工具/命令/
76
+ * 卡片/钩子)大多在"消息早就进完了"的时候才跑,给它们一个空壳只会误导。
77
+ *
78
+ * 于是契约写成:**一套包,五套扩展**;包的公共部分人人都有,
79
+ * 这一组"有值就说明你现在正握着一条消息的处置权"。
80
+ *
81
+ * ⚠️ 三条语义(与入站扩展文档一致,改动前先读 `examples/ext-inbound/README.md`):
82
+ * ① annihilate = **不调 next()**:这条不进群历史、不进上下文、不占冷却;
83
+ * ② rewrite 在早挂点会**连群历史一起改**;
84
+ * ③ silentInto = 内容**静默进上下文**(不唤醒),与 annihilate 是"消失"vs"安静留下"的区别。
85
+ */
86
+ export interface ExtInboundCaps {
87
+ /** 消灭这条消息(早挂点;晚挂点会被拒绝 + 告警) */
88
+ annihilate(opts?: {
89
+ reason?: string;
90
+ }): boolean;
91
+ /** 改写正文(早挂点连群历史一起改) */
92
+ rewrite(opts?: {
93
+ text?: string;
94
+ reason?: string;
95
+ }): boolean;
96
+ /** 强制入站:跳过 @门控 / 价值评分 / 群冷却(不等于"她一定会说话") */
97
+ forceWake(opts?: {
98
+ reason?: string;
99
+ }): boolean;
100
+ /** 覆盖 @ 判定(晚挂点;早挂点会被拒绝 + 告警) */
101
+ decide(opts?: {
102
+ mention?: 'ignore' | 'force';
103
+ reason?: string;
104
+ }): boolean;
105
+ /** 静默进上下文:内容进 AI 上下文、**不唤醒**(走宿主 agent.inject,不拆 tool 配对) */
106
+ silentInto(text?: string | {
107
+ text?: string;
108
+ reason?: string;
109
+ }): boolean;
110
+ /** 用户维禁言(名单持久化、带期限、过期惰性清理) */
111
+ /** 禁言:成功返回名单条目({id,until,reason,by};until=0 表示永久),失败返回 false(原因见审计) */
112
+ muteUser(opts?: {
113
+ id?: string;
114
+ minutes?: number;
115
+ reason?: string;
116
+ by?: string;
117
+ }): unknown;
118
+ unmuteUser(opts?: {
119
+ id?: string;
120
+ }): boolean;
121
+ /** 查禁言:null = 没被禁言;否则返回名单条目(过期项惰性清理) */
122
+ isMuted(id?: string): unknown;
123
+ mutedUsers(): unknown[];
124
+ /** 这条消息的只读视图(读的时候现算,不是快照) */
125
+ message: {
126
+ text: string;
127
+ sender: string;
128
+ senderName: string;
129
+ scope: 'group' | 'c2c';
130
+ groupId: string;
131
+ isOwner: boolean;
132
+ mentions: unknown[];
133
+ quoted: {
134
+ text: string;
135
+ id?: string;
136
+ fromSelf?: boolean;
137
+ } | undefined;
138
+ platform: {
139
+ mentioned: boolean;
140
+ };
141
+ };
142
+ /** 该扩展自己的持久化(与禁言名单同一个文件) */
143
+ kv: {
144
+ get(key: string): unknown;
145
+ set(key: string, value: unknown): boolean;
146
+ };
147
+ }
69
148
  export interface ExtCapabilities {
70
149
  appId: string;
71
150
  appSecret: string;
@@ -150,6 +229,12 @@ export interface ExtCapabilities {
150
229
  * 所以本来就是你的权利 —— 但别把它转手给不信任的代码。
151
230
  */
152
231
  kernel: unknown;
232
+ /**
233
+ * ★ **入站操控**(见 {@link ExtInboundCaps}):**只有入站扩展(第五套)手里有值** ——
234
+ * 只有它在"一条消息正在进站"的时刻跑。别的四套拿它会是 undefined,这不是缺失,是语义。
235
+ * 平铺在 ctx 上的同款动作(ctx.annihilate 等)与这里是**同一份实现**,不是两套。
236
+ */
237
+ inbound?: ExtInboundCaps;
153
238
  /**
154
239
  * 触发宿主自重启(等价于内置的 `/bot-restart`)。
155
240
  *
@@ -1 +1 @@
1
- {"version":3,"file":"ext-capabilities.d.ts","sourceRoot":"","sources":["../../src/features/ext-capabilities.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ext-capabilities.d.ts","sourceRoot":"","sources":["../../src/features/ext-capabilities.ts"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAI1C,yCAAyC;AACzC,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;AAEhE,2BAA2B;AAC3B,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,iDAAiD;AACjD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/D,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE,wBAAwB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACtG,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACzF;AAED,iDAAiD;AACjD,MAAM,MAAM,YAAY,GACpB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC3B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAExD,4CAA4C;AAC5C,MAAM,WAAW,WAAW;IAC1B,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,iCAAiC;IACjC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+CAA+C;IAC/C,KAAK,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAA;KAAE,GAAG,SAAS,CAAC;IAChF,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/G,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,iDAAiD;IACjD,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;CAC7C;AAED,2BAA2B;AAC3B;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,cAAc;IAC7B,+BAA+B;IAC/B,UAAU,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;IAChD,uBAAuB;IACvB,OAAO,CAAC,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;IAC5D,4CAA4C;IAC5C,SAAS,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;IAC/C,gCAAgC;IAChC,MAAM,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;IAC1E,6DAA6D;IAC7D,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;IACxE,8BAA8B;IAC9B,uEAAuE;IACvE,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;IAC1F,UAAU,CAAC,IAAI,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;IAC5C,wCAAwC;IACxC,OAAO,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,UAAU,IAAI,OAAO,EAAE,CAAC;IACxB,6BAA6B;IAC7B,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,OAAO,GAAG,KAAK,CAAC;QACvB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,EAAE,OAAO,EAAE,CAAC;QACpB,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,EAAE,CAAC,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;SAAE,GAAG,SAAS,CAAC;QACtE,QAAQ,EAAE;YAAE,SAAS,EAAE,OAAO,CAAA;SAAE,CAAC;KAClC,CAAC;IACF,4BAA4B;IAC5B,EAAE,EAAE;QAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAA;KAAE,CAAC;CAC9E;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9D,KAAK,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpE,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAClH,KAAK,EAAE;QACL,IAAI,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC,GAAG,SAAS,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;QAC9B,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,uBAAuB,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;IACpG,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,eAAe,IAAI,OAAO,CAAC;IAC3B,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IACzD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC9B;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;;;OAIG;IACH,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,IAAI,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;CACvE;AA+BD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,eAAe,CAwN9D"}
@@ -318,6 +318,10 @@ export function makeExtCaps(deps) {
318
318
  },
319
319
  // ── 内核句柄(遥控器)────────────────────────────────────────────
320
320
  kernel: deps.kernel,
321
+ // ── 入站操控(只有"手上有消息"的那一套会给值)────────────────────
322
+ // 2026-10-12 主人定:这一组也要进能力包 —— 契约是「一套包、五套扩展」,
323
+ // 不能只写公共部分、把入站那一块留在包外面。
324
+ ...(deps.inbound ? { inbound: deps.inbound } : {}),
321
325
  // ── 宿主自重启(复用内置 /bot-restart 的实现,别自己 spawn)──────
322
326
  restart: (opts) => {
323
327
  const requireOwner = opts?.requireOwner !== false; // 默认:仅主人
@@ -1 +1 @@
1
- {"version":3,"file":"ext-capabilities.js","sourceRoot":"","sources":["../../src/features/ext-capabilities.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ext-capabilities.js","sourceRoot":"","sources":["../../src/features/ext-capabilities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ import type { Logger } from '../types.js';
2
+ import { makeExtCaps } from './ext-capabilities.js';
3
+ /** 单钩子默认超时(ms):超过就只告警放行,绝不拖住插件启动 */
4
+ export declare const DEFAULT_HOOK_TIMEOUT_MS = 30000;
5
+ /** 一个钩子的执行结果 */
6
+ export interface HookRunResult {
7
+ /** 文件名(含扩展名),日志与诊断用 */
8
+ file: string;
9
+ /** 绝对路径 */
10
+ path: string;
11
+ /** 展示名:模块导出的 `name` 优先,否则去掉扩展名的文件名 */
12
+ name: string;
13
+ /** 执行结果;`skipped` = 模块形状不合法(缺 run),没执行 */
14
+ status: 'ok' | 'error' | 'timeout' | 'skipped';
15
+ /** 耗时(ms);skipped 为 0 */
16
+ ms: number;
17
+ /** status != 'ok' 时的人类可读原因 */
18
+ error?: string;
19
+ }
20
+ /** 一次启动钩子装载的汇总(调用方可据此打一条总账日志) */
21
+ export interface HookRunSummary {
22
+ /** 目录里被发现、且形状合法的钩子总数(不含 skipped) */
23
+ total: number;
24
+ ok: number;
25
+ failed: number;
26
+ timedOut: number;
27
+ /** 被跳过(形状不合法)的数量 */
28
+ skipped: number;
29
+ /** 逐个钩子的明细(含 skipped) */
30
+ results: HookRunResult[];
31
+ }
32
+ /** `runStartupHooks` 的入参 */
33
+ export interface RunStartupHooksOptions {
34
+ dataRoot: string;
35
+ logger: Logger;
36
+ /** 插件 cordis Context(会原样交给钩子的 `env.ctx` / `env.caps.kernel`) */
37
+ ctx?: unknown;
38
+ /** 当前实例配置(会原样交给钩子的 `env.config`,只读用途) */
39
+ config?: unknown;
40
+ /** 单钩子超时(ms),缺省 {@link DEFAULT_HOOK_TIMEOUT_MS}(30s) */
41
+ timeoutMs?: number;
42
+ }
43
+ /** 传给钩子的 env(写扩展时看到的就是这个) */
44
+ export interface HookEnv {
45
+ /** 插件自己的 cordis Context(等于 `makeExtCaps().kernel`) */
46
+ ctx: unknown;
47
+ /** 插件 logger —— 建议日志前缀写 `[ext-hook:<文件名>]` */
48
+ logger: Logger;
49
+ /** 数据根(= `{dataRoot}`,钩子目录的父目录) */
50
+ dataRoot: string;
51
+ /** 当前实例的配置对象(只读用途) */
52
+ config: unknown;
53
+ /** 注册清理函数(插件卸载 / 宿主退出时调用;逆序执行,单个失败不影响其它) */
54
+ registerDispose: (fn: () => unknown | Promise<unknown>) => void;
55
+ /** 插件包版本号,如 `1.8.9` */
56
+ pluginVersion: string;
57
+ /** 本钩子的绝对路径(调试/自报家门用) */
58
+ hookFile: string;
59
+ /** 扩展能力包(与 tools/commands 同一套:markdown/image/api/store/appendWake…) */
60
+ caps: ReturnType<typeof makeExtCaps>;
61
+ /** `caps.store` 的快捷方式(落 `{dataRoot}/.qqbot-extensions/hooks/data/<名字>.json`) */
62
+ store: ReturnType<typeof makeExtCaps>['store'];
63
+ }
64
+ /** 扩展钩子目录(相对数据根) */
65
+ export declare function extHooksDir(dataRoot: string): string;
66
+ /**
67
+ * 扫描 `{dataRoot}/.qqbot-extensions/hooks/*.mjs` 并**逐个执行**。
68
+ *
69
+ * 目录不存在 / 目录为空 → 直接返回空汇总,**不打任何日志**(这是最常见的正常状态)。
70
+ * 单个钩子失败或超时 → 只记 `warn`,继续下一个;本函数**永不抛出**。
71
+ */
72
+ export declare function runStartupHooks(opts: RunStartupHooksOptions): Promise<HookRunSummary>;
73
+ /**
74
+ * 调用所有钩子登记的清理函数(导出 `dispose()` + `registerDispose(fn)`)。
75
+ *
76
+ * 由 `bootstrapGateway` 的 dispose 链路调用(插件卸载 / 宿主退出 / 保存连接设置后重建网关)。
77
+ * 纪律:逆序执行(后启动的先清理)、**单个失败只告警**、整体永不抛出、幂等。
78
+ */
79
+ export declare function disposeStartupHooks(logger: Logger): Promise<number>;
80
+ /** 重置模块级状态(仅供单元测试;生产不要调 —— 会把正在跑的钩子的清理登记丢掉) */
81
+ export declare function __resetStartupHooksForTest(): void;
82
+ /** 当前已登记清理函数的钩子数(诊断用) */
83
+ export declare function startupHooksDisposeCount(): number;
84
+ //# sourceMappingURL=ext-hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ext-hooks.d.ts","sourceRoot":"","sources":["../../src/features/ext-hooks.ts"],"names":[],"mappings":"AA6CA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGpD,oCAAoC;AACpC,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAK9C,gBAAgB;AAChB,MAAM,WAAW,aAAa;IAC5B,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,MAAM,EAAE,IAAI,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IAC/C,yBAAyB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,iCAAiC;AACjC,MAAM,WAAW,cAAc;IAC7B,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED,4BAA4B;AAC5B,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,yCAAyC;IACzC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,6BAA6B;AAC7B,MAAM,WAAW,OAAO;IACtB,sDAAsD;IACtD,GAAG,EAAE,OAAO,CAAC;IACb,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,4CAA4C;IAC5C,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IAChE,uBAAuB;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,IAAI,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IACrC,gFAAgF;IAChF,KAAK,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC;CAChD;AAeD,oBAAoB;AACpB,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEpD;AA8ED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,cAAc,CAAC,CAgH3F;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAezE;AAED,+CAA+C;AAC/C,wBAAgB,0BAA0B,IAAI,IAAI,CAGjD;AAED,yBAAyB;AACzB,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD"}