@amaster.ai/pi-channels 0.1.2-beta.8 → 0.1.2-beta.80

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 (62) hide show
  1. package/README.md +105 -43
  2. package/dist/adapters/dingtalk.d.ts +5 -0
  3. package/dist/adapters/dingtalk.d.ts.map +1 -0
  4. package/dist/adapters/dingtalk.js +269 -0
  5. package/dist/adapters/dingtalk.js.map +1 -0
  6. package/dist/adapters/feishu.d.ts.map +1 -1
  7. package/dist/adapters/feishu.js +245 -11
  8. package/dist/adapters/feishu.js.map +1 -1
  9. package/dist/adapters/webhook.d.ts.map +1 -1
  10. package/dist/adapters/webhook.js +11 -5
  11. package/dist/adapters/webhook.js.map +1 -1
  12. package/dist/adapters/wecom/adapter.d.ts +3 -1
  13. package/dist/adapters/wecom/adapter.d.ts.map +1 -1
  14. package/dist/adapters/wecom/adapter.js +194 -157
  15. package/dist/adapters/wecom/adapter.js.map +1 -1
  16. package/dist/adapters/wecom.d.ts +0 -2
  17. package/dist/adapters/wecom.d.ts.map +1 -1
  18. package/dist/adapters/wecom.js +0 -1
  19. package/dist/adapters/wecom.js.map +1 -1
  20. package/dist/bridge-provider.d.ts +3 -0
  21. package/dist/bridge-provider.d.ts.map +1 -0
  22. package/dist/bridge-provider.js +79 -0
  23. package/dist/bridge-provider.js.map +1 -0
  24. package/dist/bridge.d.ts +1 -0
  25. package/dist/bridge.d.ts.map +1 -1
  26. package/dist/bridge.js +435 -27
  27. package/dist/bridge.js.map +1 -1
  28. package/dist/config.d.ts +2 -1
  29. package/dist/config.d.ts.map +1 -1
  30. package/dist/config.js +96 -40
  31. package/dist/config.js.map +1 -1
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +564 -29
  34. package/dist/index.js.map +1 -1
  35. package/dist/registry.d.ts +15 -3
  36. package/dist/registry.d.ts.map +1 -1
  37. package/dist/registry.js +126 -25
  38. package/dist/registry.js.map +1 -1
  39. package/dist/types.d.ts +41 -13
  40. package/dist/types.d.ts.map +1 -1
  41. package/package.json +12 -6
  42. package/preview.png +0 -0
  43. package/dist/adapters/wecom/client.d.ts +0 -13
  44. package/dist/adapters/wecom/client.d.ts.map +0 -1
  45. package/dist/adapters/wecom/client.js +0 -116
  46. package/dist/adapters/wecom/client.js.map +0 -1
  47. package/dist/adapters/wecom/crypto.d.ts +0 -14
  48. package/dist/adapters/wecom/crypto.d.ts.map +0 -1
  49. package/dist/adapters/wecom/crypto.js +0 -37
  50. package/dist/adapters/wecom/crypto.js.map +0 -1
  51. package/dist/adapters/wecom/errors.d.ts +0 -25
  52. package/dist/adapters/wecom/errors.d.ts.map +0 -1
  53. package/dist/adapters/wecom/errors.js +0 -56
  54. package/dist/adapters/wecom/errors.js.map +0 -1
  55. package/dist/adapters/wecom/types.d.ts +0 -52
  56. package/dist/adapters/wecom/types.d.ts.map +0 -1
  57. package/dist/adapters/wecom/types.js +0 -2
  58. package/dist/adapters/wecom/types.js.map +0 -1
  59. package/dist/adapters/wecom/xml.d.ts +0 -4
  60. package/dist/adapters/wecom/xml.d.ts.map +0 -1
  61. package/dist/adapters/wecom/xml.js +0 -16
  62. package/dist/adapters/wecom/xml.js.map +0 -1
package/README.md CHANGED
@@ -1,30 +1,33 @@
1
1
  # @amaster.ai/pi-channels
