@kartik.doda/openclaw-plugin-test 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/LICENSE +21 -0
- package/README.md +128 -0
- package/dist/cli/admin-api.d.ts +58 -0
- package/dist/cli/admin-api.d.ts.map +1 -0
- package/dist/cli/admin-api.js +242 -0
- package/dist/cli/admin-api.js.map +1 -0
- package/dist/cli/auth.d.ts +5 -0
- package/dist/cli/auth.d.ts.map +1 -0
- package/dist/cli/auth.js +184 -0
- package/dist/cli/auth.js.map +1 -0
- package/dist/cli/bot.d.ts +3 -0
- package/dist/cli/bot.d.ts.map +1 -0
- package/dist/cli/bot.js +100 -0
- package/dist/cli/bot.js.map +1 -0
- package/dist/cli/config-updater.d.ts +70 -0
- package/dist/cli/config-updater.d.ts.map +1 -0
- package/dist/cli/config-updater.js +277 -0
- package/dist/cli/config-updater.js.map +1 -0
- package/dist/cli/credentials.d.ts +14 -0
- package/dist/cli/credentials.d.ts.map +1 -0
- package/dist/cli/credentials.js +45 -0
- package/dist/cli/credentials.js.map +1 -0
- package/dist/cli/rate-limiter.d.ts +17 -0
- package/dist/cli/rate-limiter.d.ts.map +1 -0
- package/dist/cli/rate-limiter.js +78 -0
- package/dist/cli/rate-limiter.js.map +1 -0
- package/dist/cli/setup.d.ts +2 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +292 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli/ui.d.ts +30 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +202 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/client/ddp.d.ts +31 -0
- package/dist/client/ddp.d.ts.map +1 -0
- package/dist/client/ddp.js +86 -0
- package/dist/client/ddp.js.map +1 -0
- package/dist/client/rest.d.ts +49 -0
- package/dist/client/rest.d.ts.map +1 -0
- package/dist/client/rest.js +347 -0
- package/dist/client/rest.js.map +1 -0
- package/dist/config/access-store.d.ts +29 -0
- package/dist/config/access-store.d.ts.map +1 -0
- package/dist/config/access-store.js +71 -0
- package/dist/config/access-store.js.map +1 -0
- package/dist/config/schema.d.ts +33 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +52 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/store.d.ts +11 -0
- package/dist/config/store.d.ts.map +1 -0
- package/dist/config/store.js +82 -0
- package/dist/config/store.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +5 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +164 -0
- package/dist/plugin.js.map +1 -0
- package/dist/service/attachments.d.ts +10 -0
- package/dist/service/attachments.d.ts.map +1 -0
- package/dist/service/attachments.js +105 -0
- package/dist/service/attachments.js.map +1 -0
- package/dist/service/channel.d.ts +25 -0
- package/dist/service/channel.d.ts.map +1 -0
- package/dist/service/channel.js +747 -0
- package/dist/service/channel.js.map +1 -0
- package/dist/service/gateway.d.ts +7 -0
- package/dist/service/gateway.d.ts.map +1 -0
- package/dist/service/gateway.js +621 -0
- package/dist/service/gateway.js.map +1 -0
- package/dist/service/group-history.d.ts +8 -0
- package/dist/service/group-history.d.ts.map +1 -0
- package/dist/service/group-history.js +24 -0
- package/dist/service/group-history.js.map +1 -0
- package/dist/service/inbound.d.ts +16 -0
- package/dist/service/inbound.d.ts.map +1 -0
- package/dist/service/inbound.js +189 -0
- package/dist/service/inbound.js.map +1 -0
- package/dist/service/runtime-state.d.ts +8 -0
- package/dist/service/runtime-state.d.ts.map +1 -0
- package/dist/service/runtime-state.js +3 -0
- package/dist/service/runtime-state.js.map +1 -0
- package/dist/types.d.ts +220 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +15 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +68 -0
- package/dist/utils.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
import { mkdir, writeFile, readFile } from "node:fs/promises";
|
|
2
|
+
import { join, basename } from "node:path";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
import { extractQuotedMessageId, resolveOpenClawDir, resolveUrl, getExt, getErrorMessage, stripBotMentions, } from "../utils.js";
|
|
5
|
+
import { isPrivateOrLoopbackHost } from "openclaw/plugin-sdk/ssrf-runtime";
|
|
6
|
+
const MAX_DOWNLOAD_BYTES = 20 * 1024 * 1024;
|
|
7
|
+
const ALLOWED_DOWNLOAD_MIME_PREFIXES = ["image/", "audio/", "video/", "application/"];
|
|
8
|
+
export class RocketChatClientError extends Error {
|
|
9
|
+
constructor(message) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.name = "RocketChatClientError";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export class RocketChatRateLimitError extends RocketChatClientError {
|
|
15
|
+
retryAfterMs;
|
|
16
|
+
constructor(message, options) {
|
|
17
|
+
super(message);
|
|
18
|
+
this.name = "RocketChatRateLimitError";
|
|
19
|
+
this.retryAfterMs = options.retryAfterMs;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export class RocketChatClient {
|
|
23
|
+
serverUrl;
|
|
24
|
+
auth;
|
|
25
|
+
fetchFn;
|
|
26
|
+
mediaDir;
|
|
27
|
+
identity = null;
|
|
28
|
+
resolvedUserId = null;
|
|
29
|
+
resolvedAuthToken = null;
|
|
30
|
+
botUsernames = new Set();
|
|
31
|
+
constructor(options) {
|
|
32
|
+
this.serverUrl = options.serverUrl.replace(/\/+$/, "");
|
|
33
|
+
this.auth = options.auth;
|
|
34
|
+
this.fetchFn = options.fetch ?? globalThis.fetch;
|
|
35
|
+
this.mediaDir = join(resolveOpenClawDir(), "media");
|
|
36
|
+
if (this.auth.mode === "token") {
|
|
37
|
+
this.resolvedUserId = this.auth.userId;
|
|
38
|
+
this.resolvedAuthToken = this.auth.accessToken;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
setBotUsernames(names) {
|
|
42
|
+
this.botUsernames = names;
|
|
43
|
+
}
|
|
44
|
+
async initialize() {
|
|
45
|
+
if (this.resolvedUserId && this.resolvedAuthToken)
|
|
46
|
+
return;
|
|
47
|
+
if (this.auth.mode !== "password") {
|
|
48
|
+
throw new RocketChatClientError("cannot initialize: no credentials available");
|
|
49
|
+
}
|
|
50
|
+
const response = await this.fetchFn(new URL("/api/v1/login", this.serverUrl), {
|
|
51
|
+
method: "POST",
|
|
52
|
+
headers: { "Content-Type": "application/json", Accept: "application/json" },
|
|
53
|
+
body: JSON.stringify({ user: this.auth.username, password: this.auth.password }),
|
|
54
|
+
});
|
|
55
|
+
if (!response.ok) {
|
|
56
|
+
throw new RocketChatClientError(`login failed: ${response.statusText}`);
|
|
57
|
+
}
|
|
58
|
+
const payload = (await response.json());
|
|
59
|
+
const data = asObject(payload.data);
|
|
60
|
+
this.resolvedUserId = getString(data, "userId");
|
|
61
|
+
this.resolvedAuthToken = getString(data, "authToken");
|
|
62
|
+
}
|
|
63
|
+
async getIdentity() {
|
|
64
|
+
if (this.identity)
|
|
65
|
+
return this.identity;
|
|
66
|
+
await this.ensureInitialized();
|
|
67
|
+
const payload = await this.requestJson(new URL("/api/v1/me", this.serverUrl), {
|
|
68
|
+
method: "GET",
|
|
69
|
+
});
|
|
70
|
+
const user = asObject(payload.user ?? payload.me ?? payload);
|
|
71
|
+
this.identity = {
|
|
72
|
+
userId: this.resolvedUserId,
|
|
73
|
+
authToken: this.resolvedAuthToken,
|
|
74
|
+
username: getString(user, "username"),
|
|
75
|
+
displayName: getOptionalString(user, "name") ?? getString(user, "username"),
|
|
76
|
+
};
|
|
77
|
+
return this.identity;
|
|
78
|
+
}
|
|
79
|
+
async listSubscriptions(updatedSince) {
|
|
80
|
+
const url = new URL("/api/v1/subscriptions.get", this.serverUrl);
|
|
81
|
+
if (updatedSince)
|
|
82
|
+
url.searchParams.set("updatedSince", updatedSince);
|
|
83
|
+
const payload = await this.requestJson(url, { method: "GET" });
|
|
84
|
+
return Array.isArray(payload.update) ? payload.update : [];
|
|
85
|
+
}
|
|
86
|
+
async postMessage(roomId, text, options) {
|
|
87
|
+
const sanitized = this.botUsernames.size > 0 ? stripBotMentions(text, this.botUsernames) : text;
|
|
88
|
+
try {
|
|
89
|
+
return await this.postMessageRaw(roomId, sanitized, options);
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
if (err instanceof RocketChatClientError && err.message.includes("/message/md")) {
|
|
93
|
+
return await this.postMessageRaw(roomId, stripMarkdown(sanitized), options);
|
|
94
|
+
}
|
|
95
|
+
throw err;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async postMessageRaw(roomId, text, options) {
|
|
99
|
+
const body = { roomId, text };
|
|
100
|
+
if (options?.tmid)
|
|
101
|
+
body.tmid = options.tmid;
|
|
102
|
+
const payload = await this.requestJson(new URL("/api/v1/chat.postMessage", this.serverUrl), {
|
|
103
|
+
method: "POST",
|
|
104
|
+
body: JSON.stringify(body),
|
|
105
|
+
});
|
|
106
|
+
const message = asObject(payload.message);
|
|
107
|
+
return getString(message, "_id");
|
|
108
|
+
}
|
|
109
|
+
async reactToMessage(messageId, reaction) {
|
|
110
|
+
await this.requestJson(new URL("/api/v1/chat.react", this.serverUrl), {
|
|
111
|
+
method: "POST",
|
|
112
|
+
body: JSON.stringify({ messageId, reaction }),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
async getMessage(messageId) {
|
|
116
|
+
const payload = await this.requestJson(new URL(`/api/v1/chat.getMessage?msgId=${encodeURIComponent(messageId)}`, this.serverUrl), { method: "GET" });
|
|
117
|
+
const message = asObject(payload.message);
|
|
118
|
+
const text = typeof message.msg === "string" && message.msg.length > 0 ? message.msg : null;
|
|
119
|
+
const link = (Array.isArray(message.attachments) ? message.attachments : [])
|
|
120
|
+
.map((att) => att.message_link)
|
|
121
|
+
.find((l) => typeof l === "string" && l.length > 0);
|
|
122
|
+
const quotedId = link ? (extractQuotedMessageId(link) ?? null) : null;
|
|
123
|
+
return { text, quotedId };
|
|
124
|
+
}
|
|
125
|
+
/** Resolve a room's type (`d`/`p`/`c`) on demand, used for rooms created after connect. */
|
|
126
|
+
async getRoomType(roomId) {
|
|
127
|
+
const payload = await this.requestJson(new URL(`/api/v1/rooms.info?roomId=${encodeURIComponent(roomId)}`, this.serverUrl), { method: "GET" });
|
|
128
|
+
const room = asObject(payload.room);
|
|
129
|
+
const t = room.t;
|
|
130
|
+
return typeof t === "string" && t.length > 0 ? t : undefined;
|
|
131
|
+
}
|
|
132
|
+
async downloadAttachmentToTempFile(url, options) {
|
|
133
|
+
await this.ensureInitialized();
|
|
134
|
+
const requestUrl = resolveUrl(url, this.serverUrl);
|
|
135
|
+
if (!isSafeExternalUrl(requestUrl, this.serverUrl)) {
|
|
136
|
+
throw new RocketChatClientError(`attachment download blocked: ${requestUrl} resolves to a private/internal address`);
|
|
137
|
+
}
|
|
138
|
+
const response = await this.fetchFn(requestUrl, {
|
|
139
|
+
method: "GET",
|
|
140
|
+
headers: {
|
|
141
|
+
Accept: "*/*",
|
|
142
|
+
"X-User-Id": this.resolvedUserId,
|
|
143
|
+
"X-Auth-Token": this.resolvedAuthToken,
|
|
144
|
+
},
|
|
145
|
+
});
|
|
146
|
+
if (!response.ok) {
|
|
147
|
+
throw new RocketChatClientError(`attachment download failed: ${response.statusText}`);
|
|
148
|
+
}
|
|
149
|
+
const contentTypeHeader = response.headers.get("Content-Type");
|
|
150
|
+
const rawContentType = (contentTypeHeader ?? "").split(";")[0]?.trim().toLowerCase() ?? "";
|
|
151
|
+
if (!rawContentType ||
|
|
152
|
+
!ALLOWED_DOWNLOAD_MIME_PREFIXES.some((p) => rawContentType.startsWith(p))) {
|
|
153
|
+
throw new RocketChatClientError(`attachment download refused: unsupported content type "${contentTypeHeader ?? ""}"`);
|
|
154
|
+
}
|
|
155
|
+
const contentLength = response.headers.get("Content-Length");
|
|
156
|
+
if (contentLength) {
|
|
157
|
+
const bytes = Number.parseInt(contentLength, 10);
|
|
158
|
+
if (!Number.isNaN(bytes) && bytes > MAX_DOWNLOAD_BYTES) {
|
|
159
|
+
throw new RocketChatClientError(`attachment download refused: Content-Length ${bytes} exceeds max ${MAX_DOWNLOAD_BYTES}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
const inboundDir = join(this.mediaDir, "inbound");
|
|
163
|
+
await mkdir(inboundDir, { recursive: true });
|
|
164
|
+
const ext = getExt(options?.fileName ?? url ?? "attachment");
|
|
165
|
+
const safeName = (options?.fileName ?? "attachment").replace(/[^a-zA-Z0-9._-]/g, "_");
|
|
166
|
+
const filePath = join(inboundDir, `${safeName}---${randomUUID().slice(0, 12)}${ext ? `.${ext}` : ""}`);
|
|
167
|
+
const bytes = Buffer.from(await response.arrayBuffer());
|
|
168
|
+
if (bytes.length > MAX_DOWNLOAD_BYTES) {
|
|
169
|
+
throw new RocketChatClientError(`attachment download refused: actual size ${bytes.length} exceeds max ${MAX_DOWNLOAD_BYTES}`);
|
|
170
|
+
}
|
|
171
|
+
await writeFile(filePath, bytes);
|
|
172
|
+
return filePath;
|
|
173
|
+
}
|
|
174
|
+
async uploadAttachment(roomId, filePath, text, options) {
|
|
175
|
+
const fileBytes = await readFile(filePath);
|
|
176
|
+
return this.uploadAttachmentFromBuffer(roomId, fileBytes, basename(filePath), text, options);
|
|
177
|
+
}
|
|
178
|
+
async uploadAttachmentFromBuffer(roomId, buffer, fileName, text, options) {
|
|
179
|
+
await this.ensureInitialized();
|
|
180
|
+
const formData = new FormData();
|
|
181
|
+
if (text?.trim())
|
|
182
|
+
formData.append("msg", text.trim());
|
|
183
|
+
if (options?.tmid)
|
|
184
|
+
formData.append("tmid", options.tmid);
|
|
185
|
+
formData.append("file", new Blob([buffer]), fileName);
|
|
186
|
+
const uploadResponse = await this.fetchFn(new URL(`/api/v1/rooms.media/${encodeURIComponent(roomId)}`, this.serverUrl).toString(), {
|
|
187
|
+
method: "POST",
|
|
188
|
+
headers: {
|
|
189
|
+
"X-User-Id": this.resolvedUserId,
|
|
190
|
+
"X-Auth-Token": this.resolvedAuthToken,
|
|
191
|
+
},
|
|
192
|
+
body: formData,
|
|
193
|
+
});
|
|
194
|
+
if (!uploadResponse.ok) {
|
|
195
|
+
throw new RocketChatClientError(`attachment upload failed: ${uploadResponse.statusText}`);
|
|
196
|
+
}
|
|
197
|
+
const uploadPayload = await this.parseJsonResponse(uploadResponse);
|
|
198
|
+
const file = asObject(uploadPayload.file ?? {});
|
|
199
|
+
const fileId = getString(file, "_id");
|
|
200
|
+
const confirmResponse = await this.fetchFn(new URL(`/api/v1/rooms.mediaConfirm/${encodeURIComponent(roomId)}/${encodeURIComponent(fileId)}`, this.serverUrl).toString(), {
|
|
201
|
+
method: "POST",
|
|
202
|
+
headers: {
|
|
203
|
+
"X-User-Id": this.resolvedUserId,
|
|
204
|
+
"X-Auth-Token": this.resolvedAuthToken,
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
if (!confirmResponse.ok) {
|
|
208
|
+
throw new RocketChatClientError(`attachment confirm failed: ${confirmResponse.statusText}`);
|
|
209
|
+
}
|
|
210
|
+
const confirmPayload = await this.parseJsonResponse(confirmResponse);
|
|
211
|
+
const message = asObject(confirmPayload.message ?? {});
|
|
212
|
+
return getString(message, "_id");
|
|
213
|
+
}
|
|
214
|
+
async ensureInitialized() {
|
|
215
|
+
if (!this.resolvedUserId || !this.resolvedAuthToken) {
|
|
216
|
+
await this.initialize();
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
async requestJson(url, init) {
|
|
220
|
+
const maxRetries = 3;
|
|
221
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
222
|
+
await this.ensureInitialized();
|
|
223
|
+
const signal = init.signal ?? AbortSignal.timeout(15_000);
|
|
224
|
+
const response = await this.fetchFn(url.toString(), {
|
|
225
|
+
...init,
|
|
226
|
+
signal,
|
|
227
|
+
headers: {
|
|
228
|
+
"Content-Type": "application/json",
|
|
229
|
+
Accept: "application/json",
|
|
230
|
+
"X-User-Id": this.resolvedUserId,
|
|
231
|
+
"X-Auth-Token": this.resolvedAuthToken,
|
|
232
|
+
...(init.headers ?? {}),
|
|
233
|
+
},
|
|
234
|
+
});
|
|
235
|
+
try {
|
|
236
|
+
return await this.parseJsonResponse(response);
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
if (err instanceof RocketChatRateLimitError && attempt < maxRetries) {
|
|
240
|
+
await new Promise((resolve) => setTimeout(resolve, err.retryAfterMs));
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
throw err;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
throw new RocketChatClientError("Rate limit retries exhausted");
|
|
247
|
+
}
|
|
248
|
+
async parseJsonResponse(response) {
|
|
249
|
+
let payload;
|
|
250
|
+
try {
|
|
251
|
+
const parsed = await response.json();
|
|
252
|
+
payload = asObject(parsed);
|
|
253
|
+
}
|
|
254
|
+
catch (err) {
|
|
255
|
+
if (err instanceof RocketChatClientError)
|
|
256
|
+
throw err;
|
|
257
|
+
throw new RocketChatClientError(`Rocket.Chat API returned non-JSON response (status ${response.status}): ${err instanceof Error ? err.message : String(err)}`);
|
|
258
|
+
}
|
|
259
|
+
if (response.status === 429 || payload.errorType === "error-too-many-requests") {
|
|
260
|
+
throw new RocketChatRateLimitError(getErrorMessage(payload, "Rocket.Chat API rate limited"), {
|
|
261
|
+
retryAfterMs: getRetryAfterMs(response, payload),
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
if (!response.ok) {
|
|
265
|
+
throw new RocketChatClientError(getErrorMessage(payload, response.statusText));
|
|
266
|
+
}
|
|
267
|
+
if (payload.success === false || payload.status === "error") {
|
|
268
|
+
throw new RocketChatClientError(getErrorMessage(payload, "Rocket.Chat API request failed"));
|
|
269
|
+
}
|
|
270
|
+
return payload;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
function isSafeExternalUrl(url, serverUrl) {
|
|
274
|
+
try {
|
|
275
|
+
const parsed = new URL(url);
|
|
276
|
+
const trusted = new URL(serverUrl);
|
|
277
|
+
if (parsed.origin === trusted.origin)
|
|
278
|
+
return true;
|
|
279
|
+
return !isPrivateHostname(parsed.hostname);
|
|
280
|
+
}
|
|
281
|
+
catch {
|
|
282
|
+
return false;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
function isPrivateHostname(hostname) {
|
|
286
|
+
const lower = hostname.toLowerCase();
|
|
287
|
+
if (lower === "localhost" || lower.endsWith(".local") || lower.endsWith(".internal"))
|
|
288
|
+
return true;
|
|
289
|
+
return isPrivateOrLoopbackHost(lower);
|
|
290
|
+
}
|
|
291
|
+
function asObject(value) {
|
|
292
|
+
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
293
|
+
return value;
|
|
294
|
+
}
|
|
295
|
+
throw new RocketChatClientError("Rocket.Chat API returned an invalid payload");
|
|
296
|
+
}
|
|
297
|
+
function getString(object, key) {
|
|
298
|
+
const value = object[key];
|
|
299
|
+
if (typeof value === "string" && value.length > 0) {
|
|
300
|
+
return value;
|
|
301
|
+
}
|
|
302
|
+
throw new RocketChatClientError(`Rocket.Chat API payload missing "${key}"`);
|
|
303
|
+
}
|
|
304
|
+
function getOptionalString(object, key) {
|
|
305
|
+
const value = object[key];
|
|
306
|
+
return typeof value === "string" && value.length > 0 ? value : null;
|
|
307
|
+
}
|
|
308
|
+
function getRetryAfterMs(response, payload) {
|
|
309
|
+
const retryAfterHeader = response.headers.get("Retry-After");
|
|
310
|
+
if (retryAfterHeader) {
|
|
311
|
+
const retryAfterSeconds = Number.parseInt(retryAfterHeader, 10);
|
|
312
|
+
if (Number.isInteger(retryAfterSeconds) && retryAfterSeconds > 0) {
|
|
313
|
+
return retryAfterSeconds * 1000;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
const message = getErrorMessage(payload, "");
|
|
317
|
+
const match = message.match(/wait\s+(\d+)\s+seconds/i);
|
|
318
|
+
if (match) {
|
|
319
|
+
const retryAfterSeconds = Number.parseInt(match[1], 10);
|
|
320
|
+
if (Number.isInteger(retryAfterSeconds) && retryAfterSeconds > 0) {
|
|
321
|
+
return retryAfterSeconds * 1000;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return 30_000;
|
|
325
|
+
}
|
|
326
|
+
function stripMarkdown(text) {
|
|
327
|
+
const separatorRe = /^[-:]+$/;
|
|
328
|
+
return text
|
|
329
|
+
.replace(/^#{1,6}\s+/gm, "")
|
|
330
|
+
.replace(/^>\s+/gm, "")
|
|
331
|
+
.replace(/^[-*+]\s+/gm, "• ")
|
|
332
|
+
.replace(/^\d+\.\s+/gm, "• ")
|
|
333
|
+
.replace(/```[\s\S]*?```/g, (m) => m.replace(/```/g, "").trim())
|
|
334
|
+
.replace(/`([^`]+)`/g, "$1")
|
|
335
|
+
.replace(/\*\*([^*]+)\*\*/g, "$1")
|
|
336
|
+
.replace(/\*([^*]+)\*/g, "$1")
|
|
337
|
+
.replace(/__([^_]+)__/g, "$1")
|
|
338
|
+
.replace(/~~([^~]+)~~/g, "$1")
|
|
339
|
+
.replace(/^\|(.+)\|$/gm, (_m, inner) => inner
|
|
340
|
+
.split("|")
|
|
341
|
+
.map((c) => c.trim())
|
|
342
|
+
.filter((c) => c.length > 0 && !separatorRe.test(c))
|
|
343
|
+
.join(" | "))
|
|
344
|
+
.replace(/^---+$/gm, "")
|
|
345
|
+
.trim();
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=rest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rest.js","sourceRoot":"","sources":["../../src/client/rest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type AccessGrant = {
|
|
2
|
+
accountId: string;
|
|
3
|
+
roomId: string;
|
|
4
|
+
roomName?: string;
|
|
5
|
+
username: string;
|
|
6
|
+
grantedBy?: string;
|
|
7
|
+
grantedAt: number;
|
|
8
|
+
};
|
|
9
|
+
export declare function getAccessDbPath(): string;
|
|
10
|
+
export declare class AccessStore {
|
|
11
|
+
private db;
|
|
12
|
+
constructor(filePath?: string);
|
|
13
|
+
loadGrants(accountId: string): AccessGrant[];
|
|
14
|
+
addGrant(grant: {
|
|
15
|
+
accountId: string;
|
|
16
|
+
roomId: string;
|
|
17
|
+
roomName?: string;
|
|
18
|
+
username: string;
|
|
19
|
+
grantedBy?: string;
|
|
20
|
+
}): boolean;
|
|
21
|
+
removeGrant(params: {
|
|
22
|
+
accountId: string;
|
|
23
|
+
roomId: string;
|
|
24
|
+
username: string;
|
|
25
|
+
revokedBy?: string;
|
|
26
|
+
}): boolean;
|
|
27
|
+
close(): void;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=access-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access-store.d.ts","sourceRoot":"","sources":["../../src/config/access-store.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAIF,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,EAAE,CAAe;gBAEb,QAAQ,GAAE,MAA0B;IAuBhD,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,EAAE;IAS5C,QAAQ,CAAC,KAAK,EAAE;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO;IAsBX,WAAW,CAAC,MAAM,EAAE;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO;IAOX,KAAK,IAAI,IAAI;CAId"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { mkdirSync } from "node:fs";
|
|
2
|
+
import { dirname, resolve } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { DatabaseSync } from "node:sqlite";
|
|
5
|
+
const SCHEMA_VERSION = "1";
|
|
6
|
+
export function getAccessDbPath() {
|
|
7
|
+
return resolve(homedir(), ".openclaw", "rocketchat", "access.db");
|
|
8
|
+
}
|
|
9
|
+
export class AccessStore {
|
|
10
|
+
db;
|
|
11
|
+
constructor(filePath = getAccessDbPath()) {
|
|
12
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
13
|
+
this.db = new DatabaseSync(filePath);
|
|
14
|
+
this.db.exec(`
|
|
15
|
+
CREATE TABLE IF NOT EXISTS meta (
|
|
16
|
+
key TEXT PRIMARY KEY,
|
|
17
|
+
value TEXT
|
|
18
|
+
);
|
|
19
|
+
CREATE TABLE IF NOT EXISTS grants (
|
|
20
|
+
account_id TEXT NOT NULL,
|
|
21
|
+
room_id TEXT NOT NULL,
|
|
22
|
+
room_name TEXT,
|
|
23
|
+
username TEXT NOT NULL,
|
|
24
|
+
granted_by TEXT,
|
|
25
|
+
granted_at INTEGER NOT NULL,
|
|
26
|
+
PRIMARY KEY (account_id, room_id, username)
|
|
27
|
+
);
|
|
28
|
+
`);
|
|
29
|
+
this.db
|
|
30
|
+
.prepare("INSERT OR IGNORE INTO meta (key, value) VALUES ('schema_version', ?)")
|
|
31
|
+
.run(SCHEMA_VERSION);
|
|
32
|
+
}
|
|
33
|
+
loadGrants(accountId) {
|
|
34
|
+
const rows = this.db
|
|
35
|
+
.prepare("SELECT account_id, room_id, room_name, username, granted_by, granted_at FROM grants WHERE account_id = ?")
|
|
36
|
+
.all(accountId);
|
|
37
|
+
return rows.map(toGrant);
|
|
38
|
+
}
|
|
39
|
+
addGrant(grant) {
|
|
40
|
+
const existing = this.db
|
|
41
|
+
.prepare("SELECT 1 FROM grants WHERE account_id = ? AND room_id = ? AND username = ?")
|
|
42
|
+
.get(grant.accountId, grant.roomId, grant.username);
|
|
43
|
+
if (existing)
|
|
44
|
+
return false;
|
|
45
|
+
const now = Date.now();
|
|
46
|
+
this.db
|
|
47
|
+
.prepare("INSERT INTO grants (account_id, room_id, room_name, username, granted_by, granted_at) VALUES (?, ?, ?, ?, ?, ?)")
|
|
48
|
+
.run(grant.accountId, grant.roomId, grant.roomName ?? null, grant.username, grant.grantedBy ?? null, now);
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
removeGrant(params) {
|
|
52
|
+
const removed = this.db
|
|
53
|
+
.prepare("DELETE FROM grants WHERE account_id = ? AND room_id = ? AND username = ?")
|
|
54
|
+
.run(params.accountId, params.roomId, params.username).changes;
|
|
55
|
+
return removed !== 0;
|
|
56
|
+
}
|
|
57
|
+
close() {
|
|
58
|
+
this.db.close();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function toGrant(row) {
|
|
62
|
+
return {
|
|
63
|
+
accountId: String(row.account_id ?? ""),
|
|
64
|
+
roomId: String(row.room_id ?? ""),
|
|
65
|
+
...(row.room_name ? { roomName: String(row.room_name) } : {}),
|
|
66
|
+
username: String(row.username ?? ""),
|
|
67
|
+
...(row.granted_by ? { grantedBy: String(row.granted_by) } : {}),
|
|
68
|
+
grantedAt: Number(row.granted_at ?? 0),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=access-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access-store.js","sourceRoot":"","sources":["../../src/config/access-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const pluginConfigSchema: z.ZodObject<{
|
|
3
|
+
accounts: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
4
|
+
enabled: z.ZodBoolean;
|
|
5
|
+
serverUrl: z.ZodString;
|
|
6
|
+
auth: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
7
|
+
mode: z.ZodLiteral<"token">;
|
|
8
|
+
userId: z.ZodString;
|
|
9
|
+
accessToken: z.ZodString;
|
|
10
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
11
|
+
mode: z.ZodLiteral<"password">;
|
|
12
|
+
username: z.ZodString;
|
|
13
|
+
password: z.ZodString;
|
|
14
|
+
}, z.core.$strict>], "mode">;
|
|
15
|
+
transport: z.ZodPreprocess<z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
16
|
+
mode: z.ZodLiteral<"websocket">;
|
|
17
|
+
reconnectDelayMs: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
18
|
+
}, z.core.$strict>], "mode">>;
|
|
19
|
+
mentionNames: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
20
|
+
agent: z.ZodOptional<z.ZodString>;
|
|
21
|
+
owner: z.ZodOptional<z.ZodString>;
|
|
22
|
+
}, z.core.$strict>>;
|
|
23
|
+
limits: z.ZodOptional<z.ZodObject<{
|
|
24
|
+
maxAccounts: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
25
|
+
maxBotsPerServer: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
26
|
+
botCreationCooldownMs: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
27
|
+
maxReconnects: z.ZodOptional<z.ZodDefault<z.ZodNumber>>;
|
|
28
|
+
}, z.core.$strict>>;
|
|
29
|
+
}, z.core.$strict>;
|
|
30
|
+
export type PluginConfig = z.infer<typeof pluginConfigSchema>;
|
|
31
|
+
export type PluginAccountConfig = PluginConfig["accounts"][string];
|
|
32
|
+
export declare function parsePluginConfig(input: unknown): PluginConfig;
|
|
33
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA0CxB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAapB,CAAC;AAEZ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,mBAAmB,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAE9D"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const tokenAuthSchema = z
|
|
3
|
+
.object({
|
|
4
|
+
mode: z.literal("token"),
|
|
5
|
+
userId: z.string().min(1),
|
|
6
|
+
accessToken: z.string().min(1),
|
|
7
|
+
})
|
|
8
|
+
.strict();
|
|
9
|
+
const passwordAuthSchema = z
|
|
10
|
+
.object({
|
|
11
|
+
mode: z.literal("password"),
|
|
12
|
+
username: z.string().min(1),
|
|
13
|
+
password: z.string().min(1),
|
|
14
|
+
})
|
|
15
|
+
.strict();
|
|
16
|
+
const transportSchema = z.preprocess((value) => value ?? { mode: "websocket" }, z.discriminatedUnion("mode", [
|
|
17
|
+
z
|
|
18
|
+
.object({
|
|
19
|
+
mode: z.literal("websocket"),
|
|
20
|
+
reconnectDelayMs: z.number().int().positive().default(2_000).optional(),
|
|
21
|
+
})
|
|
22
|
+
.strict(),
|
|
23
|
+
]));
|
|
24
|
+
const accountSchema = z
|
|
25
|
+
.object({
|
|
26
|
+
enabled: z.boolean(),
|
|
27
|
+
serverUrl: z.string().min(1),
|
|
28
|
+
auth: z.discriminatedUnion("mode", [tokenAuthSchema, passwordAuthSchema]),
|
|
29
|
+
transport: transportSchema,
|
|
30
|
+
mentionNames: z.array(z.string().min(1)).default([]),
|
|
31
|
+
agent: z.string().min(1).optional(),
|
|
32
|
+
owner: z.string().min(1).optional(),
|
|
33
|
+
})
|
|
34
|
+
.strict();
|
|
35
|
+
export const pluginConfigSchema = z
|
|
36
|
+
.object({
|
|
37
|
+
accounts: z.record(z.string().min(1), accountSchema),
|
|
38
|
+
limits: z
|
|
39
|
+
.object({
|
|
40
|
+
maxAccounts: z.number().int().positive().default(10).optional(),
|
|
41
|
+
maxBotsPerServer: z.number().int().positive().default(5).optional(),
|
|
42
|
+
botCreationCooldownMs: z.number().int().positive().default(60_000).optional(),
|
|
43
|
+
maxReconnects: z.number().int().positive().default(20).optional(),
|
|
44
|
+
})
|
|
45
|
+
.strict()
|
|
46
|
+
.optional(),
|
|
47
|
+
})
|
|
48
|
+
.strict();
|
|
49
|
+
export function parsePluginConfig(input) {
|
|
50
|
+
return pluginConfigSchema.parse(input);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CheckpointState, FailedMessageRecord } from "../types.js";
|
|
2
|
+
export declare class CheckpointStore {
|
|
3
|
+
private readonly limit;
|
|
4
|
+
private readonly failureLimit;
|
|
5
|
+
private db;
|
|
6
|
+
constructor(filePath: string, limit?: number, failureLimit?: number);
|
|
7
|
+
read(): Promise<CheckpointState>;
|
|
8
|
+
write(state: CheckpointState): Promise<void>;
|
|
9
|
+
recordFailure(failure: FailedMessageRecord): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/config/store.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAExE,qBAAa,eAAe;IAKxB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAL/B,OAAO,CAAC,EAAE,CAAe;gBAGvB,QAAQ,EAAE,MAAM,EACC,KAAK,SAAM,EACX,YAAY,SAAM;IAwB/B,IAAI,IAAI,OAAO,CAAC,eAAe,CAAC;IAmBhC,KAAK,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B5C,aAAa,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;CAmBjE"}
|