@zhin.js/adapter-weixin-ilink 3.0.2 → 3.0.3

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 (160) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +16 -39
  3. package/adapters/weixin-ilink.ts +30 -0
  4. package/lib/aes-ecb.d.ts +0 -1
  5. package/lib/aes-ecb.js +0 -1
  6. package/lib/cdn-upload.d.ts +0 -1
  7. package/lib/cdn-upload.js +0 -1
  8. package/lib/cdn-url.d.ts +0 -1
  9. package/lib/cdn-url.js +0 -1
  10. package/lib/context-store.d.ts +0 -1
  11. package/lib/context-store.js +0 -1
  12. package/lib/credentials.d.ts +0 -1
  13. package/lib/credentials.js +0 -1
  14. package/lib/endpoint.d.ts +35 -30
  15. package/lib/endpoint.js +217 -235
  16. package/lib/ilink-api.d.ts +0 -1
  17. package/lib/ilink-api.js +0 -1
  18. package/lib/ilink-config-cache.d.ts +0 -1
  19. package/lib/ilink-config-cache.js +0 -1
  20. package/lib/ilink-logger.d.ts +0 -1
  21. package/lib/ilink-logger.js +0 -1
  22. package/lib/ilink-meta.d.ts +0 -1
  23. package/lib/ilink-meta.js +0 -1
  24. package/lib/ilink-random.d.ts +0 -1
  25. package/lib/ilink-random.js +0 -1
  26. package/lib/ilink-redact.d.ts +0 -1
  27. package/lib/ilink-redact.js +0 -1
  28. package/lib/ilink-session-guard.d.ts +0 -1
  29. package/lib/ilink-session-guard.js +0 -1
  30. package/lib/ilink-types.d.ts +0 -1
  31. package/lib/ilink-types.js +0 -1
  32. package/lib/index.d.ts +4 -19
  33. package/lib/index.js +2 -37
  34. package/lib/login.d.ts +4 -6
  35. package/lib/login.js +43 -65
  36. package/lib/media-download.d.ts +0 -1
  37. package/lib/media-download.js +0 -1
  38. package/lib/mime.d.ts +0 -1
  39. package/lib/mime.js +0 -1
  40. package/lib/outbound-media.d.ts +4 -4
  41. package/lib/outbound-media.js +44 -42
  42. package/lib/pic-decrypt.d.ts +0 -1
  43. package/lib/pic-decrypt.js +0 -1
  44. package/lib/protocol.d.ts +52 -0
  45. package/lib/protocol.js +109 -0
  46. package/lib/silk-transcode.d.ts +0 -1
  47. package/lib/silk-transcode.js +0 -1
  48. package/lib/types.d.ts +2 -16
  49. package/lib/types.js +0 -1
  50. package/lib/upload.d.ts +0 -1
  51. package/lib/upload.js +0 -1
  52. package/lib/weixin-inbound.d.ts +0 -1
  53. package/lib/weixin-inbound.js +0 -1
  54. package/lib/weixin-send-media.d.ts +0 -1
  55. package/lib/weixin-send-media.js +0 -1
  56. package/lib/weixin-send.d.ts +0 -1
  57. package/lib/weixin-send.js +0 -1
  58. package/package.json +37 -46
  59. package/plugin.ts +8 -0
  60. package/schema.json +30 -0
  61. package/src/endpoint.ts +261 -279
  62. package/src/index.ts +24 -53
  63. package/src/login.ts +56 -72
  64. package/src/outbound-media.ts +56 -50
  65. package/src/protocol.ts +172 -0
  66. package/src/types.ts +6 -15
  67. package/client/LoginAssistPanel.tsx +0 -200
  68. package/client/WeixinIlinkManagement.tsx +0 -139
  69. package/client/index.tsx +0 -11
  70. package/client/tsconfig.json +0 -13
  71. package/client/utils/api.ts +0 -30
  72. package/dist/index.js +0 -29
  73. package/lib/adapter.d.ts +0 -14
  74. package/lib/adapter.d.ts.map +0 -1
  75. package/lib/adapter.js +0 -21
  76. package/lib/adapter.js.map +0 -1
  77. package/lib/aes-ecb.d.ts.map +0 -1
  78. package/lib/aes-ecb.js.map +0 -1
  79. package/lib/cdn-upload.d.ts.map +0 -1
  80. package/lib/cdn-upload.js.map +0 -1
  81. package/lib/cdn-upload.test.d.ts +0 -2
  82. package/lib/cdn-upload.test.d.ts.map +0 -1
  83. package/lib/cdn-upload.test.js +0 -150
  84. package/lib/cdn-upload.test.js.map +0 -1
  85. package/lib/cdn-url.d.ts.map +0 -1
  86. package/lib/cdn-url.js.map +0 -1
  87. package/lib/context-store.d.ts.map +0 -1
  88. package/lib/context-store.js.map +0 -1
  89. package/lib/credentials.d.ts.map +0 -1
  90. package/lib/credentials.js.map +0 -1
  91. package/lib/endpoint.d.ts.map +0 -1
  92. package/lib/endpoint.js.map +0 -1
  93. package/lib/ilink-api.d.ts.map +0 -1
  94. package/lib/ilink-api.js.map +0 -1
  95. package/lib/ilink-config-cache.d.ts.map +0 -1
  96. package/lib/ilink-config-cache.js.map +0 -1
  97. package/lib/ilink-logger.d.ts.map +0 -1
  98. package/lib/ilink-logger.js.map +0 -1
  99. package/lib/ilink-meta.d.ts.map +0 -1
  100. package/lib/ilink-meta.js.map +0 -1
  101. package/lib/ilink-random.d.ts.map +0 -1
  102. package/lib/ilink-random.js.map +0 -1
  103. package/lib/ilink-redact.d.ts.map +0 -1
  104. package/lib/ilink-redact.js.map +0 -1
  105. package/lib/ilink-session-guard.d.ts.map +0 -1
  106. package/lib/ilink-session-guard.js.map +0 -1
  107. package/lib/ilink-types.d.ts.map +0 -1
  108. package/lib/ilink-types.js.map +0 -1
  109. package/lib/index.d.ts.map +0 -1
  110. package/lib/index.js.map +0 -1
  111. package/lib/login-assist-routes.d.ts +0 -7
  112. package/lib/login-assist-routes.d.ts.map +0 -1
  113. package/lib/login-assist-routes.js +0 -29
  114. package/lib/login-assist-routes.js.map +0 -1
  115. package/lib/login.d.ts.map +0 -1
  116. package/lib/login.js.map +0 -1
  117. package/lib/media-download.d.ts.map +0 -1
  118. package/lib/media-download.js.map +0 -1
  119. package/lib/mime.d.ts.map +0 -1
  120. package/lib/mime.js.map +0 -1
  121. package/lib/mime.test.d.ts +0 -2
  122. package/lib/mime.test.d.ts.map +0 -1
  123. package/lib/mime.test.js +0 -62
  124. package/lib/mime.test.js.map +0 -1
  125. package/lib/outbound-media.d.ts.map +0 -1
  126. package/lib/outbound-media.js.map +0 -1
  127. package/lib/pic-decrypt.d.ts.map +0 -1
  128. package/lib/pic-decrypt.js.map +0 -1
  129. package/lib/routes.d.ts +0 -8
  130. package/lib/routes.d.ts.map +0 -1
  131. package/lib/routes.js +0 -29
  132. package/lib/routes.js.map +0 -1
  133. package/lib/segment-mapper.d.ts +0 -2
  134. package/lib/segment-mapper.d.ts.map +0 -1
  135. package/lib/segment-mapper.js +0 -2
  136. package/lib/segment-mapper.js.map +0 -1
  137. package/lib/silk-transcode.d.ts.map +0 -1
  138. package/lib/silk-transcode.js.map +0 -1
  139. package/lib/silk-transcode.test.d.ts +0 -2
  140. package/lib/silk-transcode.test.d.ts.map +0 -1
  141. package/lib/silk-transcode.test.js +0 -53
  142. package/lib/silk-transcode.test.js.map +0 -1
  143. package/lib/types.d.ts.map +0 -1
  144. package/lib/types.js.map +0 -1
  145. package/lib/upload.d.ts.map +0 -1
  146. package/lib/upload.js.map +0 -1
  147. package/lib/upload.test.d.ts +0 -2
  148. package/lib/upload.test.d.ts.map +0 -1
  149. package/lib/upload.test.js +0 -250
  150. package/lib/upload.test.js.map +0 -1
  151. package/lib/weixin-inbound.d.ts.map +0 -1
  152. package/lib/weixin-inbound.js.map +0 -1
  153. package/lib/weixin-send-media.d.ts.map +0 -1
  154. package/lib/weixin-send-media.js.map +0 -1
  155. package/lib/weixin-send.d.ts.map +0 -1
  156. package/lib/weixin-send.js.map +0 -1
  157. package/src/adapter.ts +0 -24
  158. package/src/login-assist-routes.ts +0 -36
  159. package/src/routes.ts +0 -39
  160. package/src/segment-mapper.ts +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,36 @@
