@zhin.js/adapter-slack 4.1.0 → 4.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +58 -250
  3. package/adapters/slack.ts +34 -0
  4. package/agent/tools/add_reaction.ts +2 -2
  5. package/agent/tools/archive_channel.ts +2 -2
  6. package/agent/tools/edit_message.ts +5 -4
  7. package/agent/tools/invite_to_channel.ts +2 -2
  8. package/agent/tools/pin_message.ts +2 -2
  9. package/agent/tools/remove_reaction.ts +2 -2
  10. package/agent/tools/set_purpose.ts +2 -2
  11. package/agent/tools/set_topic.ts +2 -2
  12. package/agent/tools/unarchive.ts +2 -2
  13. package/agent/tools/unpin_message.ts +2 -2
  14. package/agent/tools/user_info.ts +2 -2
  15. package/lib/endpoint.d.ts +147 -0
  16. package/lib/endpoint.js +335 -0
  17. package/lib/index.d.ts +11 -0
  18. package/lib/index.js +11 -0
  19. package/lib/markdown-to-mrkdwn.d.ts +9 -0
  20. package/lib/markdown-to-mrkdwn.js +121 -0
  21. package/lib/mrkdwn-to-markdown.d.ts +4 -0
  22. package/lib/{src/mrkdwn-to-markdown.js → mrkdwn-to-markdown.js} +0 -1
  23. package/lib/platform-permit.d.ts +16 -0
  24. package/lib/{src/platform-permit.js → platform-permit.js} +1 -2
  25. package/lib/protocol.d.ts +143 -0
  26. package/lib/protocol.js +225 -0
  27. package/lib/slack-agent-deps.d.ts +28 -0
  28. package/lib/slack-agent-deps.js +30 -0
  29. package/lib/slack-inbound-filter.d.ts +12 -0
  30. package/lib/{src/slack-inbound-filter.js → slack-inbound-filter.js} +0 -1
  31. package/lib/slack-message-ref.d.ts +7 -0
  32. package/lib/{src/slack-message-ref.js → slack-message-ref.js} +0 -1
  33. package/lib/slack-outbound.d.ts +24 -0
  34. package/lib/slack-outbound.js +109 -0
  35. package/lib/slack-reaction.d.ts +1 -0
  36. package/lib/{src/slack-reaction.js → slack-reaction.js} +0 -1
  37. package/lib/slack-response-url.d.ts +5 -0
  38. package/lib/{src/slack-response-url.js → slack-response-url.js} +0 -1
  39. package/lib/webhook.d.ts +14 -0
  40. package/lib/webhook.js +69 -0
  41. package/package.json +41 -20
  42. package/plugin.ts +13 -0
  43. package/schema.json +38 -0
  44. package/src/endpoint.ts +317 -227
  45. package/src/index.ts +62 -66
  46. package/src/markdown-to-mrkdwn.ts +63 -4
  47. package/src/platform-permit.ts +1 -1
  48. package/src/protocol.ts +380 -0
  49. package/src/slack-agent-deps.ts +46 -11
  50. package/src/slack-inbound-filter.ts +1 -1
  51. package/src/slack-outbound.ts +32 -134
  52. package/src/webhook.ts +103 -0
  53. package/lib/agent/tools/add_reaction.js +0 -21
  54. package/lib/agent/tools/add_reaction.js.map +0 -1
  55. package/lib/agent/tools/archive_channel.js +0 -21
  56. package/lib/agent/tools/archive_channel.js.map +0 -1
  57. package/lib/agent/tools/edit_message.js +0 -22
  58. package/lib/agent/tools/edit_message.js.map +0 -1
  59. package/lib/agent/tools/invite_to_channel.js +0 -22
  60. package/lib/agent/tools/invite_to_channel.js.map +0 -1
  61. package/lib/agent/tools/pin_message.js +0 -22
  62. package/lib/agent/tools/pin_message.js.map +0 -1
  63. package/lib/agent/tools/remove_reaction.js +0 -21
  64. package/lib/agent/tools/remove_reaction.js.map +0 -1
  65. package/lib/agent/tools/set_purpose.js +0 -22
  66. package/lib/agent/tools/set_purpose.js.map +0 -1
  67. package/lib/agent/tools/set_topic.js +0 -22
  68. package/lib/agent/tools/set_topic.js.map +0 -1
  69. package/lib/agent/tools/unarchive.js +0 -21
  70. package/lib/agent/tools/unarchive.js.map +0 -1
  71. package/lib/agent/tools/unpin_message.js +0 -22
  72. package/lib/agent/tools/unpin_message.js.map +0 -1
  73. package/lib/agent/tools/user_info.js +0 -28
  74. package/lib/agent/tools/user_info.js.map +0 -1
  75. package/lib/src/adapter.js +0 -62
  76. package/lib/src/adapter.js.map +0 -1
  77. package/lib/src/endpoint.js +0 -312
  78. package/lib/src/endpoint.js.map +0 -1
  79. package/lib/src/event-dispatcher.js +0 -233
  80. package/lib/src/event-dispatcher.js.map +0 -1
  81. package/lib/src/index.js +0 -51
  82. package/lib/src/index.js.map +0 -1
  83. package/lib/src/markdown-to-mrkdwn.js +0 -61
  84. package/lib/src/markdown-to-mrkdwn.js.map +0 -1
  85. package/lib/src/mrkdwn-to-markdown.js.map +0 -1
  86. package/lib/src/platform-permit.js.map +0 -1
  87. package/lib/src/segment-mapper.js +0 -2
  88. package/lib/src/segment-mapper.js.map +0 -1
  89. package/lib/src/signing.js +0 -21
  90. package/lib/src/signing.js.map +0 -1
  91. package/lib/src/slack-agent-deps.js +0 -10
  92. package/lib/src/slack-agent-deps.js.map +0 -1
  93. package/lib/src/slack-inbound-filter.js.map +0 -1
  94. package/lib/src/slack-inbound.js +0 -127
  95. package/lib/src/slack-inbound.js.map +0 -1
  96. package/lib/src/slack-message-ref.js.map +0 -1
  97. package/lib/src/slack-outbound.js +0 -223
  98. package/lib/src/slack-outbound.js.map +0 -1
  99. package/lib/src/slack-reaction.js.map +0 -1
  100. package/lib/src/slack-response-url.js.map +0 -1
  101. package/lib/src/slack-side-events.js +0 -64
  102. package/lib/src/slack-side-events.js.map +0 -1
  103. package/lib/src/transport-http.js +0 -83
  104. package/lib/src/transport-http.js.map +0 -1
  105. package/lib/src/transport-socket.js +0 -68
  106. package/lib/src/transport-socket.js.map +0 -1
  107. package/lib/src/types.js +0 -5
  108. package/lib/src/types.js.map +0 -1
  109. package/plugin.yml +0 -3
  110. package/src/adapter.ts +0 -75
  111. package/src/event-dispatcher.ts +0 -255
  112. package/src/segment-mapper.ts +0 -1
  113. package/src/signing.ts +0 -28
  114. package/src/slack-inbound.ts +0 -140
  115. package/src/slack-side-events.ts +0 -74
  116. package/src/transport-http.ts +0 -95
  117. package/src/transport-socket.ts +0 -77
  118. package/src/types.ts +0 -113
