@wwlocal/aibot-plugin-node 20260409.20.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.
- package/README.md +489 -0
- package/config.example.json +169 -0
- package/dist/cjs/index.js +76 -0
- package/dist/cjs/src/adapters/anthropic-adapter.js +534 -0
- package/dist/cjs/src/adapters/base-adapter.js +176 -0
- package/dist/cjs/src/adapters/deepseek-adapter.js +328 -0
- package/dist/cjs/src/adapters/dify-adapter.js +636 -0
- package/dist/cjs/src/adapters/index.js +131 -0
- package/dist/cjs/src/adapters/openai-adapter.js +361 -0
- package/dist/cjs/src/adapters/webhook-adapter.js +260 -0
- package/dist/cjs/src/agent-forwarder.js +87 -0
- package/dist/cjs/src/ca-cert.js +162 -0
- package/dist/cjs/src/config.js +169 -0
- package/dist/cjs/src/const.js +124 -0
- package/dist/cjs/src/conversation-manager.js +147 -0
- package/dist/cjs/src/dm-policy.js +46 -0
- package/dist/cjs/src/group-policy.js +95 -0
- package/dist/cjs/src/media-handler.js +136 -0
- package/dist/cjs/src/media-loader.js +271 -0
- package/dist/cjs/src/media-storage.js +165 -0
- package/dist/cjs/src/media-uploader.js +203 -0
- package/dist/cjs/src/message-parser.js +133 -0
- package/dist/cjs/src/message-sender.js +87 -0
- package/dist/cjs/src/monitor.js +849 -0
- package/dist/cjs/src/reqid-store.js +87 -0
- package/dist/cjs/src/server.js +72 -0
- package/dist/cjs/src/service-manager.js +135 -0
- package/dist/cjs/src/state-manager.js +143 -0
- package/dist/cjs/src/template-card-parser.js +498 -0
- package/dist/cjs/src/timeout.js +41 -0
- package/dist/cjs/src/version.js +25 -0
- package/dist/esm/index.js +74 -0
- package/dist/esm/src/adapters/anthropic-adapter.js +512 -0
- package/dist/esm/src/adapters/base-adapter.js +174 -0
- package/dist/esm/src/adapters/deepseek-adapter.js +326 -0
- package/dist/esm/src/adapters/dify-adapter.js +634 -0
- package/dist/esm/src/adapters/index.js +123 -0
- package/dist/esm/src/adapters/openai-adapter.js +339 -0
- package/dist/esm/src/adapters/webhook-adapter.js +258 -0
- package/dist/esm/src/agent-forwarder.js +84 -0
- package/dist/esm/src/ca-cert.js +136 -0
- package/dist/esm/src/config.js +145 -0
- package/dist/esm/src/const.js +100 -0
- package/dist/esm/src/conversation-manager.js +144 -0
- package/dist/esm/src/dm-policy.js +44 -0
- package/dist/esm/src/group-policy.js +92 -0
- package/dist/esm/src/media-handler.js +133 -0
- package/dist/esm/src/media-loader.js +246 -0
- package/dist/esm/src/media-storage.js +143 -0
- package/dist/esm/src/media-uploader.js +198 -0
- package/dist/esm/src/message-parser.js +131 -0
- package/dist/esm/src/message-sender.js +83 -0
- package/dist/esm/src/monitor.js +841 -0
- package/dist/esm/src/reqid-store.js +85 -0
- package/dist/esm/src/server.js +69 -0
- package/dist/esm/src/service-manager.js +133 -0
- package/dist/esm/src/state-manager.js +134 -0
- package/dist/esm/src/template-card-parser.js +495 -0
- package/dist/esm/src/timeout.js +38 -0
- package/dist/esm/src/version.js +22 -0
- package/dist/esm/types/index.d.ts +14 -0
- package/dist/esm/types/src/adapters/anthropic-adapter.d.ts +93 -0
- package/dist/esm/types/src/adapters/base-adapter.d.ts +76 -0
- package/dist/esm/types/src/adapters/deepseek-adapter.d.ts +87 -0
- package/dist/esm/types/src/adapters/dify-adapter.d.ts +100 -0
- package/dist/esm/types/src/adapters/index.d.ts +60 -0
- package/dist/esm/types/src/adapters/openai-adapter.d.ts +82 -0
- package/dist/esm/types/src/adapters/types.d.ts +373 -0
- package/dist/esm/types/src/adapters/webhook-adapter.d.ts +54 -0
- package/dist/esm/types/src/agent-forwarder.d.ts +32 -0
- package/dist/esm/types/src/ca-cert.d.ts +53 -0
- package/dist/esm/types/src/config.d.ts +29 -0
- package/dist/esm/types/src/const.d.ts +74 -0
- package/dist/esm/types/src/conversation-manager.d.ts +81 -0
- package/dist/esm/types/src/dm-policy.d.ts +27 -0
- package/dist/esm/types/src/group-policy.d.ts +28 -0
- package/dist/esm/types/src/interface.d.ts +332 -0
- package/dist/esm/types/src/media-handler.d.ts +36 -0
- package/dist/esm/types/src/media-loader.d.ts +47 -0
- package/dist/esm/types/src/media-storage.d.ts +35 -0
- package/dist/esm/types/src/media-uploader.d.ts +65 -0
- package/dist/esm/types/src/message-parser.d.ts +89 -0
- package/dist/esm/types/src/message-sender.d.ts +34 -0
- package/dist/esm/types/src/monitor.d.ts +30 -0
- package/dist/esm/types/src/reqid-store.d.ts +23 -0
- package/dist/esm/types/src/server.d.ts +23 -0
- package/dist/esm/types/src/service-manager.d.ts +52 -0
- package/dist/esm/types/src/state-manager.d.ts +76 -0
- package/dist/esm/types/src/template-card-parser.d.ts +18 -0
- package/dist/esm/types/src/timeout.d.ts +20 -0
- package/dist/esm/types/src/version.d.ts +2 -0
- package/dist/index.d.ts +2 -0
- package/package.json +51 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 企业微信私有部署 WebSocket 监控器主模块
|
|
3
|
+
*
|
|
4
|
+
* 负责:
|
|
5
|
+
* - 建立和管理 WebSocket 连接
|
|
6
|
+
* - 协调消息处理流程(解析→策略检查→下载图片→智能体转发→流式回复)
|
|
7
|
+
* - 资源生命周期管理
|
|
8
|
+
*
|
|
9
|
+
* 子模块:
|
|
10
|
+
* - message-parser.ts : 消息内容解析
|
|
11
|
+
* - message-sender.ts : 消息发送(带超时保护)
|
|
12
|
+
* - media-handler.ts : 图片/文件下载和保存(带超时保护)
|
|
13
|
+
* - media-uploader.ts : 出站媒体上传+发送
|
|
14
|
+
* - group-policy.ts : 群组访问控制
|
|
15
|
+
* - dm-policy.ts : 私聊访问控制
|
|
16
|
+
* - state-manager.ts : 全局状态管理(带 TTL 清理)
|
|
17
|
+
* - agent-forwarder.ts : OpenAI API 兼容智能体转发
|
|
18
|
+
* - template-card-parser.ts : 模板卡片提取/遮罩
|
|
19
|
+
* - timeout.ts : 超时工具
|
|
20
|
+
*/
|
|
21
|
+
import type { MonitorOptions } from "./interface.js";
|
|
22
|
+
export type { MonitorOptions } from "./interface.js";
|
|
23
|
+
export { WeComCommand } from "./const.js";
|
|
24
|
+
export { getWeComWebSocket, setReqIdForChat, getReqIdForChatAsync, getReqIdForChat, deleteReqIdForChat, warmupReqIdStore, flushReqIdStore, } from "./state-manager.js";
|
|
25
|
+
export { sendWeComReply } from "./message-sender.js";
|
|
26
|
+
/**
|
|
27
|
+
* 监听企业微信私有部署 WebSocket 连接
|
|
28
|
+
* 使用 aibot-node-sdk 简化连接管理
|
|
29
|
+
*/
|
|
30
|
+
export declare function monitorWeComProvider(options: MonitorOptions): Promise<void>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Store 配置 */
|
|
2
|
+
interface ReqIdStoreOptions {
|
|
3
|
+
/** TTL 毫秒数,超时的 reqId 视为过期(默认 7 天) */
|
|
4
|
+
ttlMs?: number;
|
|
5
|
+
/** 内存最大条目数(默认 200) */
|
|
6
|
+
memoryMaxSize?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface PersistentReqIdStore {
|
|
9
|
+
/** 设置 chatId 对应的 reqId(仅写入内存) */
|
|
10
|
+
set(chatId: string, reqId: string): void;
|
|
11
|
+
/** 获取 chatId 对应的 reqId(仅内存) */
|
|
12
|
+
get(chatId: string): Promise<string | undefined>;
|
|
13
|
+
/** 同步获取 chatId 对应的 reqId(仅内存) */
|
|
14
|
+
getSync(chatId: string): string | undefined;
|
|
15
|
+
/** 删除 chatId 对应的 reqId */
|
|
16
|
+
delete(chatId: string): void;
|
|
17
|
+
/** 清空内存缓存 */
|
|
18
|
+
clearMemory(): void;
|
|
19
|
+
/** 返回内存中的条目数 */
|
|
20
|
+
memorySize(): number;
|
|
21
|
+
}
|
|
22
|
+
export declare function createPersistentReqIdStore(accountId: string, options?: ReqIdStoreOptions): PersistentReqIdStore;
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Express HTTP 服务器模块
|
|
3
|
+
*
|
|
4
|
+
* 提供:
|
|
5
|
+
* - GET /health — 健康检查
|
|
6
|
+
* - GET /api/status — 服务状态查询(各账号连接状态/消息统计)
|
|
7
|
+
* - POST /callback — 模板卡片事件回调 webhook(预留)
|
|
8
|
+
*/
|
|
9
|
+
import type { Express } from "express";
|
|
10
|
+
import type { ServiceManager } from "./service-manager.js";
|
|
11
|
+
import type { RuntimeLogger } from "./interface.js";
|
|
12
|
+
export interface CreateServerOptions {
|
|
13
|
+
serviceManager: ServiceManager;
|
|
14
|
+
runtime: RuntimeLogger;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 创建 Express 应用并注册路由
|
|
18
|
+
*/
|
|
19
|
+
export declare function createServer(options: CreateServerOptions): Express;
|
|
20
|
+
/**
|
|
21
|
+
* 启动 HTTP 服务器
|
|
22
|
+
*/
|
|
23
|
+
export declare function startServer(app: Express, port: number, runtime: RuntimeLogger): void;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 服务生命周期管理器
|
|
3
|
+
*
|
|
4
|
+
* 管理多账号 WSClient 的启动/停止/重连、状态监控、统一 cleanup。
|
|
5
|
+
*/
|
|
6
|
+
import type { PluginConfig, RuntimeLogger } from "./interface.js";
|
|
7
|
+
export interface AccountStatus {
|
|
8
|
+
accountId: string;
|
|
9
|
+
name: string;
|
|
10
|
+
running: boolean;
|
|
11
|
+
lastConnectedAt?: number;
|
|
12
|
+
lastStopAt?: number;
|
|
13
|
+
lastError?: string;
|
|
14
|
+
[key: string]: unknown;
|
|
15
|
+
}
|
|
16
|
+
export interface ServiceManagerOptions {
|
|
17
|
+
config: PluginConfig;
|
|
18
|
+
runtime: RuntimeLogger;
|
|
19
|
+
}
|
|
20
|
+
export declare class ServiceManager {
|
|
21
|
+
private config;
|
|
22
|
+
private runtime;
|
|
23
|
+
private accounts;
|
|
24
|
+
private accountStatuses;
|
|
25
|
+
private abortControllers;
|
|
26
|
+
private monitorPromises;
|
|
27
|
+
constructor(options: ServiceManagerOptions);
|
|
28
|
+
/**
|
|
29
|
+
* 启动所有已启用的账号
|
|
30
|
+
*/
|
|
31
|
+
startAll(): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* 启动单个账号的 WebSocket 监控
|
|
34
|
+
*/
|
|
35
|
+
private startAccount;
|
|
36
|
+
/**
|
|
37
|
+
* 重启指定账号
|
|
38
|
+
*/
|
|
39
|
+
private restartAccount;
|
|
40
|
+
/**
|
|
41
|
+
* 停止所有账号
|
|
42
|
+
*/
|
|
43
|
+
stopAll(): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* 获取所有账号状态
|
|
46
|
+
*/
|
|
47
|
+
getStatuses(): AccountStatus[];
|
|
48
|
+
/**
|
|
49
|
+
* 获取指定账号状态
|
|
50
|
+
*/
|
|
51
|
+
getStatus(accountId: string): AccountStatus | undefined;
|
|
52
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 全局状态管理模块
|
|
3
|
+
*
|
|
4
|
+
* 负责管理 WSClient 实例、消息状态(带 TTL 清理)、ReqId 存储
|
|
5
|
+
* 解决全局 Map 的内存泄漏问题
|
|
6
|
+
*/
|
|
7
|
+
import type { WSClient } from "@wecom/aibot-node-sdk";
|
|
8
|
+
import type { MessageState } from "./interface.js";
|
|
9
|
+
/**
|
|
10
|
+
* 获取指定账户的 WSClient 实例
|
|
11
|
+
*/
|
|
12
|
+
export declare function getWeComWebSocket(accountId: string): WSClient | null;
|
|
13
|
+
/**
|
|
14
|
+
* 设置指定账户的 WSClient 实例
|
|
15
|
+
*/
|
|
16
|
+
export declare function setWeComWebSocket(accountId: string, client: WSClient): void;
|
|
17
|
+
/**
|
|
18
|
+
* 删除指定账户的 WSClient 实例
|
|
19
|
+
*/
|
|
20
|
+
export declare function deleteWeComWebSocket(accountId: string): void;
|
|
21
|
+
/**
|
|
22
|
+
* 启动消息状态定期清理(自动 TTL 清理 + 容量限制)
|
|
23
|
+
*/
|
|
24
|
+
export declare function startMessageStateCleanup(): void;
|
|
25
|
+
/**
|
|
26
|
+
* 停止消息状态定期清理
|
|
27
|
+
*/
|
|
28
|
+
export declare function stopMessageStateCleanup(): void;
|
|
29
|
+
/**
|
|
30
|
+
* 设置消息状态
|
|
31
|
+
*/
|
|
32
|
+
export declare function setMessageState(messageId: string, state: MessageState): void;
|
|
33
|
+
/**
|
|
34
|
+
* 获取消息状态
|
|
35
|
+
*/
|
|
36
|
+
export declare function getMessageState(messageId: string): MessageState | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* 删除消息状态
|
|
39
|
+
*/
|
|
40
|
+
export declare function deleteMessageState(messageId: string): void;
|
|
41
|
+
/**
|
|
42
|
+
* 清空所有消息状态
|
|
43
|
+
*/
|
|
44
|
+
export declare function clearAllMessageStates(): void;
|
|
45
|
+
/**
|
|
46
|
+
* 设置 chatId 对应的 reqId
|
|
47
|
+
*/
|
|
48
|
+
export declare function setReqIdForChat(chatId: string, reqId: string, accountId?: string): void;
|
|
49
|
+
/**
|
|
50
|
+
* 获取 chatId 对应的 reqId(异步)
|
|
51
|
+
*/
|
|
52
|
+
export declare function getReqIdForChatAsync(chatId: string, accountId?: string): Promise<string | undefined>;
|
|
53
|
+
/**
|
|
54
|
+
* 获取 chatId 对应的 reqId(同步:仅内存)
|
|
55
|
+
*/
|
|
56
|
+
export declare function getReqIdForChat(chatId: string, accountId?: string): string | undefined;
|
|
57
|
+
/**
|
|
58
|
+
* 删除 chatId 对应的 reqId
|
|
59
|
+
*/
|
|
60
|
+
export declare function deleteReqIdForChat(chatId: string, accountId?: string): void;
|
|
61
|
+
/**
|
|
62
|
+
* 启动时预热 reqId 缓存
|
|
63
|
+
*/
|
|
64
|
+
export declare function warmupReqIdStore(accountId?: string, log?: (...args: unknown[]) => void): Promise<number>;
|
|
65
|
+
/**
|
|
66
|
+
* 刷写 reqId 数据(纯内存模式下为无操作)
|
|
67
|
+
*/
|
|
68
|
+
export declare function flushReqIdStore(accountId?: string): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* 清理指定账户的所有资源
|
|
71
|
+
*/
|
|
72
|
+
export declare function cleanupAccount(accountId: string): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* 清理所有资源(用于进程退出)
|
|
75
|
+
*/
|
|
76
|
+
export declare function cleanupAll(): Promise<void>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 模板卡片解析器
|
|
3
|
+
*
|
|
4
|
+
* 从 LLM 回复文本中提取 markdown JSON 代码块,验证其是否为合法的企业微信模板卡片,
|
|
5
|
+
* 返回提取到的卡片列表和剩余文本。
|
|
6
|
+
*
|
|
7
|
+
* 同时提供 maskTemplateCardBlocks 函数,用于在流式中间帧中隐藏正在构建的卡片代码块,
|
|
8
|
+
* 避免 JSON 源码暴露给终端用户。
|
|
9
|
+
*/
|
|
10
|
+
import type { TemplateCardExtractionResult } from "./interface.js";
|
|
11
|
+
/**
|
|
12
|
+
* 从文本中提取模板卡片 JSON 代码块
|
|
13
|
+
*/
|
|
14
|
+
export declare function extractTemplateCards(text: string, log?: (...args: any[]) => void): TemplateCardExtractionResult;
|
|
15
|
+
/**
|
|
16
|
+
* 遮罩文本中的模板卡片代码块(用于流式中间帧展示)
|
|
17
|
+
*/
|
|
18
|
+
export declare function maskTemplateCardBlocks(text: string, log?: (...args: any[]) => void): string;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 超时控制工具模块
|
|
3
|
+
*
|
|
4
|
+
* 为异步操作提供统一的超时保护机制
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* 为 Promise 添加超时保护
|
|
8
|
+
*
|
|
9
|
+
* @param promise - 原始 Promise
|
|
10
|
+
* @param timeoutMs - 超时时间(毫秒)
|
|
11
|
+
* @param message - 超时错误消息
|
|
12
|
+
* @returns 带超时保护的 Promise
|
|
13
|
+
*/
|
|
14
|
+
export declare function withTimeout<T>(promise: Promise<T>, timeoutMs: number, message?: string): Promise<T>;
|
|
15
|
+
/**
|
|
16
|
+
* 超时错误类型
|
|
17
|
+
*/
|
|
18
|
+
export declare class TimeoutError extends Error {
|
|
19
|
+
constructor(message: string);
|
|
20
|
+
}
|
package/dist/index.d.ts
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@wwlocal/aibot-plugin-node",
|
|
3
|
+
"version": "20260409.20.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "dist/cjs/index.js",
|
|
6
|
+
"module": "dist/esm/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"aibot-plugin": "./dist/esm/index.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"config.example.json",
|
|
14
|
+
"README.md"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "rollup -c",
|
|
18
|
+
"dev": "rollup -c -w",
|
|
19
|
+
"clean": "rm -rf dist",
|
|
20
|
+
"version:stamp": "node scripts/version-stamp.cjs",
|
|
21
|
+
"prebuild": "npm run clean && npm run version:stamp",
|
|
22
|
+
"start": "node dist/esm/index.js"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"wecom",
|
|
26
|
+
"aibot",
|
|
27
|
+
"plugin",
|
|
28
|
+
"openai",
|
|
29
|
+
"agent"
|
|
30
|
+
],
|
|
31
|
+
"author": "",
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"description": "独立运行的企业微信私有部署 AI 机器人插件,支持对接第三方智能体(OpenAI API 兼容)",
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@wecom/aibot-node-sdk": "^1.0.4",
|
|
36
|
+
"express": "^4.21.0",
|
|
37
|
+
"file-type": "^21.3.0"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@rollup/plugin-commonjs": "^25.0.7",
|
|
41
|
+
"@rollup/plugin-json": "^6.1.0",
|
|
42
|
+
"@rollup/plugin-node-resolve": "^15.2.3",
|
|
43
|
+
"@rollup/plugin-typescript": "^11.1.6",
|
|
44
|
+
"@types/express": "^4.17.21",
|
|
45
|
+
"@types/node": "^20.11.0",
|
|
46
|
+
"rollup": "^4.9.6",
|
|
47
|
+
"rollup-plugin-dts": "^6.1.0",
|
|
48
|
+
"tslib": "^2.6.2",
|
|
49
|
+
"typescript": "^5.3.3"
|
|
50
|
+
}
|
|
51
|
+
}
|