@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,82 @@
|
|
|
1
|
+
import { mkdirSync } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { DatabaseSync } from "node:sqlite";
|
|
4
|
+
export class CheckpointStore {
|
|
5
|
+
limit;
|
|
6
|
+
failureLimit;
|
|
7
|
+
db;
|
|
8
|
+
constructor(filePath, limit = 250, failureLimit = 100) {
|
|
9
|
+
this.limit = limit;
|
|
10
|
+
this.failureLimit = failureLimit;
|
|
11
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
12
|
+
this.db = new DatabaseSync(filePath);
|
|
13
|
+
this.db.exec(`
|
|
14
|
+
CREATE TABLE IF NOT EXISTS meta (
|
|
15
|
+
key TEXT PRIMARY KEY,
|
|
16
|
+
value TEXT
|
|
17
|
+
);
|
|
18
|
+
CREATE TABLE IF NOT EXISTS seen_messages (
|
|
19
|
+
id TEXT PRIMARY KEY,
|
|
20
|
+
seen_at INTEGER NOT NULL DEFAULT (unixepoch())
|
|
21
|
+
);
|
|
22
|
+
CREATE TABLE IF NOT EXISTS failed_messages (
|
|
23
|
+
message_id TEXT PRIMARY KEY,
|
|
24
|
+
room_id TEXT,
|
|
25
|
+
sender_name TEXT,
|
|
26
|
+
sent_at TEXT,
|
|
27
|
+
failed_at TEXT,
|
|
28
|
+
reason TEXT
|
|
29
|
+
);
|
|
30
|
+
`);
|
|
31
|
+
}
|
|
32
|
+
async read() {
|
|
33
|
+
const updatedRow = this.db
|
|
34
|
+
.prepare("SELECT value FROM meta WHERE key = 'updatedSince'")
|
|
35
|
+
.get();
|
|
36
|
+
const seenRows = this.db
|
|
37
|
+
.prepare("SELECT id FROM seen_messages ORDER BY seen_at DESC LIMIT ?")
|
|
38
|
+
.all(this.limit);
|
|
39
|
+
const failedRows = this.db
|
|
40
|
+
.prepare("SELECT message_id as messageId, room_id as roomId, sender_name as senderName, sent_at as sentAt, failed_at as failedAt, reason FROM failed_messages LIMIT ?")
|
|
41
|
+
.all(this.failureLimit);
|
|
42
|
+
return {
|
|
43
|
+
updatedSince: updatedRow?.value ?? null,
|
|
44
|
+
recentMessageIds: seenRows.map((r) => r.id),
|
|
45
|
+
failedMessages: failedRows,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
async write(state) {
|
|
49
|
+
this.db.exec("BEGIN");
|
|
50
|
+
try {
|
|
51
|
+
if (state.updatedSince) {
|
|
52
|
+
this.db
|
|
53
|
+
.prepare("INSERT OR REPLACE INTO meta (key, value) VALUES ('updatedSince', ?)")
|
|
54
|
+
.run(state.updatedSince);
|
|
55
|
+
}
|
|
56
|
+
this.db.prepare("DELETE FROM seen_messages").run();
|
|
57
|
+
const insertSeen = this.db.prepare("INSERT OR IGNORE INTO seen_messages (id) VALUES (?)");
|
|
58
|
+
for (const id of state.recentMessageIds.slice(-this.limit)) {
|
|
59
|
+
insertSeen.run(id);
|
|
60
|
+
}
|
|
61
|
+
this.db.prepare("DELETE FROM failed_messages").run();
|
|
62
|
+
const insertFailed = this.db.prepare("INSERT OR REPLACE INTO failed_messages (message_id, room_id, sender_name, sent_at, failed_at, reason) VALUES (?, ?, ?, ?, ?, ?)");
|
|
63
|
+
for (const f of (state.failedMessages ?? []).slice(-this.failureLimit)) {
|
|
64
|
+
insertFailed.run(f.messageId, f.roomId, f.senderName, f.sentAt, f.failedAt, f.reason);
|
|
65
|
+
}
|
|
66
|
+
this.db.exec("COMMIT");
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
this.db.exec("ROLLBACK");
|
|
70
|
+
throw err;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async recordFailure(failure) {
|
|
74
|
+
this.db
|
|
75
|
+
.prepare("INSERT OR REPLACE INTO failed_messages (message_id, room_id, sender_name, sent_at, failed_at, reason) VALUES (?, ?, ?, ?, ?, ?)")
|
|
76
|
+
.run(failure.messageId, failure.roomId, failure.senderName, failure.sentAt, failure.failedAt, failure.reason);
|
|
77
|
+
this.db
|
|
78
|
+
.prepare("DELETE FROM failed_messages WHERE message_id NOT IN (SELECT message_id FROM failed_messages ORDER BY rowid DESC LIMIT ?)")
|
|
79
|
+
.run(this.failureLimit);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/config/store.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGlE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAkB7D"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { rocketchatPlugin, startGateway } from "./plugin.js";
|
|
2
|
+
export { startGateway } from "./plugin.js";
|
|
3
|
+
export default function register(api) {
|
|
4
|
+
api.registerChannel({ plugin: rocketchatPlugin });
|
|
5
|
+
api.registerCli(({ program }) => {
|
|
6
|
+
const rc = program.command("rocketchat").description("Rocket.Chat channel plugin commands");
|
|
7
|
+
rc.command("setup")
|
|
8
|
+
.description("Interactive setup wizard - connect Rocket.Chat to OpenClaw")
|
|
9
|
+
.action(async () => {
|
|
10
|
+
const { runSetup } = await import("./cli/setup.js");
|
|
11
|
+
await runSetup();
|
|
12
|
+
});
|
|
13
|
+
}, {
|
|
14
|
+
commands: ["rocketchat"],
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,GAAsB;IACrD,GAAG,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAElD,GAAG,CAAC,WAAW,CACb,CAAC,EAAE,OAAO,EAAoB,EAAE,EAAE;QAChC,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,qCAAqC,CAAC,CAAC;QAE5F,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;aAChB,WAAW,CAAC,4DAA4D,CAAC;aACzE,MAAM,CAAC,KAAK,IAAI,EAAE;YACjB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;YACpD,MAAM,QAAQ,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;IACP,CAAC,EACD;QACE,QAAQ,EAAE,CAAC,YAAY,CAAC;KACzB,CACF,CAAC;AACJ,CAAC"}
|
package/dist/plugin.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { startGateway, resolveAccount, listAccountIds, isConfigured } from "./service/gateway.js";
|
|
2
|
+
import type { ResolvedAccount } from "./types.js";
|
|
3
|
+
export { startGateway, resolveAccount, listAccountIds, isConfigured };
|
|
4
|
+
export declare const rocketchatPlugin: import("openclaw/plugin-sdk/channel-core").ChannelPlugin<ResolvedAccount, unknown, unknown>;
|
|
5
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,YAAY,EACZ,cAAc,EACd,cAAc,EACd,YAAY,EAEb,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC;AAEtE,eAAO,MAAM,gBAAgB,6FA0K3B,CAAC"}
|
package/dist/plugin.js
ADDED
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { createChatChannelPlugin } from "openclaw/plugin-sdk/channel-core";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { basename } from "node:path";
|
|
4
|
+
import { RocketChatClient } from "./client/rest.js";
|
|
5
|
+
import { startGateway, resolveAccount, listAccountIds, isConfigured, activeClients, } from "./service/gateway.js";
|
|
6
|
+
import { collectBotUsernamesForServer } from "./cli/config-updater.js";
|
|
7
|
+
export { startGateway, resolveAccount, listAccountIds, isConfigured };
|
|
8
|
+
export const rocketchatPlugin = createChatChannelPlugin({
|
|
9
|
+
base: {
|
|
10
|
+
id: "rocketchat",
|
|
11
|
+
meta: {
|
|
12
|
+
id: "rocketchat",
|
|
13
|
+
label: "Rocket.Chat",
|
|
14
|
+
selectionLabel: "Rocket.Chat",
|
|
15
|
+
docsPath: "https://rocket.chat/docs",
|
|
16
|
+
blurb: "Rocket.Chat channel plugin with DDP/websocket outbound/inbound",
|
|
17
|
+
aliases: ["rc"],
|
|
18
|
+
},
|
|
19
|
+
capabilities: { chatTypes: ["direct", "group", "channel"] },
|
|
20
|
+
config: {
|
|
21
|
+
listAccountIds: listAccountIds,
|
|
22
|
+
resolveAccount: resolveAccount,
|
|
23
|
+
isConfigured: ((account, _cfg) => isConfigured(account)),
|
|
24
|
+
formatAllowFrom: (params) => {
|
|
25
|
+
return params.allowFrom.map((entry) => {
|
|
26
|
+
const s = String(entry).trim();
|
|
27
|
+
if (!s || s === "*")
|
|
28
|
+
return s;
|
|
29
|
+
if (s.startsWith("rocketchat:"))
|
|
30
|
+
return s;
|
|
31
|
+
return `rocketchat:${s}`;
|
|
32
|
+
});
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
messaging: {
|
|
36
|
+
targetPrefixes: ["rocketchat", "channel", "user", "@"],
|
|
37
|
+
normalizeTarget: (target) => {
|
|
38
|
+
const trimmed = target?.trim();
|
|
39
|
+
if (!trimmed)
|
|
40
|
+
return undefined;
|
|
41
|
+
return trimmed.replace(/^rocketchat:(?:channel:|user:)?/i, "").replace(/^channel:/i, "");
|
|
42
|
+
},
|
|
43
|
+
targetResolver: {
|
|
44
|
+
looksLikeId: (id) => {
|
|
45
|
+
const trimmed = id?.trim();
|
|
46
|
+
if (!trimmed)
|
|
47
|
+
return false;
|
|
48
|
+
return (/^[a-z0-9_]{4,32}$/i.test(trimmed) ||
|
|
49
|
+
/^rocketchat:/i.test(trimmed) ||
|
|
50
|
+
/^channel:/i.test(trimmed) ||
|
|
51
|
+
/^user:/i.test(trimmed) ||
|
|
52
|
+
/^@/.test(trimmed));
|
|
53
|
+
},
|
|
54
|
+
hint: "<roomId|rocketchat:roomId|channel:roomId|user:userId|@username>",
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
gateway: {
|
|
58
|
+
startAccount: (ctx) => startGateway(ctx),
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
threading: {
|
|
62
|
+
topLevelReplyToMode: "reply",
|
|
63
|
+
},
|
|
64
|
+
outbound: {
|
|
65
|
+
base: {
|
|
66
|
+
deliveryMode: "direct",
|
|
67
|
+
resolveTarget: (params) => {
|
|
68
|
+
const to = params?.to?.trim();
|
|
69
|
+
if (!to)
|
|
70
|
+
return { ok: false, error: new Error("Rocket.Chat send requires a target id") };
|
|
71
|
+
const normalized = to
|
|
72
|
+
.replace(/^rocketchat:(?:channel:|user:)?/i, "")
|
|
73
|
+
.replace(/^channel:/i, "");
|
|
74
|
+
return { ok: true, to: normalized };
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
attachedResults: {
|
|
78
|
+
channel: "rocketchat",
|
|
79
|
+
sendText: async (ctx) => {
|
|
80
|
+
const accountId = ctx.accountId ?? undefined;
|
|
81
|
+
let account = resolveAccount(ctx.cfg, accountId);
|
|
82
|
+
if (!account) {
|
|
83
|
+
const accounts = listAccountIds(ctx.cfg);
|
|
84
|
+
if (accounts.length > 0) {
|
|
85
|
+
account = resolveAccount(ctx.cfg, accounts[0]);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (!account)
|
|
89
|
+
throw new Error(`Unknown Rocket.Chat account: ${ctx.accountId}`);
|
|
90
|
+
const entry = activeClients.get(account.accountId);
|
|
91
|
+
let client = entry?.client ?? null;
|
|
92
|
+
if (!client) {
|
|
93
|
+
client = new RocketChatClient({ serverUrl: account.serverUrl, auth: account.auth });
|
|
94
|
+
client.setBotUsernames(collectBotUsernamesForServer(account.serverUrl));
|
|
95
|
+
}
|
|
96
|
+
const tmidOptions = ctx.replyToId ? { tmid: ctx.replyToId } : undefined;
|
|
97
|
+
const messageId = await client.postMessage(ctx.to, ctx.text, tmidOptions);
|
|
98
|
+
return { channel: "rocketchat", ok: true, messageId };
|
|
99
|
+
},
|
|
100
|
+
sendMedia: async (ctx) => {
|
|
101
|
+
const accountId = ctx.accountId ?? undefined;
|
|
102
|
+
let account = resolveAccount(ctx.cfg, accountId);
|
|
103
|
+
if (!account) {
|
|
104
|
+
const accounts = listAccountIds(ctx.cfg);
|
|
105
|
+
if (accounts.length > 0) {
|
|
106
|
+
account = resolveAccount(ctx.cfg, accounts[0]);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (!account)
|
|
110
|
+
throw new Error(`Unknown Rocket.Chat account: ${ctx.accountId}`);
|
|
111
|
+
const entry = activeClients.get(account.accountId);
|
|
112
|
+
let client = entry?.client ?? null;
|
|
113
|
+
if (!client) {
|
|
114
|
+
client = new RocketChatClient({ serverUrl: account.serverUrl, auth: account.auth });
|
|
115
|
+
client.setBotUsernames(collectBotUsernamesForServer(account.serverUrl));
|
|
116
|
+
}
|
|
117
|
+
const tmidOptions = ctx.replyToId ? { tmid: ctx.replyToId } : undefined;
|
|
118
|
+
const urls = ctx.mediaUrl ? [ctx.mediaUrl] : [];
|
|
119
|
+
if (!urls.length) {
|
|
120
|
+
// No media — fall back to text-only delivery.
|
|
121
|
+
const messageId = await client.postMessage(ctx.to, ctx.text ?? "", tmidOptions);
|
|
122
|
+
return { channel: "rocketchat", ok: true, messageId };
|
|
123
|
+
}
|
|
124
|
+
// Send the caption first (if any).
|
|
125
|
+
if (ctx.text?.trim()) {
|
|
126
|
+
await client.postMessage(ctx.to, ctx.text, tmidOptions);
|
|
127
|
+
}
|
|
128
|
+
let delivered = 0;
|
|
129
|
+
for (const url of urls) {
|
|
130
|
+
try {
|
|
131
|
+
let buffer;
|
|
132
|
+
let fileName = "file";
|
|
133
|
+
if (/^https?:\/\//i.test(url)) {
|
|
134
|
+
const resp = await fetch(url, { signal: AbortSignal.timeout(30_000) });
|
|
135
|
+
if (!resp.ok)
|
|
136
|
+
throw new Error(`download failed: ${resp.status}`);
|
|
137
|
+
const arr = new Uint8Array(await resp.arrayBuffer());
|
|
138
|
+
buffer = Buffer.from(arr);
|
|
139
|
+
const pathName = new URL(url).pathname;
|
|
140
|
+
fileName = pathName.split("/").pop() || "file";
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
if (ctx.mediaReadFile) {
|
|
144
|
+
buffer = await ctx.mediaReadFile(url);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
buffer = await readFile(url);
|
|
148
|
+
}
|
|
149
|
+
fileName = basename(url);
|
|
150
|
+
}
|
|
151
|
+
await client.uploadAttachmentFromBuffer(ctx.to, buffer, fileName, undefined, tmidOptions);
|
|
152
|
+
delivered++;
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
// Graceful degradation: post the URL as a text link.
|
|
156
|
+
await client.postMessage(ctx.to, `📎 ${url}`, tmidOptions);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return { channel: "rocketchat", ok: true, messageId: "" };
|
|
160
|
+
},
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAE3E,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,YAAY,EACZ,cAAc,EACd,cAAc,EACd,YAAY,EACZ,aAAa,GACd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AAGvE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC;AAEtE,MAAM,CAAC,MAAM,gBAAgB,GAAG,uBAAuB,CAAkB;IACvE,IAAI,EAAE;QACJ,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE;YACJ,EAAE,EAAE,YAAY;YAChB,KAAK,EAAE,aAAa;YACpB,cAAc,EAAE,aAAa;YAC7B,QAAQ,EAAE,0BAA0B;YACpC,KAAK,EAAE,gEAAgE;YACvE,OAAO,EAAE,CAAC,IAAI,CAAC;SAChB;QACD,YAAY,EAAE,EAAE,SAAS,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE;QAC3D,MAAM,EAAE;YACN,cAAc,EAAE,cAAmD;YACnE,cAAc,EAAE,cAGI;YACpB,YAAY,EAAE,CAAC,CAAC,OAAgB,EAAE,IAAoB,EAAW,EAAE,CACjE,YAAY,CAAC,OAA6C,CAAC,CAGjD;YACZ,eAAe,EAAE,CAAC,MAIjB,EAAY,EAAE;gBACb,OAAO,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;oBACpC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;oBAC/B,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG;wBAAE,OAAO,CAAC,CAAC;oBAC9B,IAAI,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC;wBAAE,OAAO,CAAC,CAAC;oBAC1C,OAAO,cAAc,CAAC,EAAE,CAAC;gBAC3B,CAAC,CAAC,CAAC;YACL,CAAC;SACF;QACD,SAAS,EAAE;YACT,cAAc,EAAE,CAAC,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC;YACtD,eAAe,EAAE,CAAC,MAAc,EAAsB,EAAE;gBACtD,MAAM,OAAO,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC;gBAC/B,IAAI,CAAC,OAAO;oBAAE,OAAO,SAAS,CAAC;gBAC/B,OAAO,OAAO,CAAC,OAAO,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;YAC3F,CAAC;YACD,cAAc,EAAE;gBACd,WAAW,EAAE,CAAC,EAAU,EAAW,EAAE;oBACnC,MAAM,OAAO,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC;oBAC3B,IAAI,CAAC,OAAO;wBAAE,OAAO,KAAK,CAAC;oBAC3B,OAAO,CACL,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC;wBAClC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;wBAC7B,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;wBAC1B,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;wBACvB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CACnB,CAAC;gBACJ,CAAC;gBACD,IAAI,EAAE,iEAAiE;aACxE;SACF;QACD,OAAO,EAAE;YACP,YAAY,EAAE,CAAC,GAAY,EAAE,EAAE,CAAC,YAAY,CAAC,GAAyC,CAAC;SACxF;KACF;IACD,SAAS,EAAE;QACT,mBAAmB,EAAE,OAAO;KAC7B;IACD,QAAQ,EAAE;QACR,IAAI,EAAE;YACJ,YAAY,EAAE,QAAQ;YACtB,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE;gBACxB,MAAM,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;gBAC9B,IAAI,CAAC,EAAE;oBACL,OAAO,EAAE,EAAE,EAAE,KAAc,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,uCAAuC,CAAC,EAAE,CAAC;gBAC3F,MAAM,UAAU,GAAG,EAAE;qBAClB,OAAO,CAAC,kCAAkC,EAAE,EAAE,CAAC;qBAC/C,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;gBAC7B,OAAO,EAAE,EAAE,EAAE,IAAa,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC;YAC/C,CAAC;SACF;QACD,eAAe,EAAE;YACf,OAAO,EAAE,YAAY;YACrB,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBACtB,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,SAAS,CAAC;gBAC7C,IAAI,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,GAA2C,EAAE,SAAS,CAAC,CAAC;gBACzF,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,GAA2C,CAAC,CAAC;oBACjF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACxB,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,GAA2C,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzF,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,OAAO;oBAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;gBAE/E,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACnD,IAAI,MAAM,GAAG,KAAK,EAAE,MAAM,IAAI,IAAI,CAAC;gBACnC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,GAAG,IAAI,gBAAgB,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;oBACpF,MAAM,CAAC,eAAe,CAAC,4BAA4B,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;gBAC1E,CAAC;gBACD,MAAM,WAAW,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;gBACxE,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;gBAC1E,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YACxD,CAAC;YACD,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBACvB,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,SAAS,CAAC;gBAC7C,IAAI,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,GAA2C,EAAE,SAAS,CAAC,CAAC;gBACzF,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,GAA2C,CAAC,CAAC;oBACjF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACxB,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,GAA2C,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;oBACzF,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,OAAO;oBAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;gBAE/E,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACnD,IAAI,MAAM,GAAG,KAAK,EAAE,MAAM,IAAI,IAAI,CAAC;gBACnC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,GAAG,IAAI,gBAAgB,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;oBACpF,MAAM,CAAC,eAAe,CAAC,4BAA4B,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;gBAC1E,CAAC;gBACD,MAAM,WAAW,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;gBAExE,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACjB,8CAA8C;oBAC9C,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,WAAW,CAAC,CAAC;oBAChF,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;gBACxD,CAAC;gBAED,mCAAmC;gBACnC,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;oBACrB,MAAM,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;gBAC1D,CAAC;gBAED,IAAI,SAAS,GAAG,CAAC,CAAC;gBAClB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBACvB,IAAI,CAAC;wBACH,IAAI,MAAc,CAAC;wBACnB,IAAI,QAAQ,GAAG,MAAM,CAAC;wBACtB,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;4BAC9B,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;4BACvE,IAAI,CAAC,IAAI,CAAC,EAAE;gCAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;4BACjE,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;4BACrD,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;4BAC1B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;4BACvC,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,MAAM,CAAC;wBACjD,CAAC;6BAAM,CAAC;4BACN,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;gCACtB,MAAM,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;4BACxC,CAAC;iCAAM,CAAC;gCACN,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;4BAC/B,CAAC;4BACD,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;wBAC3B,CAAC;wBACD,MAAM,MAAM,CAAC,0BAA0B,CACrC,GAAG,CAAC,EAAE,EACN,MAAM,EACN,QAAQ,EACR,SAAS,EACT,WAAW,CACZ,CAAC;wBACF,SAAS,EAAE,CAAC;oBACd,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,qDAAqD;wBACrD,MAAM,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;oBAC7D,CAAC;gBACH,CAAC;gBAED,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;YAC5D,CAAC;SACF;KACF;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { InboundAttachment } from "../types.js";
|
|
2
|
+
export declare function getMessageAttachmentInputs(message: {
|
|
3
|
+
attachments?: unknown[];
|
|
4
|
+
file?: unknown;
|
|
5
|
+
files?: unknown[];
|
|
6
|
+
}): unknown[];
|
|
7
|
+
export declare function normalizeInboundAttachments(inputs: unknown[], options?: {
|
|
8
|
+
serverUrl?: string;
|
|
9
|
+
}): InboundAttachment[];
|
|
10
|
+
//# sourceMappingURL=attachments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachments.d.ts","sourceRoot":"","sources":["../../src/service/attachments.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAA2C,MAAM,aAAa,CAAC;AAG9F,wBAAgB,0BAA0B,CAAC,OAAO,EAAE;IAClD,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC;IACxB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;CACnB,GAAG,OAAO,EAAE,CA8CZ;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,OAAO,EAAE,EACjB,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/B,iBAAiB,EAAE,CAErB"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { resolveUrl } from "../utils.js";
|
|
2
|
+
import { mediaKindFromMime, mimeTypeFromFilePath } from "openclaw/plugin-sdk/media-mime";
|
|
3
|
+
export function getMessageAttachmentInputs(message) {
|
|
4
|
+
const hasId = (r) => typeof r._id === "string" && r._id.length > 0;
|
|
5
|
+
const fileRecords = toRecords([
|
|
6
|
+
...(message.file ? [message.file] : []),
|
|
7
|
+
...(message.files ?? []),
|
|
8
|
+
]);
|
|
9
|
+
const fileIds = new Set(fileRecords.filter(hasId).map((r) => r._id));
|
|
10
|
+
const attachmentRecords = toRecords(message.attachments ?? []).filter((r) => !hasId(r) || !fileIds.has(r._id));
|
|
11
|
+
const hasUrl = (r) => typeof r.url === "string" ||
|
|
12
|
+
typeof r.title_link === "string" ||
|
|
13
|
+
typeof r.image_url === "string" ||
|
|
14
|
+
typeof r.video_url === "string" ||
|
|
15
|
+
typeof r.audio_url === "string";
|
|
16
|
+
const merged = [];
|
|
17
|
+
const paired = new Set();
|
|
18
|
+
for (const fileRec of fileRecords) {
|
|
19
|
+
const matchIdx = attachmentRecords.findIndex((att, i) => !paired.has(i) &&
|
|
20
|
+
((fileRec._id && att._id && fileRec._id === att._id) || (!hasId(att) && hasUrl(att))));
|
|
21
|
+
if (matchIdx !== -1) {
|
|
22
|
+
paired.add(matchIdx);
|
|
23
|
+
const att = attachmentRecords[matchIdx];
|
|
24
|
+
const m = { ...att };
|
|
25
|
+
if (fileRec._id)
|
|
26
|
+
m._id = fileRec._id;
|
|
27
|
+
if (fileRec.type)
|
|
28
|
+
m.type = fileRec.type;
|
|
29
|
+
if (fileRec.name)
|
|
30
|
+
m.name = fileRec.name;
|
|
31
|
+
if (typeof fileRec.size === "number")
|
|
32
|
+
m.size = fileRec.size;
|
|
33
|
+
merged.push(m);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
merged.push(fileRec);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
for (let i = 0; i < attachmentRecords.length; i++) {
|
|
40
|
+
if (!paired.has(i))
|
|
41
|
+
merged.push(attachmentRecords[i]);
|
|
42
|
+
}
|
|
43
|
+
return merged;
|
|
44
|
+
}
|
|
45
|
+
export function normalizeInboundAttachments(inputs, options) {
|
|
46
|
+
return inputs.map((input) => toAttachment(input, options));
|
|
47
|
+
}
|
|
48
|
+
function toAttachment(input, options) {
|
|
49
|
+
const record = asRecord(input);
|
|
50
|
+
const mimeType = getMime(record);
|
|
51
|
+
const url = getUrl(record, options?.serverUrl);
|
|
52
|
+
const fileName = getFileName(record, url);
|
|
53
|
+
return {
|
|
54
|
+
kind: classify(mimeType, fileName),
|
|
55
|
+
source: record?._id ? "rocketchat-file" : "rocketchat-attachment",
|
|
56
|
+
raw: input,
|
|
57
|
+
...(mimeType !== undefined ? { mimeType } : {}),
|
|
58
|
+
...(fileName !== undefined ? { fileName } : {}),
|
|
59
|
+
...(url !== undefined ? { url } : {}),
|
|
60
|
+
...(typeof record?.size === "number" ? { sizeBytes: record.size } : {}),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function asRecord(input) {
|
|
64
|
+
return input && typeof input === "object" && !Array.isArray(input)
|
|
65
|
+
? input
|
|
66
|
+
: null;
|
|
67
|
+
}
|
|
68
|
+
function toRecords(inputs) {
|
|
69
|
+
return inputs.map(asRecord).filter((r) => r !== null);
|
|
70
|
+
}
|
|
71
|
+
function getMime(record) {
|
|
72
|
+
const v = record?.type ?? record?.mimeType ?? record?.mimetype ?? record?.contentType;
|
|
73
|
+
return typeof v === "string" && v.trim().length > 0 ? v.trim().toLowerCase() : undefined;
|
|
74
|
+
}
|
|
75
|
+
function getUrl(record, serverUrl) {
|
|
76
|
+
const candidates = [
|
|
77
|
+
record?.url,
|
|
78
|
+
record?.title_link,
|
|
79
|
+
record?.image_url,
|
|
80
|
+
record?.video_url,
|
|
81
|
+
record?.audio_url,
|
|
82
|
+
];
|
|
83
|
+
const raw = candidates.find((v) => typeof v === "string" && v.length > 0);
|
|
84
|
+
return raw ? resolveUrl(raw, serverUrl) : undefined;
|
|
85
|
+
}
|
|
86
|
+
function getFileName(record, url) {
|
|
87
|
+
const name = [record?.title, record?.name, record?.filename].find((v) => typeof v === "string" && v.trim().length > 0);
|
|
88
|
+
if (name)
|
|
89
|
+
return name.trim();
|
|
90
|
+
if (!url)
|
|
91
|
+
return undefined;
|
|
92
|
+
try {
|
|
93
|
+
const seg = new URL(url).pathname.split("/").filter(Boolean).at(-1);
|
|
94
|
+
return seg ? decodeURIComponent(seg) : undefined;
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function classify(mimeType, fileName) {
|
|
101
|
+
const mime = mimeType ?? (fileName ? mimeTypeFromFilePath(fileName) : undefined);
|
|
102
|
+
const kind = mime ? mediaKindFromMime(mime) : undefined;
|
|
103
|
+
return kind ?? "unknown";
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=attachments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../src/service/attachments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { InboundEvent } from "../types.js";
|
|
2
|
+
import type { ChannelRuleOptions } from "../types.js";
|
|
3
|
+
import { RocketChatClient } from "../client/rest.js";
|
|
4
|
+
import { type ExistingAccount } from "../cli/config-updater.js";
|
|
5
|
+
export declare function shouldHandleInboundEvent(event: InboundEvent, options: ChannelRuleOptions): boolean;
|
|
6
|
+
export type CommandContext = {
|
|
7
|
+
accountId: string;
|
|
8
|
+
account: ExistingAccount;
|
|
9
|
+
client: RocketChatClient;
|
|
10
|
+
channelRuntime?: import("../types.js").ChannelRuntimeLike;
|
|
11
|
+
senderName?: string;
|
|
12
|
+
roomId?: string;
|
|
13
|
+
roomType?: import("../types.js").InboundEvent["roomType"];
|
|
14
|
+
};
|
|
15
|
+
export type CommandResult = {
|
|
16
|
+
action: "reply";
|
|
17
|
+
replyText: string;
|
|
18
|
+
} | {
|
|
19
|
+
action: "passthrough";
|
|
20
|
+
} | {
|
|
21
|
+
action: "openclaw-command";
|
|
22
|
+
command: string;
|
|
23
|
+
};
|
|
24
|
+
export declare function matchCommand(text: string, ctx: CommandContext): Promise<CommandResult>;
|
|
25
|
+
//# sourceMappingURL=channel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/service/channel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAKrD,OAAO,EAWL,KAAK,eAAe,EAErB,MAAM,0BAA0B,CAAC;AAoBlC,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CA6BT;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,eAAe,CAAC;IACzB,MAAM,EAAE,gBAAgB,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,aAAa,EAAE,kBAAkB,CAAC;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,aAAa,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;CAC3D,CAAC;AAEF,MAAM,MAAM,aAAa,GACrB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,MAAM,EAAE,aAAa,CAAA;CAAE,GACzB;IAAE,MAAM,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAwBpD,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAmE5F"}
|