package/CHANGELOG.md CHANGED
@@ -1,5 +1,46 @@
1
1
  # Changelog
2
2
 
3
+ ## 4.1.1
4
+
5
+ ### Patch Changes
6
+
7
+ - cc5c94d: 约定式插件运行时迁移(breaking):插件与适配器由 `usePlugin()` / `extends Adapter` 迁移为 `definePlugin` / `defineAdapter` + `plugin.ts` + 约定目录(`adapters/`、`commands/`、`components/`、`tools/` 等)。
8
+
9
+ - 新增约定式运行时包:`@zhin.js/plugin-runtime`、`@zhin.js/adapter`、`@zhin.js/runtime`、`@zhin.js/host-http`(首版 1.0.0 走 init-publish,不在本 changeset 内 bump)。
10
+ - 全部 20 个平台适配器改为约定式 `defineAdapter`,旧 `usePlugin` / `extends Adapter` / `segment-mapper` 生产入口已删除;onebot11 反向 WSS、onebot12 webhook/wss、milky sse/webhook/wss、satori webhook、kook webhook、qq webhook/middleware 等 slice 1 推迟的连接模式已补齐。
11
+ - 游戏 / 工具 / 服务插件同步迁移到约定目录结构。
12
+ - CLI 增加 plugin-runtime host installer(http/database/outbound/schedule/console 等)。
13
+
14
+ 后续加固(同批):
15
+
16
+ - CLI:`zhin runtime start --daemon`(pidfile/崩溃拉起/风暴保护),orphan watchdog 防僵尸进程;legacy `zhin dev` / `zhin start` 已移除(含 `zhin restart`),`zhin stop` 兼容新 daemon。
17
+ - 安全:builtin 工具统一走 `security/policy-facade.ts` 的 `runToolPolicies`(声明式策略表,deny 优先);审计日志 close flush + 背压队列;`splitCompoundCommand` 引号感知、`extractCommandName` 去引号堵绕过。
18
+ - 日志:Logger 双堆栈修复、本地时区、`getLogger` 挂树(`setLevel` 递归生效)、第三方库(log4js/discord)桥接、启动人读总结。
19
+ - 结构:`plugins/games/shared` 迁为 `packages/game-kit`(`@zhin.js/game-kit`);死目录 `plugins/adapters/common` 删除。
20
+ - 脚手架:`create-zhin-app` / `zhin new` / scaffold-wizard 生成物改为 Plugin Runtime 形态(minimal-bot 同构,新配置格式)。
21
+ - Console:endpoint.list 真实名称与 phase、schema:get-all 按 instanceKey 映射、db:\* 接 DatabaseHost。
22
+
23
+ 注:按仓库发布惯例(见 1bb345dd2),本次 breaking 迁移统一使用 patch,避免 zhin.js 5.0 级联。
24
+
25
+ - 447f3e2: 迁移缺口修复(legacy 功能对齐):
26
+
27
+ - html 段出站规范化:经 `@zhin.js/html-renderer` 渲染为 image 段(sandbox 豁免、无渲染器时降级文本),修复真实平台 `[object Object]`。
28
+ - 群聊 @ 触发 AI:适配器入站标注 `metadata.mentioned`(icqq/qq/slack/onebot11/onebot12/napcat/milky/discord/telegram/kook/dingtalk/satori),`matchAiTrigger` 补齐 ignorePrefixes/respondToAt/respondToPrivate/keywords(默认值与 legacy 对齐)。
29
+ - im_transcripts 全量流水恢复写入(chat_history 工具可用);群聊旁听上下文回迁。
30
+ - `ai.trigger.timeout/thinkingMessage/errorTemplate` 生效;masters/trusted 角色解析对齐 legacy。
31
+ - `Message.sender` 统一为用户 ID(onebot11/12、napcat、milky 原误传显示名);quote_id 经 metadata 接入 AI 引用上下文。
32
+
33
+ - Updated dependencies [16ec4e8]
34
+ - Updated dependencies [cc5c94d]
35
+ - Updated dependencies [447f3e2]
36
+ - @zhin.js/core@1.3.5
37
+ - @zhin.js/agent@1.0.4
38
+ - @zhin.js/host-http@1.0.1
39
+ - zhin.js@4.1.3
40
+ - @zhin.js/logger@1.0.75
41
+ - @zhin.js/plugin-runtime@1.0.1
42
+ - @zhin.js/adapter@1.0.1
43
+
3
44
  ## 4.1.0