1
1
  # @zhin.js/adapter-weixin-ilink
2
2
 
3
+ ## 3.0.3
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
+ - Updated dependencies [16ec4e8]
26
+ - Updated dependencies [cc5c94d]
27
+ - Updated dependencies [447f3e2]
28
+ - @zhin.js/core@1.3.5
29
+ - zhin.js@4.1.3
30
+ - @zhin.js/logger@1.0.75
31
+ - @zhin.js/plugin-runtime@1.0.1
32
+ - @zhin.js/adapter@1.0.1
33
+
3
34
  ## 3.0.2
4
35
 
5
36
  ### Patch Changes
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @zhin.js/adapter-weixin-ilink
2
2
 
3
- 通过微信 **iLink Endpoint API**(ClawBot 灰度入口)接入**个人微信**,支持文本与全量媒体收发、输入状态提示。
3
+ 通过微信 **iLink Endpoint API**(ClawBot 灰度入口)接入**个人微信**,支持文本与全量媒体收发。Plugin Runtime 约定式 `defineAdapter`(长轮询入站,无 host-router / Koa)。
4
4
 
5
5
  协议实现移植自 [Tencent/openclaw-weixin](https://github.com/Tencent/openclaw-weixin)(MIT),已去除 OpenClaw 耦合,`bot_agent` 默认为 `Zhin.js/<version>`。
6
6
 
@@ -9,8 +9,8 @@
9
9
  | 项 | weixin-ilink | wechat-mp |
10
10
  |---|---|---|
11
11
  | 账号类型 | 个人微信(ClawBot) | 微信公众号 |
12
- | 入站 | 长轮询 `getupdates` | Webhook 被动回复 |
13
- | 登录 | 扫码 + 侧车凭证文件 | AppId/Secret/Token |
12
+ | 入站 | 长轮询 `getupdates` → `messageGatewayToken` | Webhook(`httpHostToken`) |
13
+ | 登录 | 扫码 / 侧车凭证 / `botToken` | AppId/Secret/Token |
14
14
  | 群聊 | 不支持(仅私聊) | 支持 |
15
15
 
16
16
  可与 `@zhin.js/adapter-wechat-mp` **同时启用**。
@@ -19,78 +19,55 @@
19
19
 
20
20
  - 微信客户端需已灰度 **ClawBot** 入口(最新版微信 + 灰度资格)
21
21
  - Node.js ^20.19.0 或 >=22.12.0
22
- - 可选:`@zhin.js/host-router` + `@zhin.js/host-api` 用于 Web 控制台扫码登录
23
22
 
24
23
  ## 最小配置
25
24
 
26
25
  ```yaml
27
- endpoints:
28
- - context: weixin-ilink
26
+ plugins:
27
+ weixin-ilink:
29
28
  name: my-wechat
30
- # botAgent: "Zhin.js/1.0.0" # 可选,观测用
31
- # longPollTimeoutMs: 35000 # 可选
29
+ # botToken: "..." # 或环境变量 WEIXIN_ILINK_TOKEN
30
+ # botAgent: "Zhin.js/1.0.0"
31
+ # longPollTimeoutMs: 35000
32
32
  # baseUrl: https://ilinkai.weixin.qq.com
33
-
34
- plugins:
35
- - "@zhin.js/adapter-weixin-ilink"
36
- - "@zhin.js/host-router" # 可选,Console + login-assist API
37
- - "@zhin.js/host-api" # 可选
38
33
  ```
39
34
 
40
- `zhin.config.yml` **只写 bot `name`**;`botToken` 保存在侧车文件(不进 git):
35
+ `botToken` 也可保存在侧车文件(不进 git):
41
36
 
42
37
  ```
43
38
  data/weixin-ilink/<bot-name>.json
44
39
  ```
45
40
 
46
- 也可通过环境变量 `WEIXIN_ILINK_TOKEN` 或配置项 `botToken` 覆盖(CI 场景)。
47
-
48
41
  ## 登录流程
49
42
 
50
- 1. 首次启动无凭证时,bot 调用 `get_bot_qrcode` 并在控制台展示二维码(`loginAssist`)
43
+ 1. 首次启动无凭证时,调用 `get_bot_qrcode` 并在日志中打印二维码内容
51
44
  2. 用户用微信扫码确认
52
45
  3. 后台轮询 `get_qrcode_status` 直至 `confirmed`,写入 `data/weixin-ilink/<name>.json`
53
46
  4. 调用 `notifyStart` 后进入长轮询
54
47
 
55
- 与 Host 同时启用时:
56
-
57
- - Console 页面:`/weixin-ilink`(概览 + 登录辅助)
58
- - HTTP API:`GET /api/login-assist/pending`、`POST /api/login-assist/submit`、`POST /api/login-assist/cancel`
59
- - Endpoint 状态:`GET /api/weixin-ilink/endpoints`
60
-
61
- ## Typing Indicator
62
-
63
- 私聊使用 iLink `sendTyping` API,在微信侧显示**正在输入**(非文本消息、非 reaction)。长任务期间每 5s 保活一次(`keepaliveIntervalMs` 可配)。
64
-
65
- ```yaml
66
- typingIndicator:
67
- enabled: true
68
- keepaliveIntervalMs: 5000
69
- privateConfig:
70
- type: typing
71
- ```
48
+ > Console 扫码面板(旧 `loginAssist` + host-router)已从生产路径移除;优先用 `botToken` / 侧车凭证。
72
49
 
73
50
  ## 出站说明
74
51
 
75
52
  回复必须携带入站时缓存的 `context_token`(按 `endpointId + peerUserId`)。若用户久未发消息导致 token 缺失,出站会拒绝并打 warn。
76
53
 
77
- 所有出站走标准链路:`Message.$reply` / `Adapter.sendMessage` → `before.sendMessage` → `endpoint.$sendMessage`。
54
+ 出站经 Runtime:`MessageGateway` → `endpoint.send({ target, payload })`。
78
55
 
79
56
  **图文限制**:微信单条消息不支持图文混排。适配器会自动:
57
+
80
58
  - **出站**:先单独发文本,再发纯媒体(不带 caption)
81
- - **入站**:若同一条 iLink 消息同时含文字与媒体,拆成两条 `message.receive` 事件
59
+ - **入站**:文字与媒体路径写入同一条 gateway `content` 文本
82
60
 
83
61
  ## 故障排查
84
62
 
85
63
  | 现象 | 可能原因 |
86
64
  |---|---|
87
65
  | 无法扫码 / 无 ClawBot 入口 | 未灰度;需最新微信 + 灰度资格 |
88
- | 二维码过期 | 重启 Endpoint 重新获取 |
66
+ | 二维码过期 | 重启适配器重新获取 |
89
67
  | 发不出消息 | 缺少 `context_token`;让用户先发一条消息 |
90
68
  | `errcode -14` | 会话过期,适配器自动暂停 1 小时后重试 |
91
- | Console 无待办 | 确认 `host-router` 已加载且访问 `/weixin-ilink` |
92
69
 
93
70
  ## 文档
94
71
 
95
- - 架构与计划:仓库内 weixin-ilink 实现计划
96
72
  - 适配器索引:[`plugins/adapters/README.md`](../README.md)
73
+ - 原位迁移:[`docs/architecture/target-implementation/in-place-migration.md`](../../../docs/architecture/target-implementation/in-place-migration.md)
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Convention entry: discover `adapters/weixin-ilink.ts` → defineAdapter.
3
+ */
4
+ import { defineAdapter } from '@zhin.js/adapter';
5
+ import { messageGatewayToken } from '@zhin.js/core/runtime';
6
+ import { WeixinIlinkEndpoint } from '../src/endpoint.js';
7
+ import {
8
+ resolveWeixinIlinkConfig,
9
+ type WeixinIlinkAdapterConfig,
10
+ } from '../src/protocol.js';
11
+
12
+ export { WeixinIlinkEndpoint } from '../src/endpoint.js';
13
+ export type {
14
+ WeixinIlinkEndpointOptions,
15
+ WeixinIlinkGetUpdates,
16
+ WeixinIlinkNotifyStart,
17
+ WeixinIlinkNotifyStop,
18
+ WeixinIlinkSendText,
19
+ } from '../src/endpoint.js';
20
+
21
+ export default defineAdapter<WeixinIlinkAdapterConfig>({
22
+ capabilities: ['inbound', 'outbound'],
23
+ create(context) {
24
+ return new WeixinIlinkEndpoint({
25
+ id: context.id,
26
+ gateway: context.use(messageGatewayToken),
27
+ config: resolveWeixinIlinkConfig(context.config),
28
+ });
29
+ },
30
+ });
package/lib/aes-ecb.d.ts CHANGED
@@ -4,4 +4,3 @@ export declare function encryptAesEcb(plaintext: Buffer, key: Buffer): Buffer;
4
4
  export declare function decryptAesEcb(ciphertext: Buffer, key: Buffer): Buffer;
5
5
  /** Compute AES-128-ECB ciphertext size (PKCS7 padding to 16-byte boundary). */
6
6
  export declare function aesEcbPaddedSize(plaintextSize: number): number;
7
- //# sourceMappingURL=aes-ecb.d.ts.map
package/lib/aes-ecb.js CHANGED
@@ -16,4 +16,3 @@ export function decryptAesEcb(ciphertext, key) {
16
16
  export function aesEcbPaddedSize(plaintextSize) {
17
17
  return Math.ceil((plaintextSize + 1) / 16) * 16;
18
18
  }
19
- //# sourceMappingURL=aes-ecb.js.map
@@ -15,4 +15,3 @@ export declare function uploadBufferToCdn(params: {
15
15
  }): Promise<{
16
16
  downloadParam: string;
17
17
  }>;
18
- //# sourceMappingURL=cdn-upload.d.ts.map
package/lib/cdn-upload.js CHANGED
@@ -70,4 +70,3 @@ export async function uploadBufferToCdn(params) {
70
70
  }
71
71
  return { downloadParam };
72
72
  }
73
- //# sourceMappingURL=cdn-upload.js.map
package/lib/cdn-url.d.ts CHANGED
@@ -11,4 +11,3 @@ export declare function buildCdnUploadUrl(params: {
11
11
  uploadParam: string;
12
12
  filekey: string;
13
13
  }): string;
14
- //# sourceMappingURL=cdn-url.d.ts.map
package/lib/cdn-url.js CHANGED
@@ -11,4 +11,3 @@ export function buildCdnDownloadUrl(encryptedQueryParam, cdnBaseUrl) {
11
11
  export function buildCdnUploadUrl(params) {
12
12
  return `${params.cdnBaseUrl}/upload?encrypted_query_param=${encodeURIComponent(params.uploadParam)}&filekey=${encodeURIComponent(params.filekey)}`;
13
13
  }
14
- //# sourceMappingURL=cdn-url.js.map
@@ -1,2 +1 @@
1
1
  export { setContextToken, getContextToken, restoreContextTokens, clearContextTokensForAccount, bodyFromItemList, isMediaItem, } from "./weixin-inbound.js";
2
- //# sourceMappingURL=context-store.d.ts.map
@@ -1,2 +1 @@
1
1
  export { setContextToken, getContextToken, restoreContextTokens, clearContextTokensForAccount, bodyFromItemList, isMediaItem, } from "./weixin-inbound.js";
2
- //# sourceMappingURL=context-store.js.map
@@ -12,4 +12,3 @@ export declare function saveCredentials(endpointName: string, creds: WeixinIlink
12
12
  export declare function syncBufPath(endpointName: string): string;
13
13
  export declare function loadSyncBuf(endpointName: string): string;
14
14
  export declare function saveSyncBuf(endpointName: string, buf: string): void;
15
- //# sourceMappingURL=credentials.d.ts.map
@@ -46,4 +46,3 @@ export function saveSyncBuf(endpointName, buf) {
46
46
  fs.mkdirSync(path.dirname(file), { recursive: true });
47
47
  fs.writeFileSync(file, buf, "utf-8");
48
48
  }
49
- //# sourceMappingURL=credentials.js.map
package/lib/endpoint.d.ts CHANGED
@@ -1,35 +1,40 @@
1
- import { Endpoint, Message, type SendOptions } from 'zhin.js';
2
- import { type WeixinMessage } from './ilink-types.js';
3
- import type { WeixinInboundMediaOpts } from "./weixin-inbound.js";
4
- import type { WeixinIlinkEndpointConfig } from "./types.js";
5
- import type { WeixinIlinkAdapter } from "./adapter.js";
6
- export type WeixinMessageWithMedia = WeixinMessage & {
7
- _media?: WeixinInboundMediaOpts;
8
- };
9
- export declare class WeixinIlinkEndpoint implements Endpoint<WeixinIlinkEndpointConfig, WeixinMessage> {
10
- adapter: WeixinIlinkAdapter;
11
- $config: WeixinIlinkEndpointConfig;
12
- $connected: boolean;
13
- private creds;
14
- private pollAbort?;
15
- private pollPromise?;
16
- private configManager?;
17
- get $id(): string;
1
+ import type { EndpointInstance } from '@zhin.js/adapter';
2
+ import type { MessageGateway } from '@zhin.js/core/runtime';
3
+ import type { CapabilityId } from '@zhin.js/plugin-runtime';
4
+ import { getUpdates, notifyStart, notifyStop } from './ilink-api.js';
5
+ import { type WeixinIlinkCredentials } from './credentials.js';
6
+ import { sendMessageWeixin } from './weixin-send.js';
7
+ import { type ResolvedWeixinIlinkConfig, type WeixinMessageWithMedia } from './protocol.js';
8
+ export type WeixinIlinkSendText = typeof sendMessageWeixin;
9
+ export type WeixinIlinkNotifyStart = typeof notifyStart;
10
+ export type WeixinIlinkNotifyStop = typeof notifyStop;
11
+ export type WeixinIlinkGetUpdates = typeof getUpdates;
12
+ export interface WeixinIlinkEndpointOptions {
13
+ readonly id: CapabilityId;
14
+ readonly gateway: MessageGateway;
15
+ readonly config: ResolvedWeixinIlinkConfig;
16
+ readonly resolveCredentials?: (config: ResolvedWeixinIlinkConfig) => Promise<WeixinIlinkCredentials>;
17
+ /** Test / internal: override network side effects. */
18
+ readonly notifyStart?: WeixinIlinkNotifyStart;
19
+ readonly notifyStop?: WeixinIlinkNotifyStop;
20
+ readonly getUpdates?: WeixinIlinkGetUpdates;
21
+ readonly sendText?: WeixinIlinkSendText;
22
+ }
23
+ export declare class WeixinIlinkEndpoint implements EndpointInstance {
24
+ #private;
25
+ constructor(options: WeixinIlinkEndpointOptions);
18
26
  get hasCredentials(): boolean;
19
- get pluginLogger(): import("zhin.js").Logger;
20
- constructor(adapter: WeixinIlinkAdapter, $config: WeixinIlinkEndpointConfig);
21
27
  apiBaseUrl(): string;
22
28
  cdnBaseUrl(): string;
23
- $connect(): Promise<void>;
24
- $disconnect(): Promise<void>;
29
+ start(): Promise<void>;
30
+ open(): void;
31
+ close(): void;
32
+ stop(): Promise<void>;
33
+ send({ target, payload }: {
34
+ readonly target: string;
35
+ readonly payload: unknown;
36
+ }): Promise<string>;
37
+ /** Test / internal: admit a parsed message when the endpoint is open. */
38
+ admit(msg: WeixinMessageWithMedia): void;
25
39
  sendTypingToUser(userId: string, status: number): Promise<void>;
26
- $recallMessage(_id: string): Promise<void>;
27
- $formatMessage(msg: WeixinMessageWithMedia): Message<WeixinMessage>;
28
- private buildInboundContent;
29
- $sendMessage(options: SendOptions): Promise<string>;
30
- private pollLoop;
31
- private handleInboundMessage;
32
- private downloadInboundMedia;
33
- private saveInboundMedia;
34
40
  }
35
- //# sourceMappingURL=endpoint.d.ts.map