@wildfirechat/openclaw-plugin 1.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.
- package/README.md +107 -0
- package/dist/channel.d.ts +65 -0
- package/dist/channel.d.ts.map +1 -0
- package/dist/channel.js +221 -0
- package/dist/channel.js.map +1 -0
- package/dist/clients.d.ts +26 -0
- package/dist/clients.d.ts.map +1 -0
- package/dist/clients.js +81 -0
- package/dist/clients.js.map +1 -0
- package/dist/config.d.ts +28 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +77 -0
- package/dist/config.js.map +1 -0
- package/dist/inbound.d.ts +9 -0
- package/dist/inbound.d.ts.map +1 -0
- package/dist/inbound.js +286 -0
- package/dist/inbound.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/targets.d.ts +23 -0
- package/dist/targets.d.ts.map +1 -0
- package/dist/targets.js +36 -0
- package/dist/targets.js.map +1 -0
- package/dist/utils.d.ts +9 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +85 -0
- package/dist/utils.js.map +1 -0
- package/openclaw.plugin.json +95 -0
- package/package.json +59 -0
package/README.md
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# OpenClaw Wildfire IM 插件
|
|
2
|
+
|
|
3
|
+
OpenClaw 的野火 IM (Wildfire IM) 频道插件,支持收发消息、流式回复和文件传输。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# 构建并打包
|
|
9
|
+
cd openclaw-plugin.js
|
|
10
|
+
npm install
|
|
11
|
+
npm run build
|
|
12
|
+
npm pack
|
|
13
|
+
|
|
14
|
+
# 安装到 OpenClaw
|
|
15
|
+
openclaw plugins install ./openclaw-wildfire-1.0.0.tgz
|
|
16
|
+
openclaw restart
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## 配置
|
|
20
|
+
|
|
21
|
+
编辑 `~/.openclaw/openclaw.json`:
|
|
22
|
+
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"channels": {
|
|
26
|
+
"wildfire": {
|
|
27
|
+
"enabled": true,
|
|
28
|
+
"accounts": {
|
|
29
|
+
"default": {
|
|
30
|
+
"enabled": true,
|
|
31
|
+
"gatewayUrl": "ws://your_gateway_host:8884/robot/gateway",
|
|
32
|
+
"robotId": "your robot id",
|
|
33
|
+
"robotSecret": "your robot secret",
|
|
34
|
+
"requireMention": true,
|
|
35
|
+
"helpKeywords": "帮,请,分析,总结"
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### 配置项说明
|
|
44
|
+
|
|
45
|
+
| 配置项 | 必填 | 说明 |
|
|
46
|
+
|--------|------|------|
|
|
47
|
+
| `enabled` | 否 | 是否启用,默认 `true` |
|
|
48
|
+
| `gatewayUrl` | 是 | 野火网关 WebSocket 地址 |
|
|
49
|
+
| `robotId` | 是 | 机器人 ID |
|
|
50
|
+
| `robotSecret` | 是 | 机器人密钥 |
|
|
51
|
+
| `requireMention` | 否 | 群聊是否需要@机器人才回复,默认 `true` |
|
|
52
|
+
| `helpKeywords` | 否 | 触发回复的关键词,逗号分隔 |
|
|
53
|
+
|
|
54
|
+
## 特性
|
|
55
|
+
|
|
56
|
+
- **消息接收**: 支持私聊和群聊消息
|
|
57
|
+
- **流式回复**: AI 回复实时更新到同一条消息
|
|
58
|
+
- **文件传输**: 支持图片、视频、文件上传和发送
|
|
59
|
+
- **群聊过滤**: 支持@提及检测和关键词触发
|
|
60
|
+
|
|
61
|
+
## 目录结构
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
openclaw-plugin.js/
|
|
65
|
+
├── src/
|
|
66
|
+
│ ├── channel.ts # 频道插件主实现
|
|
67
|
+
│ ├── clients.ts # Wildfire 客户端管理
|
|
68
|
+
│ ├── config.ts # 配置类型和验证
|
|
69
|
+
│ ├── inbound.ts # 入站消息处理
|
|
70
|
+
│ ├── targets.ts # 目标 ID 解析
|
|
71
|
+
│ └── utils.ts # 工具函数
|
|
72
|
+
├── package.json
|
|
73
|
+
├── tsconfig.json
|
|
74
|
+
└── README.md
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## 消息格式
|
|
78
|
+
|
|
79
|
+
### Target 格式
|
|
80
|
+
|
|
81
|
+
- 单聊: `user:用户ID` 或 `用户ID`
|
|
82
|
+
- 群聊: `group:群组ID`
|
|
83
|
+
|
|
84
|
+
### Mention 检测
|
|
85
|
+
|
|
86
|
+
- `mentionedType === 2`: @所有人,始终回复
|
|
87
|
+
- `mentionedType === 1`: @部分人,检查 `mentionedTargets`
|
|
88
|
+
|
|
89
|
+
## 调试
|
|
90
|
+
|
|
91
|
+
启用详细日志:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
openclaw config set logLevel debug
|
|
95
|
+
openclaw restart
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
日志前缀 `[wildfire]` 即为插件输出。
|
|
99
|
+
|
|
100
|
+
## 依赖
|
|
101
|
+
|
|
102
|
+
- `@wildfirechat/robot-gateway-client-sdk`: 野火机器人网关客户端
|
|
103
|
+
- `@wildfirechat/server-sdk`: 消息内容模型
|
|
104
|
+
|
|
105
|
+
## License
|
|
106
|
+
|
|
107
|
+
MIT
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw Channel Plugin implementation for Wildfire IM
|
|
3
|
+
*/
|
|
4
|
+
export declare const WildfireChannelPlugin: {
|
|
5
|
+
id: string;
|
|
6
|
+
meta: {
|
|
7
|
+
id: string;
|
|
8
|
+
label: string;
|
|
9
|
+
selectionLabel: string;
|
|
10
|
+
docsPath: string;
|
|
11
|
+
blurb: string;
|
|
12
|
+
aliases: string[];
|
|
13
|
+
};
|
|
14
|
+
capabilities: {
|
|
15
|
+
chatTypes: string[];
|
|
16
|
+
};
|
|
17
|
+
config: {
|
|
18
|
+
listAccountIds: (cfg: any) => string[];
|
|
19
|
+
resolveAccount: (cfg: any, accountId?: string) => any;
|
|
20
|
+
};
|
|
21
|
+
messaging: {
|
|
22
|
+
normalizeTarget: (raw: string) => string | undefined;
|
|
23
|
+
targetResolver: {
|
|
24
|
+
looksLikeId: (raw: string, normalized?: string) => boolean;
|
|
25
|
+
hint: string;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
outbound: {
|
|
29
|
+
deliveryMode: "direct";
|
|
30
|
+
resolveTarget: ({ to }: {
|
|
31
|
+
to?: string;
|
|
32
|
+
}) => {
|
|
33
|
+
ok: boolean;
|
|
34
|
+
error: Error;
|
|
35
|
+
to?: undefined;
|
|
36
|
+
} | {
|
|
37
|
+
ok: boolean;
|
|
38
|
+
to: string;
|
|
39
|
+
error?: undefined;
|
|
40
|
+
};
|
|
41
|
+
sendText: ({ to, text, accountId, }: {
|
|
42
|
+
to: string;
|
|
43
|
+
text: string;
|
|
44
|
+
accountId?: string;
|
|
45
|
+
}) => Promise<{
|
|
46
|
+
ok: boolean;
|
|
47
|
+
error: Error;
|
|
48
|
+
provider?: undefined;
|
|
49
|
+
} | {
|
|
50
|
+
ok: boolean;
|
|
51
|
+
provider: string;
|
|
52
|
+
error?: undefined;
|
|
53
|
+
}>;
|
|
54
|
+
sendMedia: (ctx: any) => Promise<{
|
|
55
|
+
ok: boolean;
|
|
56
|
+
error: Error;
|
|
57
|
+
provider?: undefined;
|
|
58
|
+
} | {
|
|
59
|
+
ok: boolean;
|
|
60
|
+
provider: string;
|
|
61
|
+
error?: undefined;
|
|
62
|
+
}>;
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=channel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;8BAkBR,GAAG;8BAIH,GAAG,cAAc,MAAM;;;+BAOtB,MAAM;;+BAMR,MAAM,eAAe,MAAM;;;;;;gCAyBxB;YAAE,EAAE,CAAC,EAAE,MAAM,CAAA;SAAE;;;;;;;;;6CA0BpC;YACD,EAAE,EAAE,MAAM,CAAC;YACX,IAAI,EAAE,MAAM,CAAC;YACb,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB;;;;;;;;;yBA4CsB,GAAG;;;;;;;;;;CAgH7B,CAAC"}
|
package/dist/channel.js
ADDED
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw Channel Plugin implementation for Wildfire IM
|
|
3
|
+
*/
|
|
4
|
+
import { getConnectedClient } from "./clients.js";
|
|
5
|
+
import { parseTarget } from "./targets.js";
|
|
6
|
+
import { TextMessageContent, ImageMessageContent, VideoMessageContent, FileMessageContent, } from "@wildfirechat/server-sdk";
|
|
7
|
+
import { readFileSync } from "fs";
|
|
8
|
+
export const WildfireChannelPlugin = {
|
|
9
|
+
id: "wildfire",
|
|
10
|
+
meta: {
|
|
11
|
+
id: "wildfire",
|
|
12
|
+
label: "Wildfire IM",
|
|
13
|
+
selectionLabel: "Wildfire IM",
|
|
14
|
+
docsPath: "/channels/wildfire",
|
|
15
|
+
blurb: "Wildfire IM protocol channel via @wildfirechat/robot-gateway-client-sdk",
|
|
16
|
+
aliases: ["wildfire", "wf"],
|
|
17
|
+
},
|
|
18
|
+
capabilities: {
|
|
19
|
+
chatTypes: ["direct", "group"],
|
|
20
|
+
},
|
|
21
|
+
config: {
|
|
22
|
+
// Single account - always returns default
|
|
23
|
+
listAccountIds: (cfg) => {
|
|
24
|
+
if (cfg?.enabled === false)
|
|
25
|
+
return [];
|
|
26
|
+
return ["default"];
|
|
27
|
+
},
|
|
28
|
+
resolveAccount: (cfg, accountId) => {
|
|
29
|
+
if (accountId && accountId !== "default")
|
|
30
|
+
return null;
|
|
31
|
+
return cfg || null;
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
messaging: {
|
|
35
|
+
normalizeTarget: (raw) => {
|
|
36
|
+
// Remove wildfire: prefix and return normalized target
|
|
37
|
+
const normalized = raw.replace(/^(wildfire|wf):/i, "");
|
|
38
|
+
return normalized || undefined;
|
|
39
|
+
},
|
|
40
|
+
targetResolver: {
|
|
41
|
+
looksLikeId: (raw, normalized) => {
|
|
42
|
+
const value = (normalized ?? raw).trim();
|
|
43
|
+
if (!value)
|
|
44
|
+
return false;
|
|
45
|
+
// Accept explicit user: or group: prefixes
|
|
46
|
+
if (/^(user|group):/i.test(value)) {
|
|
47
|
+
const id = value.replace(/^(user|group):/i, "");
|
|
48
|
+
// Reject bot targets
|
|
49
|
+
if (id === "bot" || id.startsWith("robot_"))
|
|
50
|
+
return false;
|
|
51
|
+
return id.length > 0;
|
|
52
|
+
}
|
|
53
|
+
// Reject bot targets for bare IDs too
|
|
54
|
+
if (value === "bot" || value.startsWith("robot_"))
|
|
55
|
+
return false;
|
|
56
|
+
// Accept any non-empty string as potential Wildfire ID
|
|
57
|
+
return value.length > 0;
|
|
58
|
+
},
|
|
59
|
+
hint: "<user:userId|group:groupId|userId|groupId>",
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
outbound: {
|
|
63
|
+
deliveryMode: "direct",
|
|
64
|
+
resolveTarget: ({ to }) => {
|
|
65
|
+
console.log(`[wildfire] resolveTarget called with to=${to}`);
|
|
66
|
+
if (!to) {
|
|
67
|
+
return { ok: false, error: new Error("Wildfire requires --to <userId|groupId>") };
|
|
68
|
+
}
|
|
69
|
+
// 解析并验证 target
|
|
70
|
+
const target = parseTarget(to);
|
|
71
|
+
if (!target) {
|
|
72
|
+
return { ok: false, error: new Error(`Invalid target format: ${to}`) };
|
|
73
|
+
}
|
|
74
|
+
// 排除无效的目标(如 wildfire:bot 或 wildfire:robot_xxx)
|
|
75
|
+
if (!target.id || target.id === "bot" || target.id.startsWith("robot_")) {
|
|
76
|
+
return { ok: false, error: new Error(`Invalid target: ${to} (cannot send to bot itself)`) };
|
|
77
|
+
}
|
|
78
|
+
// 返回规范化的格式
|
|
79
|
+
const normalizedTo = target.isGroup ? `group:${target.id}` : `user:${target.id}`;
|
|
80
|
+
return { ok: true, to: normalizedTo };
|
|
81
|
+
},
|
|
82
|
+
sendText: async ({ to, text, accountId, }) => {
|
|
83
|
+
console.log(`[wildfire] sendText called: to=${to}, text=${text?.substring(0, 50)}`);
|
|
84
|
+
const client = getConnectedClient();
|
|
85
|
+
if (!client) {
|
|
86
|
+
console.error("[wildfire] client not found");
|
|
87
|
+
return { ok: false, error: new Error("Wildfire not connected") };
|
|
88
|
+
}
|
|
89
|
+
console.log(`[wildfire] client found, connected=${client.isConnected?.()}`);
|
|
90
|
+
const target = parseTarget(to);
|
|
91
|
+
if (!target) {
|
|
92
|
+
console.error(`[wildfire] invalid target: ${to}`);
|
|
93
|
+
return { ok: false, error: new Error("invalid target") };
|
|
94
|
+
}
|
|
95
|
+
console.log(`[wildfire] target parsed: id=${target.id}, isGroup=${target.isGroup}`);
|
|
96
|
+
try {
|
|
97
|
+
const conversation = {
|
|
98
|
+
type: target.isGroup ? 1 : 0,
|
|
99
|
+
target: target.id,
|
|
100
|
+
line: 0,
|
|
101
|
+
};
|
|
102
|
+
const content = new TextMessageContent();
|
|
103
|
+
content.content = text;
|
|
104
|
+
console.log(`[wildfire] sending message...`);
|
|
105
|
+
const result = await client.sendMessage(conversation, content.encode());
|
|
106
|
+
console.log(`[wildfire] send result: success=${result.isSuccess()}, msg=${result.getMsg?.()}`);
|
|
107
|
+
if (!result.isSuccess()) {
|
|
108
|
+
return { ok: false, error: new Error(result.getMsg()) };
|
|
109
|
+
}
|
|
110
|
+
return { ok: true, provider: "wildfire" };
|
|
111
|
+
}
|
|
112
|
+
catch (e) {
|
|
113
|
+
console.error(`[wildfire] send error:`, e);
|
|
114
|
+
return { ok: false, error: new Error(e.message) };
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
sendMedia: async (ctx) => {
|
|
118
|
+
const { to, mediaUrl, text, accountId } = ctx;
|
|
119
|
+
console.log(`[wildfire] sendMedia called: to=${to}, mediaUrl=${mediaUrl}`);
|
|
120
|
+
if (!mediaUrl) {
|
|
121
|
+
console.error(`[wildfire] mediaUrl is required`);
|
|
122
|
+
return { ok: false, error: new Error("mediaUrl is required") };
|
|
123
|
+
}
|
|
124
|
+
const client = getConnectedClient();
|
|
125
|
+
if (!client) {
|
|
126
|
+
console.error(`[wildfire] client not connected`);
|
|
127
|
+
return { ok: false, error: new Error("Wildfire not connected") };
|
|
128
|
+
}
|
|
129
|
+
console.log(`[wildfire] client connected: ${client.isConnected?.()}`);
|
|
130
|
+
const target = parseTarget(to);
|
|
131
|
+
if (!target) {
|
|
132
|
+
console.error(`[wildfire] invalid target: ${to}`);
|
|
133
|
+
return { ok: false, error: new Error("invalid target") };
|
|
134
|
+
}
|
|
135
|
+
console.log(`[wildfire] target parsed: id=${target.id}, isGroup=${target.isGroup}`);
|
|
136
|
+
try {
|
|
137
|
+
const conversation = {
|
|
138
|
+
type: target.isGroup ? 1 : 0,
|
|
139
|
+
target: target.id,
|
|
140
|
+
line: 0,
|
|
141
|
+
};
|
|
142
|
+
let remoteUrl;
|
|
143
|
+
let fileName;
|
|
144
|
+
// Check if it's a local file path or remote URL
|
|
145
|
+
if (mediaUrl.startsWith('http://') || mediaUrl.startsWith('https://')) {
|
|
146
|
+
// Remote URL - use directly
|
|
147
|
+
console.log(`[wildfire] using remote URL`);
|
|
148
|
+
remoteUrl = mediaUrl;
|
|
149
|
+
fileName = mediaUrl.split('/').pop()?.split('?')[0] || "file";
|
|
150
|
+
console.log(`[wildfire] fileName: ${fileName}`);
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
// Local file - upload to Wildfire server
|
|
154
|
+
console.log(`[wildfire] local file path detected: ${mediaUrl}`);
|
|
155
|
+
fileName = mediaUrl.split('/').pop() || "file";
|
|
156
|
+
console.log(`[wildfire] fileName: ${fileName}`);
|
|
157
|
+
// Read file as Buffer
|
|
158
|
+
console.log(`[wildfire] reading file...`);
|
|
159
|
+
let fileData;
|
|
160
|
+
try {
|
|
161
|
+
fileData = readFileSync(mediaUrl);
|
|
162
|
+
console.log(`[wildfire] file read success, size=${fileData.length} bytes`);
|
|
163
|
+
}
|
|
164
|
+
catch (readErr) {
|
|
165
|
+
console.error(`[wildfire] file read failed: ${readErr.message}`);
|
|
166
|
+
return { ok: false, error: new Error(`Failed to read file: ${readErr.message}`) };
|
|
167
|
+
}
|
|
168
|
+
// Upload file
|
|
169
|
+
console.log(`[wildfire] uploading file with name=${fileName}...`);
|
|
170
|
+
let uploadResult;
|
|
171
|
+
try {
|
|
172
|
+
uploadResult = await client.uploadFile(fileData, fileName, 4, 'application/octet-stream');
|
|
173
|
+
console.log(`[wildfire] uploadFile returned: code=${uploadResult?.getCode?.()}, msg=${uploadResult?.getMsg?.()}`);
|
|
174
|
+
}
|
|
175
|
+
catch (uploadErr) {
|
|
176
|
+
console.error(`[wildfire] uploadFile threw error: ${uploadErr.message}`);
|
|
177
|
+
return { ok: false, error: new Error(`Upload error: ${uploadErr.message}`) };
|
|
178
|
+
}
|
|
179
|
+
if (!uploadResult.isSuccess()) {
|
|
180
|
+
console.error(`[wildfire] upload failed: ${uploadResult.getMsg()}`);
|
|
181
|
+
return { ok: false, error: new Error(`Upload failed: ${uploadResult.getMsg()}`) };
|
|
182
|
+
}
|
|
183
|
+
remoteUrl = uploadResult.getResult();
|
|
184
|
+
console.log(`[wildfire] file uploaded success, remoteUrl=${remoteUrl}`);
|
|
185
|
+
}
|
|
186
|
+
// Detect media type from file extension
|
|
187
|
+
const ext = fileName.toLowerCase();
|
|
188
|
+
console.log(`[wildfire] detecting media type for extension: ${ext}`);
|
|
189
|
+
let payload;
|
|
190
|
+
if (ext.match(/\.(jpg|jpeg|png|gif|webp|bmp)$/)) {
|
|
191
|
+
console.log(`[wildfire] sending as image`);
|
|
192
|
+
const imageContent = new ImageMessageContent(null, remoteUrl, null);
|
|
193
|
+
payload = imageContent.encode();
|
|
194
|
+
}
|
|
195
|
+
else if (ext.match(/\.(mp4|mov|avi|mkv|webm)$/)) {
|
|
196
|
+
console.log(`[wildfire] sending as video`);
|
|
197
|
+
const videoContent = new VideoMessageContent(null, remoteUrl, null, 0);
|
|
198
|
+
payload = videoContent.encode();
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
console.log(`[wildfire] sending as file`);
|
|
202
|
+
const fileContent = new FileMessageContent(null, remoteUrl, fileName, 0);
|
|
203
|
+
payload = fileContent.encode();
|
|
204
|
+
}
|
|
205
|
+
console.log(`[wildfire] sending message...`);
|
|
206
|
+
const result = await client.sendMessage(conversation, payload);
|
|
207
|
+
console.log(`[wildfire] sendMessage result: success=${result.isSuccess()}, msg=${result.getMsg?.()}`);
|
|
208
|
+
if (!result.isSuccess()) {
|
|
209
|
+
return { ok: false, error: new Error(result.getMsg()) };
|
|
210
|
+
}
|
|
211
|
+
console.log(`[wildfire] sendMedia completed successfully`);
|
|
212
|
+
return { ok: true, provider: "wildfire" };
|
|
213
|
+
}
|
|
214
|
+
catch (e) {
|
|
215
|
+
console.error(`[wildfire] sendMedia error: ${e.message}`, e);
|
|
216
|
+
return { ok: false, error: new Error(e.message) };
|
|
217
|
+
}
|
|
218
|
+
},
|
|
219
|
+
},
|
|
220
|
+
};
|
|
221
|
+
//# sourceMappingURL=channel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wildfire IM client management (Single Account)
|
|
3
|
+
*/
|
|
4
|
+
import { RobotServiceClient } from "@wildfirechat/robot-gateway-client-sdk";
|
|
5
|
+
import type { WildfireConfig } from "./config.js";
|
|
6
|
+
/**
|
|
7
|
+
* Check if client is connected
|
|
8
|
+
*/
|
|
9
|
+
export declare function isClientConnected(): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Start the client
|
|
12
|
+
*/
|
|
13
|
+
export declare function startClient(api: any, config: WildfireConfig): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Get the client instance
|
|
16
|
+
*/
|
|
17
|
+
export declare function getClient(): RobotServiceClient | null;
|
|
18
|
+
/**
|
|
19
|
+
* Get connected client (checks connection status)
|
|
20
|
+
*/
|
|
21
|
+
export declare function getConnectedClient(): RobotServiceClient | null;
|
|
22
|
+
/**
|
|
23
|
+
* Stop the client
|
|
24
|
+
*/
|
|
25
|
+
export declare function stopClient(api?: any): Promise<void>;
|
|
26
|
+
//# sourceMappingURL=clients.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clients.d.ts","sourceRoot":"","sources":["../src/clients.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAE5E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAOlD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAqCjF;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,kBAAkB,GAAG,IAAI,CAErD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,kBAAkB,GAAG,IAAI,CAK9D;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAWzD"}
|
package/dist/clients.js
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wildfire IM client management (Single Account)
|
|
3
|
+
*/
|
|
4
|
+
import { RobotServiceClient } from "@wildfirechat/robot-gateway-client-sdk";
|
|
5
|
+
import { init as initServerSdk } from "@wildfirechat/server-sdk";
|
|
6
|
+
import { handleIncomingMessage } from "./inbound.js";
|
|
7
|
+
// Single client instance
|
|
8
|
+
let client = null;
|
|
9
|
+
let connected = false;
|
|
10
|
+
/**
|
|
11
|
+
* Check if client is connected
|
|
12
|
+
*/
|
|
13
|
+
export function isClientConnected() {
|
|
14
|
+
return connected && client !== null;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Start the client
|
|
18
|
+
*/
|
|
19
|
+
export async function startClient(api, config) {
|
|
20
|
+
if (client) {
|
|
21
|
+
api.logger?.warn?.("[wildfire] client already exists");
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
// Initialize server SDK for message models
|
|
25
|
+
initServerSdk("http://localhost:18080", "dummy");
|
|
26
|
+
client = new RobotServiceClient(config.gatewayUrl, {
|
|
27
|
+
onMessage: (message) => handleIncomingMessage(api, message, config),
|
|
28
|
+
onConnectionChanged: (isConnected) => {
|
|
29
|
+
connected = isConnected;
|
|
30
|
+
api.logger?.info?.(`[wildfire] connection changed: ${isConnected}`);
|
|
31
|
+
},
|
|
32
|
+
onError: (error) => {
|
|
33
|
+
api.logger?.error?.("[wildfire] error:", error);
|
|
34
|
+
},
|
|
35
|
+
}, {
|
|
36
|
+
timeout: 30,
|
|
37
|
+
reconnectInterval: 5000,
|
|
38
|
+
heartbeatInterval: 270000,
|
|
39
|
+
});
|
|
40
|
+
const isConn = await client.connect(config.robotId, config.robotSecret);
|
|
41
|
+
if (isConn) {
|
|
42
|
+
connected = true;
|
|
43
|
+
api.logger?.info?.(`[wildfire] connected as ${config.robotId}`);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
api.logger?.error?.(`[wildfire] failed to connect`);
|
|
47
|
+
throw new Error("Failed to connect to Wildfire IM");
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get the client instance
|
|
52
|
+
*/
|
|
53
|
+
export function getClient() {
|
|
54
|
+
return client;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get connected client (checks connection status)
|
|
58
|
+
*/
|
|
59
|
+
export function getConnectedClient() {
|
|
60
|
+
if (client && connected) {
|
|
61
|
+
return client;
|
|
62
|
+
}
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Stop the client
|
|
67
|
+
*/
|
|
68
|
+
export async function stopClient(api) {
|
|
69
|
+
if (client) {
|
|
70
|
+
try {
|
|
71
|
+
client.close();
|
|
72
|
+
api?.logger?.info?.("[wildfire] disconnected");
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
api?.logger?.error?.("[wildfire] error stopping:", err);
|
|
76
|
+
}
|
|
77
|
+
client = null;
|
|
78
|
+
connected = false;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=clients.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clients.js","sourceRoot":"","sources":["../src/clients.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAC5E,OAAO,EAAE,IAAI,IAAI,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD,yBAAyB;AACzB,IAAI,MAAM,GAA8B,IAAI,CAAC;AAC7C,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,SAAS,IAAI,MAAM,KAAK,IAAI,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAQ,EAAE,MAAsB;IAChE,IAAI,MAAM,EAAE,CAAC;QACX,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,kCAAkC,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IAED,2CAA2C;IAC3C,aAAa,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;IAEjD,MAAM,GAAG,IAAI,kBAAkB,CAC7B,MAAM,CAAC,UAAW,EAClB;QACE,SAAS,EAAE,CAAC,OAAY,EAAE,EAAE,CAAC,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC;QACxE,mBAAmB,EAAE,CAAC,WAAoB,EAAE,EAAE;YAC5C,SAAS,GAAG,WAAW,CAAC;YACxB,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,kCAAkC,WAAW,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;YACxB,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;QAClD,CAAC;KACF,EACD;QACE,OAAO,EAAE,EAAE;QACX,iBAAiB,EAAE,IAAI;QACvB,iBAAiB,EAAE,MAAM;KAC1B,CACF,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAQ,EAAE,MAAM,CAAC,WAAY,CAAC,CAAC;IAE1E,IAAI,MAAM,EAAE,CAAC;QACX,SAAS,GAAG,IAAI,CAAC;QACjB,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,2BAA2B,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,8BAA8B,CAAC,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,IAAI,MAAM,IAAI,SAAS,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAS;IACxC,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC;YACH,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,yBAAyB,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,GAAG,IAAI,CAAC;QACd,SAAS,GAAG,KAAK,CAAC;IACpB,CAAC;AACH,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration for Wildfire IM channel (Single Account)
|
|
3
|
+
*/
|
|
4
|
+
export interface WildfireConfig {
|
|
5
|
+
enabled?: boolean;
|
|
6
|
+
gatewayUrl?: string;
|
|
7
|
+
robotId?: string;
|
|
8
|
+
robotSecret?: string;
|
|
9
|
+
requireMention?: boolean;
|
|
10
|
+
helpKeywords?: string;
|
|
11
|
+
accounts?: Record<string, WildfireConfig>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Get the effective configuration for an account
|
|
15
|
+
*/
|
|
16
|
+
export declare function getAccountConfig(api: any, accountId?: string): WildfireConfig | null;
|
|
17
|
+
/**
|
|
18
|
+
* List all enabled account configurations
|
|
19
|
+
*/
|
|
20
|
+
export declare function listEnabledAccountConfigs(api: any): Array<{
|
|
21
|
+
id: string;
|
|
22
|
+
config: WildfireConfig;
|
|
23
|
+
}>;
|
|
24
|
+
/**
|
|
25
|
+
* Validate account configuration
|
|
26
|
+
*/
|
|
27
|
+
export declare function validateConfig(config: WildfireConfig): string | null;
|
|
28
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC3C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,GAAE,MAAkB,GAAG,cAAc,GAAG,IAAI,CA6B/F;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,GAAG,GAAG,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,CAAC,CAyBjG;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAWpE"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration for Wildfire IM channel (Single Account)
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Get the effective configuration for an account
|
|
6
|
+
*/
|
|
7
|
+
export function getAccountConfig(api, accountId = "default") {
|
|
8
|
+
const cfg = api.config.channels.wildfire || {};
|
|
9
|
+
// If using multi-account config
|
|
10
|
+
if (cfg.accounts?.[accountId]) {
|
|
11
|
+
const account = cfg.accounts[accountId];
|
|
12
|
+
if (account.enabled === false)
|
|
13
|
+
return null;
|
|
14
|
+
return {
|
|
15
|
+
gatewayUrl: account.gatewayUrl ?? cfg.gatewayUrl,
|
|
16
|
+
robotId: account.robotId ?? cfg.robotId,
|
|
17
|
+
robotSecret: account.robotSecret ?? cfg.robotSecret,
|
|
18
|
+
requireMention: account.requireMention ?? cfg.requireMention ?? true,
|
|
19
|
+
helpKeywords: account.helpKeywords ?? cfg.helpKeywords ?? "帮,请,分析,总结",
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
// Single account (legacy) config
|
|
23
|
+
if (accountId === "default") {
|
|
24
|
+
if (cfg.enabled === false)
|
|
25
|
+
return null;
|
|
26
|
+
return {
|
|
27
|
+
gatewayUrl: cfg.gatewayUrl,
|
|
28
|
+
robotId: cfg.robotId,
|
|
29
|
+
robotSecret: cfg.robotSecret,
|
|
30
|
+
requireMention: cfg.requireMention ?? true,
|
|
31
|
+
helpKeywords: cfg.helpKeywords ?? "帮,请,分析,总结",
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* List all enabled account configurations
|
|
38
|
+
*/
|
|
39
|
+
export function listEnabledAccountConfigs(api) {
|
|
40
|
+
const cfg = api.config.channels.wildfire || {};
|
|
41
|
+
const accounts = [];
|
|
42
|
+
// Check multi-account config
|
|
43
|
+
if (cfg.accounts) {
|
|
44
|
+
for (const [id, account] of Object.entries(cfg.accounts)) {
|
|
45
|
+
if (account.enabled !== false) {
|
|
46
|
+
const effective = getAccountConfig(api, id);
|
|
47
|
+
if (effective) {
|
|
48
|
+
accounts.push({ id, config: effective });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Check single account config
|
|
54
|
+
if (accounts.length === 0 && cfg.enabled !== false) {
|
|
55
|
+
const defaultConfig = getAccountConfig(api, "default");
|
|
56
|
+
if (defaultConfig) {
|
|
57
|
+
accounts.push({ id: "default", config: defaultConfig });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return accounts;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Validate account configuration
|
|
64
|
+
*/
|
|
65
|
+
export function validateConfig(config) {
|
|
66
|
+
if (!config.gatewayUrl) {
|
|
67
|
+
return "gatewayUrl is required";
|
|
68
|
+
}
|
|
69
|
+
if (!config.robotId) {
|
|
70
|
+
return "robotId is required";
|
|
71
|
+
}
|
|
72
|
+
if (!config.robotSecret) {
|
|
73
|
+
return "robotSecret is required";
|
|
74
|
+
}
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handle incoming messages from Wildfire IM
|
|
3
|
+
*/
|
|
4
|
+
import type { WildfireConfig } from "./config.js";
|
|
5
|
+
/**
|
|
6
|
+
* Process incoming message from Wildfire IM
|
|
7
|
+
*/
|
|
8
|
+
export declare function handleIncomingMessage(api: any, message: any, config: WildfireConfig): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=inbound.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbound.d.ts","sourceRoot":"","sources":["../src/inbound.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAsBlD;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,GAAG,EACZ,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC,CAoLf"}
|