4
45
 
5
46
  ### Minor Changes
package/README.md CHANGED
@@ -1,6 +1,14 @@
1
1
  # @zhin.js/adapter-slack
2
2
 
3
- Zhin.js Slack 适配器,支持消息收发、Block Kit 交互与 Assistant API
3
+ Zhin.js Slack 适配器(Plugin Runtime),优先 Socket Mode,也可经 Runtime Host HTTP Events API 收发消息。
4
+
5
+ ## 功能
6
+
7
+ - **Socket Mode**(默认):WebSocket 长连接,无需公网 URL
8
+ - **HTTP Events API**:`httpHostToken` POST(签名验证),**非** legacy host-router/Koa
9
+ - 入站经 `messageGatewayToken`;出站 `send({ target, payload })` → `chat.postMessage` / Block Kit
10
+ - 约定式 `defineAdapter` / `definePlugin`(无需 `usePlugin`)
11
+ - Block Kit 按钮、斜杠命令、消息编辑、表情反应等(见 `agent/tools/`)
4
12
 
5
13
  ## 安装
6
14
 
@@ -8,293 +16,93 @@ Zhin.js 的 Slack 适配器,支持消息收发、Block Kit 交互与 Assistant
8
16
  pnpm add @zhin.js/adapter-slack
9
17
  ```
10
18
 
11
- ## 配置
12
-
13
- 通过 **`socketMode`** 选择连接方式。
19
+ ## Plugin Runtime
14
20
 
15
- ### 模式对比
21
+ - `@zhin.js/adapter` — 约定式 `adapters/slack.ts`(`defineAdapter`)
22
+ - `@zhin.js/core` — `messageGatewayToken` 入站/出站
23
+ - `@zhin.js/host-http` — 仅 HTTP 模式需要 `httpHostToken` 注册 Events 路由
24
+ - `@zhin.js/plugin-runtime` — `plugin.ts`(`definePlugin`)
25
+ - 配置经插件 `schema.json` 落到 `plugins.<instanceKey>`
16
26
 
17
- | 模式 | `socketMode` | 适用场景 | 额外字段 |
18
- |------|--------------|----------|----------|
19
- | **Socket Mode** | `true`(推荐本地/内网) | 无需公网 URL,WebSocket 长连接 | `appToken`(`xapp-...`) |
20
- | **HTTP Events** | `false` | 生产环境,有公网 HTTPS | 共享 zhin router 端口 8086 |
27
+ 入站:`gateway.receive({ adapter, target: channelId, content: text, sender, metadata })`
28
+ 出站:`send({ target, payload })` → Web API(`target` 可为 `channel` 或 `channel:thread_ts`)
21
29
 
22
- ### Socket Mode(推荐开发环境)
30
+ ### 平台权限(platform permit)
23
31
 
24
- 可选 `clientPingTimeout`(毫秒,默认 `15000`)用于调整 Socket Mode 客户端心跳超时,减少误报 pong 警告。
32
+ - `plugin.ts` 已注册 checker,Runtime Tool 权限统一经 Core `canAccessTool()`;当前 Slack 入站没有可靠 sender role 时,受限工具按 fail-closed 拒绝,不会静默放行。
25
33
 
26
- ```typescript
27
- import { defineConfig } from 'zhin.js'
34
+ ## 模式对比
28
35
 
