@zhin.js/adapter-slack 4.1.0 → 5.0.0

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 +71 -0
  2. package/README.md +76 -252
  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 +149 -0
  16. package/lib/endpoint.js +339 -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 +59 -0
  44. package/src/endpoint.ts +322 -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/lib/webhook.js ADDED
@@ -0,0 +1,69 @@
1
+ import { getLogger } from '@zhin.js/logger';
2
+ import { headerValue, readTextBody, verifySlackSignature, } from './protocol.js';
3
+ const logger = getLogger('slack');
4
+ export function registerSlackWebhookRoutes(http, handler) {
5
+ const path = handler.config.webhookPath;
6
+ return [
7
+ http.route('POST', path, async (request, response) => {
8
+ await handleSlackWebhookRequest(request, response, handler);
9
+ }, { summary: 'Slack Events API / Interactivity', tags: ['slack'] }),
10
+ ];
11
+ }
12
+ export async function handleSlackWebhookRequest(request, response, handler) {
13
+ try {
14
+ const rawBody = await readTextBody(request);
15
+ const timestamp = headerValue(request.headers, 'x-slack-request-timestamp');
16
+ const signature = headerValue(request.headers, 'x-slack-signature');
17
+ if (!verifySlackSignature(handler.config.signingSecret, rawBody, timestamp, signature)) {
18
+ response.writeHead(401, { 'Content-Type': 'text/plain' });
19
+ response.end('Invalid signature');
20
+ return;
21
+ }
22
+ const contentType = headerValue(request.headers, 'content-type');
23
+ if (contentType.includes('application/x-www-form-urlencoded')) {
24
+ const params = new URLSearchParams(rawBody);
25
+ const payloadStr = params.get('payload');
26
+ if (payloadStr) {
27
+ response.writeHead(200);
28
+ response.end('');
29
+ handler.admitInteraction(JSON.parse(payloadStr));
30
+ return;
31
+ }
32
+ const body = Object.fromEntries(params);
33
+ if (body.command) {
34
+ response.writeHead(200);
35
+ response.end('');
36
+ handler.admitSlashCommand(body);
37
+ return;
38
+ }
39
+ }
40
+ let envelope;
41
+ try {
42
+ envelope = JSON.parse(rawBody);
43
+ }
44
+ catch {
45
+ response.writeHead(200);
46
+ response.end('');
47
+ return;
48
+ }
49
+ if (envelope.type === 'url_verification') {
50
+ const challenge = envelope.challenge;
51
+ response.writeHead(200, { 'Content-Type': 'application/json' });
52
+ response.end(JSON.stringify({ challenge }));
53
+ return;
54
+ }
55
+ if (envelope.type === 'event_callback' && envelope.event) {
56
+ response.writeHead(200);
57
+ response.end('');
58
+ handler.handleEnvelope(envelope);
59
+ return;
60
+ }
61
+ response.writeHead(200);
62
+ response.end('');
63
+ }
64
+ catch (error) {
65
+ logger.error('Slack webhook error:', error);
66
+ response.writeHead(200);
67
+ response.end('');
68
+ }
69
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@zhin.js/adapter-slack",
3
- "version": "4.1.0",
4
- "description": "Zhin.js adapter for Slack",
3
+ "version": "5.0.0",
4
+ "description": "Zhin.js Slack adapter for Plugin Runtime (Socket Mode / HTTP Events)",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
7
7
  "types": "./lib/index.d.ts",
@@ -34,24 +34,23 @@
34
34
  "dependencies": {
35
35
  "@slack/socket-mode": "^2.0.3",
36
36
  "@slack/web-api": "^7.17.0",
37
- "@zhin.js/logger": "1.0.74"
38
- },
39
- "devDependencies": {
40
- "@types/node": "^26.1.0",
41
- "typescript": "^6.0.3",
42
- "zod": "^4.4.3",
43
- "@zhin.js/host-router": "2.0.3",
44
- "zhin.js": "4.1.2",
45
- "@zhin.js/agent": "1.0.3"
37
+ "@zhin.js/adapter": "1.1.0",
38
+ "@zhin.js/core": "1.4.0",
39
+ "@zhin.js/host-http": "1.0.2",
40
+ "@zhin.js/logger": "1.0.75",
41
+ "@zhin.js/plugin-runtime": "1.1.0"
46
42
  },
47
43
  "peerDependencies": {
48
44
  "zod": "^4.0.0",
49
- "zhin.js": "4.1.2",
50
- "@zhin.js/agent": "1.0.3",
51
- "@zhin.js/host-router": "2.0.3"
45
+ "@zhin.js/adapter": "1.1.0",
46
+ "@zhin.js/agent": "1.0.5",
47
+ "@zhin.js/core": "1.4.0",
48
+ "@zhin.js/host-http": "1.0.2",
49
+ "@zhin.js/plugin-runtime": "1.1.0",
50
+ "zhin.js": "5.0.0"
52
51
  },
53
52
  "peerDependenciesMeta": {
54
- "@zhin.js/host-router": {
53
+ "zhin.js": {
55
54
  "optional": true
56
55
  },
57
56
  "@zhin.js/agent": {
@@ -61,13 +60,21 @@
61
60
  "optional": true
62
61
  }
63
62
  },
63
+ "devDependencies": {
64
+ "@types/node": "^26.1.0",
65
+ "typescript": "^6.0.3",
66
+ "vitest": "^4.1.10",
67
+ "zod": "^4.4.3",
68
+ "@zhin.js/agent": "1.0.5",
69
+ "zhin.js": "5.0.0"
70
+ },
64
71
  "files": [
72
+ "adapters",
73
+ "plugin.ts",
74
+ "schema.json",
65
75
  "src",
66
76
  "lib",
67
77
  "agent",
68
- "client",
69
- "dist",
70
- "plugin.yml",
71
78
  "README.md",
72
79
  "CHANGELOG.md"
73
80
  ],
@@ -78,9 +85,23 @@
78
85
  "engines": {
79
86
  "node": "^20.19.0 || >=22.12.0"
80
87
  },
88
+ "zhin": {
89
+ "protocol": 1,
90
+ "type": "plugin",
91
+ "entry": "./plugin.ts",
92
+ "engine": "^1.0.0",
93
+ "runtime": "trusted",
94
+ "features": [
95
+ {
96
+ "package": "@zhin.js/adapter",
97
+ "api": "^1.0.0"
98
+ }
99
+ ],
100
+ "plugins": []
101
+ },
81
102
  "scripts": {
82
- "build": "pnpm build:node",
103
+ "build": "tsc",
83
104
  "clean": "rimraf lib",
84
- "build:node": "tsc"
105
+ "test": "NODE_OPTIONS=--experimental-strip-types vitest run --root ../../.. plugins/adapters/slack/tests"
85
106
  }
86
107
  }
package/plugin.ts ADDED
@@ -0,0 +1,13 @@
1
+ import { definePlugin } from '@zhin.js/plugin-runtime';
2
+ import { registerSlackPlatformPermitChecker } from './src/platform-permit.js';
3
+
4
+ export default definePlugin({
5
+ name: 'slack',
6
+ metadata: {
7
+ displayName: 'Slack Adapter',
8
+ },
9
+ setup() {
10
+ // 平台权限门禁:workspace_owner / channel_manager 等(agent 工具 platformPermit)
11
+ return registerSlackPlatformPermitChecker();
12
+ },
13
+ });
package/schema.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "object",
4
+ "additionalProperties": false,
5
+ "properties": {
6
+ "socketMode": {
7
+ "type": "boolean",
8
+ "default": true,
9
+ "description": "Prefer Socket Mode (default). Set false for HTTP Events via httpHostToken."
10
+ },
11
+ "webhookPath": {
12
+ "type": "string",
13
+ "default": "/slack/events"
14
+ },
15
+ "clientPingTimeout": {
16
+ "type": "number",
17
+ "default": 15000,
18
+ "description": "Socket Mode client ping timeout (ms)"
19
+ },
20
+ "endpoints": {
21
+ "type": "array",
22
+ "description": "多账号:一个插件实例挂多个 endpoint。每项与顶层字段同构(name 必填,其余覆盖顶层)",
23
+ "items": {
24
+ "type": "object",
25
+ "additionalProperties": true,
26
+ "properties": {
27
+ "name": {
28
+ "type": "string",
29
+ "description": "Slack bot name"
30
+ },
31
+ "token": {
32
+ "type": "string",
33
+ "description": "Bot User OAuth Token (xoxb-...)"
34
+ },
35
+ "signingSecret": {
36
+ "type": "string",
37
+ "description": "Required for HTTP Events API (socketMode: false)"
38
+ },
39
+ "appToken": {
40
+ "type": "string",
41
+ "description": "App-Level Token (xapp-...) for Socket Mode"
42
+ }
43
+ },
44
+ "required": [
45
+ "name",
46
+ "token"
47
+ ]
48
+ }
49
+ },
50
+ "commandPrefix": {
51
+ "type": "string",
52
+ "default": "",
53
+ "description": "命令前缀(默认 '' 无前缀,任意文本按命令匹配;如 '/' 要求 / 开头)。endpoints[i] 可逐项覆盖"
54
+ }
55
+ },
56
+ "required": [
57
+ "endpoints"
58
+ ]
59
+ }