2
2
 
3
+ ![pi-channels preview](https://raw.githubusercontent.com/TGYD-helige/pi/master/packages/pi-channels/preview.png)
4
+
3
5
  Pi extension for native messaging channels.
4
6
 
5
- This package follows the same extension shape as the open-source `@e9n/pi-channels`
6
- package: it registers a `notify` tool, channel events, route aliases, and an optional
7
- chat bridge that turns incoming channel messages into pi prompts.
7
+ This package follows the same extension shape as the open-source `@e9n/pi-channels` package: it registers a `notify` tool, channel events, route aliases, and an optional chat bridge that turns incoming channel messages into pi prompts.
8
+
9
+ It does not depend on `@e9n/pi-channels` at runtime. That package is published as a standalone extension source package with the older `@mariozechner/*` peer namespace and Slack/Telegram dependencies. This package keeps the same channel contract while targeting this repo's `@earendil-works/*` API surface and native Feishu/DingTalk/WeCom adapters.
10
+
11
+ ## Configuration
8
12
 
9
- It does not depend on `@e9n/pi-channels` at runtime. That package is published as
10
- a standalone extension source package with the older `@mariozechner/*` peer
11
- namespace and Slack/Telegram dependencies. This package keeps the same channel
12
- contract while targeting this repo's `@earendil-works/*` API surface and native
13
- Feishu/WeCom adapters.
13
+ Put the `pi-channels` section in `~/.pi/agent/settings.json`, the configured agent directory's `settings.json`, or a project/ancestor `.pi/settings.json`. Project-local files are read only after project trust is accepted. `${ENV_VAR}` interpolation is supported only in user and agent settings, not in project-local files. The direct credential environment variables documented in the examples still override loaded adapter values.
14
14
 
15
15
  ## Channels
16
16
 
17
- - `feishu` - Native Feishu/Lark app messaging backed by the official
18
- `@larksuiteoapi/node-sdk`. Supports outgoing text messages, WebSocket events
19
- by default, and HTTP event callbacks as a fallback.
20
- - `wecom` - Native WeCom self-built app messaging. Supports outgoing text
21
- messages, appchat messages, encrypted HTTP callbacks for text messages, token
22
- caching, request timeouts, and actionable API errors such as trusted-IP
23
- failures.
17
+ - `feishu` - Native Feishu/Lark app messaging backed by the official `@larksuiteoapi/node-sdk`. Supports outgoing text messages, WebSocket events by default, HTTP event callbacks as a fallback, and incoming text, post, and image messages. Incoming images are downloaded to a temporary file and passed to the Pi bridge as image input; the Feishu app must be allowed to download message resources.
18
+ - `wecom` - Native WeCom intelligent bot messaging backed by the official
19
+ `@wecom/aibot-node-sdk`. Supports WebSocket long connection events and active
20
+ Markdown pushes with Bot ID / Secret credentials.
21
+ - `dingtalk` - Native DingTalk app bot messaging backed by the official
22
+ `dingtalk-stream` SDK. Supports Stream mode incoming bot messages, reply
23
+ messages through `sessionWebhook`, and active group text pushes through the
24
+ DingTalk OpenAPI.
24
25
  - `webhook` - Generic outgoing HTTP requests.
25
26
 
26
27
  ## Example
27
28
 
29
+ The `${...}` placeholders below assume this section is stored in user or agent settings. For trusted project settings, use the corresponding direct credential environment variables or literal non-secret values.
30
+
28
31
  ```json
29
32
  {
30
33
  "pi-channels": {
@@ -38,17 +41,18 @@ Feishu/WeCom adapters.
38
41
  },
39
42
  "wecom": {
40
43
  "type": "wecom",
41
- "corpId": "${WECOM_CORP_ID}",
42
- "agentId": "${WECOM_AGENT_ID}",
43
- "secret": "${WECOM_SECRET}",
44
- "timeoutMs": 15000,
45
- "token": "${WECOM_CALLBACK_TOKEN}",
46
- "encodingAesKey": "${WECOM_ENCODING_AES_KEY}",
47
- "incoming": {
48
- "enabled": true,
49
- "port": 8788,
50
- "path": "/wecom/events"
51
- }
44
+ "botId": "${WECOM_BOT_ID}",
45
+ "secret": "${WECOM_BOT_SECRET}",
46
+ "eventMode": "websocket",
47
+ "respondToMentionsOnly": true,
48
+ "timeoutMs": 15000
49
+ },
50
+ "dingtalk": {
51
+ "type": "dingtalk",
52
+ "clientId": "${DINGTALK_CLIENT_ID}",
53
+ "clientSecret": "${DINGTALK_CLIENT_SECRET}",
54
+ "eventMode": "stream",
55
+ "respondToMentionsOnly": true
52
56
  }
53
57
  },
54
58
  "routes": {
@@ -64,10 +68,34 @@ Feishu/WeCom adapters.
64
68
  }
65
69
  ```
66
70
 
71
+ ### Bridge extensions
72
+
73
+ The bridge answers each incoming message from a child Pi process started with
74
+ `--offline --no-extensions`, so installed extensions never load implicitly (the
75
+ channel extension itself included, which keeps a child from opening a second
76
+ Stream connection). List the extension sources a child session may load in
77
+ `bridge.extensions`; every entry is passed as a repeatable `-e <source>`, using
78
+ the same path / npm / git sources `pi --extension` accepts:
79
+
80
+ ```json
81
+ {
82
+ "pi-channels": {
83
+ "bridge": {
84
+ "enabled": true,
85
+ "extensions": ["npm:@example/pi-memory", "./local-extension.ts"]
86
+ }
87
+ }
88
+ }
89
+ ```
90
+
91
+ Blank, duplicate and flag-like entries are ignored. Because the child runs
92
+ offline, `npm:` / `git:` entries are loaded from the user-scope install instead
93
+ of being fetched — install the package first (`pi install npm:@example/pi-memory`),
94
+ or the entry is skipped. Omit the key to keep child sessions free of extensions.
95
+
67
96
  ### Feishu modes
68
97
 
69
- WebSocket is the default and recommended mode because it does not require a
70
- public callback URL:
98
+ WebSocket is the default and recommended mode because it does not require a public callback URL:
71
99
 
72
100
  ```json
73
101
  {
@@ -80,9 +108,7 @@ public callback URL:
80
108
  }
81
109
  ```
82
110
 
83
- Use HTTP callback mode when the deployment already exposes a Feishu event URL.
84
- The SDK handles challenge responses, token verification, and encrypted event
85
- payloads:
111
+ Use HTTP callback mode when the deployment already exposes a Feishu event URL. The SDK handles challenge responses, token verification, and encrypted event payloads. `encryptKey` is required in HTTP mode because it is used to verify ordinary event signatures; `verificationToken` alone is not sufficient:
86
112
 
87
113
  ```json
88
114
  {
@@ -102,6 +128,42 @@ payloads:
102
128
 
103
129
  Set `"eventMode": "off"` for outgoing-only usage.
104
130
 
131
+ ### DingTalk modes
132
+
133
+ Create a DingTalk internal app, add the bot capability, select Stream mode, and publish it. Copy the Client ID and Client Secret into the adapter config:
134
+
135
+ ```json
136
+ {
137
+ "type": "dingtalk",
138
+ "clientId": "${DINGTALK_CLIENT_ID}",
139
+ "clientSecret": "${DINGTALK_CLIENT_SECRET}",
140
+ "robotCode": "${DINGTALK_ROBOT_CODE}",
141
+ "eventMode": "stream",
142
+ "respondToMentionsOnly": true,
143
+ "allowedConversationIds": ["cid_xxx"]
144
+ }
145
+ ```
146
+
147
+ Incoming replies use the per-message `sessionWebhook` when available. Active route sends use DingTalk's group message OpenAPI with the route recipient as the conversation/openConversationId. `robotCode` defaults to `clientId` when omitted.
148
+
149
+ Set `"eventMode": "off"` when the bot should only send messages.
150
+
151
+ ### WeCom modes
152
+
153
+ Create an intelligent bot in the WeCom admin console, choose API mode, and select the long connection option. Copy the Bot ID and Secret into the adapter config:
154
+
155
+ ```json
156
+ {
157
+ "type": "wecom",
158
+ "botId": "${WECOM_BOT_ID}",
159
+ "secret": "${WECOM_BOT_SECRET}",
160
+ "eventMode": "websocket",
161
+ "allowedChatIds": ["wr_xxx"]
162
+ }
163
+ ```
164
+
165
+ Set `"eventMode": "off"` when the bot should only send messages.
166
+
105
167
  ## Tool
106
168
 
107
169
  ```text
@@ -110,8 +172,7 @@ notify(action: "list")
110
172
  notify(action: "test", adapter: "ops")
111
173
  ```
112
174
 
113
- For Feishu, recipients default to `chat_id`. Prefix the recipient to override the
114
- receive id type:
175
+ For Feishu, recipients default to `chat_id`. Prefix the recipient to override the receive id type:
115
176
 
116
177
  ```text
117
178
  chat_id:oc_xxx
@@ -120,20 +181,20 @@ user_id:abc123
120
181
  email:name@example.com
121
182
  ```
122
183
 
123
- For WeCom, recipients default to `touser`. Prefix the recipient to send to parties
124
- or tags. Prefix with `chat:` or `appchat:` to use the WeCom appchat API:
184
+ For WeCom intelligent bots, recipients are the conversation ids used by the Bot API. In a group, send one message to the bot and use route capture to fill the group `chatid`; for one-to-one pushes, use the target user's userid:
125
185
 
126
186
  ```text
127
- user:zhangsan
128
- party:2
129
- tag:7
130
- appchat:chat-id
187
+ wr_xxx
188
+ zhangsan
131
189
  ```
132
190
 
133
- If WeCom returns `60020 not allow to access from your ip`, the adapter raises a
134
- typed `WeComApiError` with category `ip_whitelist`. Configure the trusted IP in
135
- the WeCom console, or run pi behind a fixed egress proxy that is allowed by the
136
- enterprise.
191
+ The intelligent bot adapter uses the WebSocket Bot API, so long connection mode does not require a public callback URL.
192
+
193
+ For DingTalk app bots, send one message to the bot and use route capture to fill the group conversation id:
194
+
195
+ ```text
196
+ cid_xxx
197
+ ```
137
198
 
138
199
  ## Events
139
200
 
@@ -147,6 +208,7 @@ enterprise.
147
208
 
148
209
  ```text
149
210
  /channel list
211
+ /channel reload
150
212
  /channel bridge on
151
213
  /channel bridge off
152
214
  /channel bridge status
@@ -0,0 +1,5 @@
1
+ import type { AdapterConfig, ChannelAdapter } from '../types.js';
2
+ export declare function createDingTalkAdapter(config: AdapterConfig, context?: {
3
+ log?: (event: string, data?: Record<string, unknown>, level?: string) => void;
4
+ }): ChannelAdapter;
5
+ //# sourceMappingURL=dingtalk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dingtalk.d.ts","sourceRoot":"","sources":["../../src/adapters/dingtalk.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EAIf,MAAM,aAAa,CAAC;AAsMrB,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE;IACP,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1E,GACL,cAAc,CA+IhB"}
@@ -0,0 +1,269 @@
1
+ const DEFAULT_OPEN_API_BASE_URL = 'https://api.dingtalk.com';
2
+ const DEFAULT_TOKEN_URL = 'https://oapi.dingtalk.com/gettoken';
3
+ const DINGTALK_TEXT_MSG_KEY = 'sampleText';
4
+ function asConfig(config) {
5
+ return config;
6
+ }
7
+ function requireString(value, name) {
8
+ if (typeof value === 'string' && value.trim())
9
+ return value.trim();
10
+ if (typeof value === 'number' && Number.isFinite(value))
11
+ return String(value);
12
+ throw new Error(`DingTalk adapter requires ${name}`);
13
+ }
14
+ function optionalString(value) {
15
+ return typeof value === 'string' && value.trim() ? value.trim() : undefined;
16
+ }
17
+ function normalizeConfig(config) {
18
+ const cfg = asConfig(config);
19
+ const clientId = requireString(cfg.clientId, 'clientId');
20
+ return {
21
+ ...cfg,
22
+ clientId,
23
+ clientSecret: requireString(cfg.clientSecret, 'clientSecret'),
24
+ robotCode: optionalString(cfg.robotCode) ?? clientId,
25
+ eventMode: cfg.eventMode === 'off' ? 'off' : 'stream',
26
+ openApiBaseUrl: optionalString(cfg.openApiBaseUrl) ?? DEFAULT_OPEN_API_BASE_URL,
27
+ tokenUrl: optionalString(cfg.tokenUrl) ?? DEFAULT_TOKEN_URL,
28
+ };
29
+ }
30
+ function textFromMessage(message) {
31
+ if (!message.text)
32
+ throw new Error('DingTalk adapter requires text');
33
+ return message.source ? `[${message.source}]\n${message.text}` : message.text;
34
+ }
35
+ function shouldAcceptMessage(body, cfg) {
36
+ const conversationId = body.conversationId ?? '';
37
+ const allowedConversationIds = cfg.allowedConversationIds;
38
+ if (conversationId &&
39
+ Array.isArray(allowedConversationIds) &&
40
+ allowedConversationIds.length > 0 &&
41
+ !allowedConversationIds.includes(conversationId)) {
42
+ return false;
43
+ }
44
+ const senderId = body.senderId ?? body.senderStaffId ?? '';
45
+ const allowedSenderIds = cfg.allowedSenderIds;
46
+ if (senderId &&
47
+ Array.isArray(allowedSenderIds) &&
48
+ allowedSenderIds.length > 0 &&
49
+ !allowedSenderIds.includes(senderId)) {
50
+ return false;
51
+ }
52
+ if ((cfg.respondToMentionsOnly ?? true) &&
53
+ body.conversationType !== '1' &&
54
+ body.isInAtList === false) {
55
+ return false;
56
+ }
57
+ return true;
58
+ }
59
+ function senderForMessage(body) {
60
+ return body.conversationId ?? body.senderId ?? body.senderStaffId ?? '';
61
+ }
62
+ function metadataFromMessage(body) {
63
+ return {
64
+ messageId: body.msgId,
65
+ replyToMessageId: body.msgId,
66
+ conversationId: body.conversationId,
67
+ chatId: body.conversationId,
68
+ groupId: body.conversationId,
69
+ conversationTitle: body.conversationTitle,
70
+ chatName: body.conversationTitle,
71
+ groupName: body.conversationTitle,
72
+ conversationType: body.conversationType,
73
+ senderId: body.senderId,
74
+ senderStaffId: body.senderStaffId,
75
+ senderNick: body.senderNick,
76
+ senderName: body.senderNick,
77
+ sessionWebhook: body.sessionWebhook,
78
+ sessionWebhookExpiredTime: body.sessionWebhookExpiredTime,
79
+ robotCode: body.robotCode,
80
+ chatbotCorpId: body.chatbotCorpId,
81
+ chatbotUserId: body.chatbotUserId,
82
+ createAt: body.createAt,
83
+ rawMsgtype: body.msgtype,
84
+ };
85
+ }
86
+ function parseRobotMessage(downstream) {
87
+ if (downstream.headers.topic !== '/v1.0/im/bot/messages/get')
88
+ return undefined;
89
+ try {
90
+ const parsed = JSON.parse(downstream.data);
91
+ return parsed && typeof parsed === 'object' ? parsed : undefined;
92
+ }
93
+ catch {
94
+ return undefined;
95
+ }
96
+ }
97
+ function sessionWebhookFromMetadata(metadata) {
98
+ const value = metadata?.sessionWebhook;
99
+ return typeof value === 'string' && value.trim() ? value.trim() : undefined;
100
+ }
101
+ function sessionWebhookIsFresh(metadata) {
102
+ const value = metadata?.sessionWebhookExpiredTime;
103
+ if (typeof value !== 'number' || !Number.isFinite(value))
104
+ return true;
105
+ return value > Date.now();
106
+ }
107
+ function normalizeApiBaseUrl(value) {
108
+ return value.replace(/\/+$/, '');
109
+ }
110
+ async function readJsonResponse(response) {
111
+ const text = await response.text();
112
+ if (!text)
113
+ return undefined;
114
+ try {
115
+ return JSON.parse(text);
116
+ }
117
+ catch {
118
+ return text;
119
+ }
120
+ }
121
+ function formatDingTalkApiError(body) {
122
+ if (!body || typeof body !== 'object' || Array.isArray(body))
123
+ return undefined;
124
+ const record = body;
125
+ const code = record.code ?? record.errcode;
126
+ if (code === undefined || code === 0 || code === '0')
127
+ return undefined;
128
+ const message = record.message ?? record.errmsg;
129
+ return `DingTalk API error ${String(code)}${message ? `: ${String(message)}` : ''}`;
130
+ }
131
+ export function createDingTalkAdapter(config, context = {}) {
132
+ const cfg = normalizeConfig(config);
133
+ let client = null;
134
+ let streamModulePromise = null;
135
+ let accessToken;
136
+ async function loadStreamModule() {
137
+ streamModulePromise ??= import('dingtalk-stream');
138
+ return streamModulePromise;
139
+ }
140
+ async function getAccessToken() {
141
+ if (accessToken && accessToken.expiresAt > Date.now())
142
+ return accessToken.token;
143
+ const url = new URL(cfg.tokenUrl);
144
+ url.searchParams.set('appkey', cfg.clientId);
145
+ url.searchParams.set('appsecret', cfg.clientSecret);
146
+ const response = await fetch(url);
147
+ const body = (await readJsonResponse(response));
148
+ if (!response.ok) {
149
+ throw new Error(`DingTalk token error ${response.status}: ${JSON.stringify(body)}`);
150
+ }
151
+ if (body?.errcode && body.errcode !== 0) {
152
+ throw new Error(`DingTalk token error ${body.errcode}: ${body.errmsg ?? 'unknown'}`);
153
+ }
154
+ if (!body?.access_token)
155
+ throw new Error('DingTalk token response missing access_token');
156
+ const expiresIn = Number.isFinite(body.expires_in) ? Number(body.expires_in) : 7200;
157
+ accessToken = {
158
+ token: body.access_token,
159
+ expiresAt: Date.now() + Math.max(60, expiresIn - 300) * 1000,
160
+ };
161
+ return accessToken.token;
162
+ }
163
+ async function sendViaSessionWebhook(url, text) {
164
+ const response = await fetch(url, {
165
+ method: 'POST',
166
+ headers: { 'Content-Type': 'application/json; charset=utf-8' },
167
+ body: JSON.stringify({
168
+ msgtype: 'text',
169
+ text: { content: text },
170
+ }),
171
+ });
172
+ const body = await readJsonResponse(response);
173
+ if (!response.ok) {
174
+ throw new Error(`DingTalk session webhook error ${response.status}: ${JSON.stringify(body)}`);
175
+ }
176
+ const apiError = formatDingTalkApiError(body);
177
+ if (apiError)
178
+ throw new Error(apiError);
179
+ }
180
+ async function sendViaOpenApi(recipient, text) {
181
+ const conversationId = recipient.trim();
182
+ if (!conversationId)
183
+ throw new Error('DingTalk adapter requires recipient');
184
+ const token = await getAccessToken();
185
+ const response = await fetch(`${normalizeApiBaseUrl(cfg.openApiBaseUrl)}/v1.0/robot/groupMessages/send`, {
186
+ method: 'POST',
187
+ headers: {
188
+ 'Content-Type': 'application/json; charset=utf-8',
189
+ 'x-acs-dingtalk-access-token': token,
190
+ },
191
+ body: JSON.stringify({
192
+ robotCode: cfg.robotCode,
193
+ openConversationId: conversationId,
194
+ msgKey: DINGTALK_TEXT_MSG_KEY,
195
+ msgParam: JSON.stringify({ content: text }),
196
+ }),
197
+ });
198
+ const body = await readJsonResponse(response);
199
+ if (!response.ok) {
200
+ throw new Error(`DingTalk send error ${response.status}: ${JSON.stringify(body)}`);
201
+ }
202
+ const apiError = formatDingTalkApiError(body);
203
+ if (apiError)
204
+ throw new Error(apiError);
205
+ }
206
+ async function sendText(message) {
207
+ const text = textFromMessage(message);
208
+ const sessionWebhook = sessionWebhookFromMetadata(message.metadata);
209
+ if (sessionWebhook && sessionWebhookIsFresh(message.metadata)) {
210
+ await sendViaSessionWebhook(sessionWebhook, text);
211
+ return;
212
+ }
213
+ await sendViaOpenApi(message.recipient, text);
214
+ }
215
+ async function start(onMessage) {
216
+ if (cfg.eventMode === 'off')
217
+ return;
218
+ if (client)
219
+ return;
220
+ const stream = await loadStreamModule();
221
+ client = new stream.DWClient({
222
+ clientId: cfg.clientId,
223
+ clientSecret: cfg.clientSecret,
224
+ ...(cfg.ua ? { ua: cfg.ua } : { ua: 'amaster-pi-channels' }),
225
+ ...(cfg.keepAlive !== undefined ? { keepAlive: cfg.keepAlive } : {}),
226
+ ...(cfg.debug !== undefined ? { debug: cfg.debug } : {}),
227
+ });
228
+ client.registerCallbackListener(stream.TOPIC_ROBOT, (downstream) => {
229
+ try {
230
+ const body = parseRobotMessage(downstream);
231
+ if (!body)
232
+ return;
233
+ if (!shouldAcceptMessage(body, cfg))
234
+ return;
235
+ if (body.msgtype !== 'text')
236
+ return;
237
+ const text = body.text?.content?.trim();
238
+ const sender = senderForMessage(body);
239
+ if (!text || !sender)
240
+ return;
241
+ void onMessage({
242
+ adapter: 'dingtalk',
243
+ sender,
244
+ text,
245
+ metadata: metadataFromMessage(body),
246
+ });
247
+ }
248
+ finally {
249
+ try {
250
+ client?.socketCallBackResponse(downstream.headers.messageId, null);
251
+ }
252
+ catch (error) {
253
+ context.log?.('dingtalk-stream-ack-failed', { error: error instanceof Error ? error.message : String(error) }, 'WARN');
254
+ }
255
+ }
256
+ });
257
+ await client.connect();
258
+ }
259
+ return {
260
+ direction: cfg.eventMode === 'off' ? 'outgoing' : 'bidirectional',
261
+ send: sendText,
262
+ start,
263
+ async stop() {
264
+ client?.disconnect();
265
+ client = null;
266
+ },
267
+ };
268
+ }
269
+ //# sourceMappingURL=dingtalk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dingtalk.js","sourceRoot":"","sources":["../../src/adapters/dingtalk.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"feishu.d.ts","sourceRoot":"","sources":["../../src/adapters/feishu.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EAIf,MAAM,aAAa,CAAC;AA2JrB,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE;IACP,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1E,GACL,cAAc,CA8OhB"}
1
+ {"version":3,"file":"feishu.d.ts","sourceRoot":"","sources":["../../src/adapters/feishu.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EAKf,MAAM,aAAa,CAAC;AA0VrB,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE;IACP,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1E,GACL,cAAc,CA8WhB"}