29
- export default defineConfig({
30
- endpoints: [
31
- {
32
- name: 'my-slack-bot',
33
- context: 'slack',
34
- token: 'xoxb-your-bot-token',
35
- signingSecret: 'your-signing-secret',
36
- appToken: 'xapp-your-app-token',
37
- socketMode: true
38
- }
39
- ]
40
- })
36
+ | 模式 | `socketMode` | 适用场景 | 额外字段 |
37
+ |------|--------------|----------|----------|
38
+ | **Socket Mode**(默认) | `true` | 本地/内网,无需公网 URL | `appToken`(`xapp-...`) |
39
+ | **HTTP Events** | `false` | 生产环境有公网 HTTPS | `signingSecret` + Runtime Host |
40
+
41
+ ## 最小配置(Socket Mode)
42
+
43
+ ```yaml
44
+ # zhin.config.yml(Plugin Runtime)
45
+ plugins:
46
+ slack:
47
+ name: my-slack-bot
48
+ token: ${SLACK_BOT_TOKEN}
49
+ appToken: ${SLACK_APP_TOKEN}
50
+ socketMode: true # 默认 true,可省略
41
51
  ```
42
52
 
43
- ### HTTP 模式(生产环境,使用 zhin Router)
44
-
45
- HTTP 模式共享 zhin.js 内置的 Koa Router(默认端口 8086),无需额外监听端口。
46
-
47
- ```typescript
48
- import { defineConfig } from 'zhin.js'
53
+ ## HTTP Events 配置
49
54
 
50
- export default defineConfig({
51
- endpoints: [
52
- {
53
- name: 'my-slack-bot',
54
- context: 'slack',
55
- token: 'xoxb-your-bot-token',
56
- signingSecret: 'your-signing-secret',
57
- socketMode: false
58
- }
59
- ]
60
- })
55
+ ```yaml
56
+ plugins:
57
+ slack:
58
+ name: my-slack-bot
59
+ token: ${SLACK_BOT_TOKEN}
60
+ signingSecret: ${SLACK_SIGNING_SECRET}
61
+ socketMode: false
62
+ webhookPath: /slack/events # 可选,默认 /slack/events
61
63
  ```
62
64
 
63
- **HTTP 模式前置条件:**
65
+ 根插件 `zhin.plugins`(或项目图)需引用 `@zhin.js/adapter-slack`(`instanceKey: slack`)。
66
+ HTTP 模式下 Runtime Host(`http`)须已 listen;Slack App 的 Event Subscriptions / Interactivity / Slash Commands Request URL 指向 `https://your-domain/slack/events`。
64
67
 
65
- - Slack App 中配置 **Event Subscriptions** 的 Request URL 为 `https://your-domain:8086/slack/events`
66
- - 配置 **Interactivity & Shortcuts** 的 Request URL 为同一地址
67
- - 配置 **Slash Commands** 的 Request URL 为同一地址
68
- - 防火墙 / 反向代理放行端口
68
+ ## 环境变量
69
69
 
