@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/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": "4.1.1",
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.0.1",
38
+ "@zhin.js/core": "1.3.5",
39
+ "@zhin.js/host-http": "1.0.1",
40
+ "@zhin.js/logger": "1.0.75",
41
+ "@zhin.js/plugin-runtime": "1.0.1"
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.0.1",
46
+ "@zhin.js/agent": "1.0.4",
47
+ "@zhin.js/core": "1.3.5",
48
+ "@zhin.js/host-http": "1.0.1",
49
+ "@zhin.js/plugin-runtime": "1.0.1",
50
+ "zhin.js": "4.1.3"
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.4",
69
+ "zhin.js": "4.1.3"
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,38 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "object",
4
+ "additionalProperties": false,
5
+ "properties": {
6
+ "name": {
7
+ "type": "string",
8
+ "default": "slack-bot"
9
+ },
10
+ "token": {
11
+ "type": "string",
12
+ "description": "Bot User OAuth Token (xoxb-...)"
13
+ },
14
+ "signingSecret": {
15
+ "type": "string",
16
+ "description": "Required for HTTP Events API (socketMode: false)"
17
+ },
18
+ "appToken": {
19
+ "type": "string",
20
+ "description": "App-Level Token (xapp-...) for Socket Mode"
21
+ },
22
+ "socketMode": {
23
+ "type": "boolean",
24
+ "default": true,
25
+ "description": "Prefer Socket Mode (default). Set false for HTTP Events via httpHostToken."
26
+ },
27
+ "webhookPath": {
28
+ "type": "string",
29
+ "default": "/slack/events"
30
+ },
31
+ "clientPingTimeout": {
32
+ "type": "number",
33
+ "default": 15000,
34
+ "description": "Socket Mode client ping timeout (ms)"
35
+ }
36
+ },
37
+ "required": ["token"]
38
+ }