70
- ## 功能特性
71
-
72
- - 收发文本消息
73
- - 富媒体(图片、文件),经 `files.uploadV2` 上传
74
- - 消息格式化(Slack mrkdwn + Block Kit)
75
- - 回复消息与线程(`thread_ts`)
76
- - 提及(@用户、#频道)
77
- - 链接与附件
78
- - Socket Mode 与 HTTP 模式(共享 zhin router)
79
- - 私信与频道消息
80
- - Block Kit 交互按钮(`keyboard` 片段 → 原生 Slack 按钮)
81
- - 斜杠命令 → zhin Command 映射
82
- - 消息编辑(`$editMessage` / `chat.update`)
83
- - Notice 事件映射(`member_joined`、`reaction_added`、`pin_added` 等)
84
- - Assistant API 支持(`assistant_thread_started` 事件)
85
- - 出站 Markdown → Slack mrkdwn 自动转换(`**粗体**` → `*粗体*`)
86
- - 长消息自动分段(超 2900 字符切 section;超 48 blocks 分多条发送)
87
- - 斜杠命令即时 ephemeral 反馈(「处理中…」);最终回复仍 `chat.postMessage`
88
- - 按钮点击即时 ephemeral 反馈(「已收到」)
89
- - 入站 Slack mrkdwn → 通用 Markdown(粗体/斜体/删除线/代码/链接)
70
+ | 变量 | 说明 |
71
+ |------|------|
72
+ | `SLACK_BOT_TOKEN` / `SLACK_TOKEN` | Bot User OAuth Token(`xoxb-...`) |
73
+ | `SLACK_APP_TOKEN` | App-Level Token(Socket Mode,`xapp-...`) |
74
+ | `SLACK_SIGNING_SECRET` | Signing Secret(HTTP 模式) |
75
+ | `SLACK_BOT_NAME` | 可选 endpoint 名称 |
90
76
 
91
77
  ## 消息格式
92
78
 
93
79
  ### 出站(Markdown → mrkdwn)
94
80
 
95
- AI 或命令输出的通用 Markdown(如 `**粗体**`、`*斜体*`)会自动转换为 Slack mrkdwn,并通过 Block Kit `section` 块发送,确保在 Slack 客户端正确渲染。
96
-
97
- ### 长消息
98
-
99
- - 单条 `section` 文本超过约 2900 字符时自动切分为多个 section
100
- - 单条消息 blocks 超过 48 个时自动拆分为多条 `chat.postMessage`
81
+ 通用 Markdown(如 `**粗体**`)会转换为 Slack mrkdwn,并通过 Block Kit `section` 发送。
101
82
 
102
83
  ### 入站(mrkdwn → Markdown)
103
84
 
104
- 用户发送的 Slack mrkdwn 在解析为 `text` 段前会转换为通用 Markdown:
105
-
106
85
  | Slack mrkdwn | 通用 Markdown |
107
86
  |--------------|---------------|
108
87
  | `*bold*` | `**bold**` |
109
88
  | `_italic_` | `*italic*` |
110
89
  | `~strike~` | `~~strike~~` |
111
- | `` `code` `` | 保持 |
112
90
  | `<url\|text>` | `[text](url)` |
113
91
 
114
- `<@U>` / `<#C>` 等特殊段仍由专用解析器处理,不在此转换。该转换为启发式,复杂嵌套格式不保证完美往返。
115
-
116
- ## 交互反馈
117
-
118
- ### 斜杠命令
119
-
120
- 收到斜杠命令后,适配器会立即向触发者发送 ephemeral「处理中…」(仅触发者可见)。命令处理完成后的最终回复仍通过 `chat.postMessage` 发送到频道,与现有 `$reply` 行为一致。
121
-
122
- ### Block Kit 按钮
123
-
124
- 用户点击 `block_actions` 按钮后,适配器会向点击者发送 ephemeral「已收到」。如需在线程中回复,仍通过 `sendMessage`(`thread_ts`)发送。
125
-
126
- ## 创建 Slack App
127
-
128
- 1. 前往 [Slack API](https://api.slack.com/apps)
129
- 2. 创建新应用
130
- 3. 添加 Bot Token Scopes:
131
- - `chat:write` — 发送消息
132
- - `chat:write.public` — 向公开频道发送消息
133
- - `channels:read` — 查看频道基本信息
134
- - `channels:history` — 查看频道消息历史
135
- - `channels:manage` — 管理频道
136
- - `groups:read` — 查看私有频道基本信息
137
- - `groups:history` — 查看私有频道消息历史
138
- - `im:read` — 查看私信基本信息
139
- - `im:history` — 查看私信消息历史
140
- - `mpim:read` — 查看群组私信基本信息
141
- - `mpim:history` — 查看群组私信消息历史
142
- - `users:read` — 查看用户信息
143
- - `files:read` — 查看文件
144
- - `files:write` — 上传文件
145
- - `reactions:read` — 查看表情回应
146
- - `reactions:write` — 添加/移除表情回应
147
- - `pins:read` — 查看置顶项
148
- - `pins:write` — 置顶/取消置顶消息
149
- - `commands` — 添加斜杠命令
150
- - `assistant:write` — Assistant API(若使用 AI 功能)
151
- 4. 启用 Socket Mode(若使用 Socket Mode):
152
- - 进入 Socket Mode 设置
153
- - 启用 Socket Mode
154
- - 生成带 `connections:write` scope 的应用级 Token
155
- 5. 订阅 Bot 事件:
156
- - `message.channels` — 公开频道消息
157
- - `message.groups` — 私有频道消息
158
- - `message.im` — 私信
159
- - `message.mpim` — 群组私信
160
- - `app_mention` — Bot 被 @ 提及时
161
- - `member_joined_channel` — 用户加入频道
162
- - `member_left_channel` — 用户离开频道
163
- - `reaction_added` — 添加表情回应
164
- - `reaction_removed` — 移除表情回应
165
- - `channel_archive` / `channel_unarchive`
166
- - `channel_rename` / `channel_created` / `channel_deleted`
167
- - `pin_added` / `pin_removed`
168
- - `team_join` — 新用户加入工作区
169
- - `assistant_thread_started`(若使用 Assistant API)
170
- - `assistant_thread_context_changed`(若使用 Assistant API)
171
- 6. 将应用安装到工作区
172
- 7. 复制 Bot User OAuth Token(`xoxb-...`)
173
- 8. 复制 Signing Secret
174
- 9. 若使用 Socket Mode,复制 App-Level Token(`xapp-...`)
175
-
176
- ## 使用示例
177
-
178
- ### 基础消息处理
179
-
180
- ```typescript
181
- import { usePlugin, MessageCommand } from 'zhin.js'
182
-
183
- const { addCommand } = usePlugin()
184
-
185
- addCommand(new MessageCommand('hello')
186
- .action(async (message) => {
187
- return 'Hello from Slack!'
188
- })
189
- )
190
- ```
191
-
192
- ### 发送带 Block Kit 按钮的富消息
193
-
194
- ```typescript
195
- addCommand(new MessageCommand('vote')
196
- .action(async (message) => {
197
- return [
198
- { type: 'text', data: { text: 'What do you think?' } },
199
- {
200
- type: 'keyboard',
201
- data: {
202
- rows: [[
203
- { label: 'Approve', id: 'vote_yes', style: 'primary' },
204
- { label: 'Reject', id: 'vote_no', style: 'danger' },
205
- ]]
206
- }
207
- }
208
- ]
209
- })
210
- )
211
- ```
212
-
213
- ### 在线程中回复
214
-
215
- ```typescript
216
- addCommand(new MessageCommand('thread')
217
- .action(async (message) => {
218
- await message.$reply('This is a threaded reply!', true)
219
- })
220
- )
221
- ```
222
-
223
- ### 编辑消息
224
-
225
- 适配器支持 core `EditMessageOptions` 契约。`messageId` 优先使用 `channel:ts` 格式;若仅为 `ts`,则使用 `options.id` 作为 channel。
226
-
227
- ```typescript
228
- const adapter = inject('slack')
229
-
230
- // 旧 API(薄封装,仍可用)
231
- await adapter.editMessage('my-slack-bot', 'C001', '1700000000.000000', [
232
- { type: 'text', data: { text: 'Updated message content' } }
233
- ])
234
-
235
- // core 契约(推荐)
236
- await adapter.editMessage({
237
- messageId: 'C001:1700000000.000000',
238
- context: 'slack',
239
- endpoint: 'my-slack-bot',
240
- id: 'C001',
241
- type: 'group',
242
- content: [{ type: 'text', data: { text: 'Updated message content' } }],
243
- })
244
- ```
245
-
246
- ## Slack MCP Server 集成
247
-
248
- 如果你的 zhin 实例使用了 `@zhin.js/agent`(AI 功能),可以将 Slack MCP Server 配置为 AI 的工具来源:
249
-
250
- ```typescript
251
- export default defineConfig({
252
- ai: {
253
- mcpServers: {
254
- slack: {
255
- command: 'npx',
256
- args: ['-y', '@anthropic/slack-mcp-server'],
257
- env: {
258
- SLACK_BOT_TOKEN: 'xoxb-your-bot-token',
259
- SLACK_TEAM_ID: 'T0123456789'
260
- }
261
- }
262
- }
263
- }
264
- })
265
- ```
266
-
267
- 这将使 AI Agent 获得搜索 Slack 消息、管理频道等额外能力。
268
-
269
- ## Notice 事件映射
270
-
271
- | Slack 事件 | zhin Notice 类型 |
272
- |---|---|
273
- | `member_joined_channel` | `notice.group.member_increase` |
274
- | `member_left_channel` | `notice.group.member_decrease` |
275
- | `reaction_added` / `reaction_removed` | `notice.group.emoji_reaction` |
276
- | `message_deleted` | `notice.group.recall` |
277
- | `team_join` | `notice.friend.increase` |
278
- | `channel_archive` | `notice.slack.channel_archive` |
279
- | `pin_added` / `pin_removed` | `notice.slack.pin_added` / `notice.slack.pin_removed` |
280
-
281
92
  ## AI 工具
282
93
 
283
94
  | 类别 | 路径 |
284
95
  |------|------|
285
96
  | Permit 词汇 | `agent/PERMITS.md` |
286
- | 平台工具(11 个) | `agent/tools/`(`slack_*`:邀请、话题、反应、置顶等) |
97
+ | 平台工具 | `agent/tools/`(邀请、话题、反应、置顶、编辑等) |
287
98
  | 技能说明 | `agent/skills/slack.md` |
288
- | 群管标准工具 | `createSceneManagementTools()` |
289
-
290
99
 
291
100
  ## 限制
292
101
 
293
- - 入站 mrkdwn → Markdown 为启发式转换,复杂嵌套格式不保证完美往返
294
- - Modals / `view_submission` / `view_closed` — 暂不支持
295
- - Select menus / options load — 暂不支持
296
- - File 事件全系列(`file_created` / `file_shared` 等)— 暂不支持
102
+ - 入站 mrkdwn → Markdown 为启发式转换
103
+ - Modals / Select menus — 暂不支持
297
104
  - OAuth 安装流程 — 暂不支持
105
+ - 旧 `usePlugin` / `extends Adapter` / host-router 生产入口已删除
298
106
 
299
107
  ## 许可证
300
108
 
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Convention entry: discover `adapters/slack.ts` → defineAdapter.
3
+ */
4
+ import { defineAdapter } from '@zhin.js/adapter';
5
+ import { messageGatewayToken } from '@zhin.js/core/runtime';
6
+ import { httpHostToken } from '@zhin.js/host-http';
7
+ import { SlackEndpoint } from '../src/endpoint.js';
8
+ import {
9
+ resolveSlackConfig,
10
+ type SlackAdapterConfig,
11
+ } from '../src/protocol.js';
12
+
13
+ export { SlackEndpoint } from '../src/endpoint.js';
14
+ export type { SlackEndpointOptions, SlackSocketLike, SlackWebClientLike } from '../src/endpoint.js';
15
+
16
+ export default defineAdapter<SlackAdapterConfig>({
17
+ capabilities: ['inbound', 'outbound'],
18
+ create(context) {
19
+ const config = resolveSlackConfig(context.config);
20
+ if (config.mode === 'http') {
21
+ return new SlackEndpoint({
22
+ id: context.id,
23
+ gateway: context.use(messageGatewayToken),
24
+ http: context.use(httpHostToken),
25
+ config,
26
+ });
27
+ }
28
+ return new SlackEndpoint({
29
+ id: context.id,
30
+ gateway: context.use(messageGatewayToken),
31
+ config,
32
+ });
33
+ },
34
+ });
@@ -1,8 +1,8 @@
1
- import { defineTool } from '@zhin.js/agent/tools';
1
+ import { defineAgentTool } from '@zhin.js/agent/tools';
2
2
  import { z } from 'zod';
3
3
  import { getSlackAgentDeps } from '../../src/slack-agent-deps.js';
4
4
 
5
- export default defineTool<{
5
+ export default defineAgentTool<{
6
6
  endpoint_id: string;
7
7
  channel: string;
8
8
  timestamp: string;
@@ -1,9 +1,9 @@
1
- import { defineTool } from '@zhin.js/agent/tools';
1
+ import { defineAgentTool } from '@zhin.js/agent/tools';
2
2
  import { z } from 'zod';
3
3
  import { platformPermit } from '../../src/platform-permit.js';
4
4
  import { getSlackAgentDeps } from '../../src/slack-agent-deps.js';
5
5
 
6
- export default defineTool<{
6
+ export default defineAgentTool<{
7
7
  endpoint_id: string;
8
8
  channel: string;
9
9
  }>({
@@ -1,8 +1,8 @@
1
- import { defineTool } from '@zhin.js/agent/tools';
1
+ import { defineAgentTool } from '@zhin.js/agent/tools';
2
2
  import { z } from 'zod';
3
3
  import { getSlackAgentDeps } from '../../src/slack-agent-deps.js';
4
4
 
5
- export default defineTool<{
5
+ export default defineAgentTool<{
6
6
  endpoint_id: string;
7
7
  channel: string;
8
8
  message_ts: string;
@@ -18,8 +18,9 @@ export default defineTool<{
18
18
  platforms: ['slack'],
19
19
  tags: ['slack'],
20
20
  async execute({ endpoint_id, channel, message_ts, text }) {
21
- const { getAdapter } = getSlackAgentDeps();
22
- await getAdapter().editMessage(endpoint_id, channel, message_ts, [
21
+ const { getEndpoint } = getSlackAgentDeps();
22
+ const endpoint = getEndpoint(endpoint_id);
23
+ await endpoint.editMessage(channel, message_ts, [
23
24
  { type: 'text', data: { text } },
24
25
  ]);
25
26
  return { success: true, message: '消息已编辑' };
@@ -1,9 +1,9 @@
1
- import { defineTool } from '@zhin.js/agent/tools';
1
+ import { defineAgentTool } from '@zhin.js/agent/tools';
2
2
  import { z } from 'zod';
3
3
  import { platformPermit } from '../../src/platform-permit.js';
4
4
  import { getSlackAgentDeps } from '../../src/slack-agent-deps.js';
5
5
 
6
- export default defineTool<{
6
+ export default defineAgentTool<{
7
7
  endpoint_id: string;
8
8
  channel: string;
9
9
  users: string;
@@ -1,9 +1,9 @@
1
- import { defineTool } from '@zhin.js/agent/tools';
1
+ import { defineAgentTool } from '@zhin.js/agent/tools';
2
2
  import { z } from 'zod';
3
3
  import { platformPermit } from '../../src/platform-permit.js';
4
4
  import { getSlackAgentDeps } from '../../src/slack-agent-deps.js';
5
5
 
6
- export default defineTool<{
6
+ export default defineAgentTool<{
7
7
  endpoint_id: string;
8
8
  channel: string;
9
9
  timestamp: string;
@@ -1,8 +1,8 @@
1
- import { defineTool } from '@zhin.js/agent/tools';
1
+ import { defineAgentTool } from '@zhin.js/agent/tools';
2
2
  import { z } from 'zod';
3
3
  import { getSlackAgentDeps } from '../../src/slack-agent-deps.js';
4
4
 
5
- export default defineTool<{
5
+ export default defineAgentTool<{
6
6
  endpoint_id: string;
7
7
  channel_id: string;
8
8
  timestamp: string;
@@ -1,9 +1,9 @@
1
- import { defineTool } from '@zhin.js/agent/tools';
1
+ import { defineAgentTool } from '@zhin.js/agent/tools';
2
2
  import { z } from 'zod';
3
3
  import { platformPermit } from '../../src/platform-permit.js';
4
4
  import { getSlackAgentDeps } from '../../src/slack-agent-deps.js';
5
5
 
6
- export default defineTool<{
6
+ export default defineAgentTool<{
7
7
  endpoint_id: string;
8
8
  channel_id: string;
9
9
  purpose: string;
@@ -1,9 +1,9 @@
1
- import { defineTool } from '@zhin.js/agent/tools';
1
+ import { defineAgentTool } from '@zhin.js/agent/tools';
2
2
  import { z } from 'zod';
3
3
  import { platformPermit } from '../../src/platform-permit.js';
4
4
  import { getSlackAgentDeps } from '../../src/slack-agent-deps.js';
5
5
 
6
- export default defineTool<{
6
+ export default defineAgentTool<{
7
7
  endpoint_id: string;
8
8
  channel: string;
9
9
  topic: string;
@@ -1,9 +1,9 @@
1
- import { defineTool } from '@zhin.js/agent/tools';
1
+ import { defineAgentTool } from '@zhin.js/agent/tools';
2
2
  import { z } from 'zod';
3
3
  import { platformPermit } from '../../src/platform-permit.js';
4
4
  import { getSlackAgentDeps } from '../../src/slack-agent-deps.js';
5
5
 
6
- export default defineTool<{
6
+ export default defineAgentTool<{
7
7
  endpoint_id: string;
8
8
  channel_id: string;
9
9
  }>({
@@ -1,9 +1,9 @@
1
- import { defineTool } from '@zhin.js/agent/tools';
1
+ import { defineAgentTool } from '@zhin.js/agent/tools';
2
2
  import { z } from 'zod';
3
3
  import { platformPermit } from '../../src/platform-permit.js';
4
4
  import { getSlackAgentDeps } from '../../src/slack-agent-deps.js';
5
5
 
6
- export default defineTool<{
6
+ export default defineAgentTool<{
7
7
  endpoint_id: string;
8
8
  channel_id: string;
9
9
  timestamp: string;
@@ -1,8 +1,8 @@
1
- import { defineTool } from '@zhin.js/agent/tools';
1
+ import { defineAgentTool } from '@zhin.js/agent/tools';
2
2
  import { z } from 'zod';
3
3
  import { getSlackAgentDeps } from '../../src/slack-agent-deps.js';
4
4
 
5
- export default defineTool<{
5
+ export default defineAgentTool<{
6
6
  endpoint_id: string;
7
7
  user_id: string;
8
8
  }>({