openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
147 lines (146 loc) • 4.62 kB
JavaScript
import { a as normalizeLowercaseStringOrEmpty, c as normalizeOptionalString } from "./string-coerce-mnp54Vah.js";
import "./string-coerce-runtime-CEGJWkQ_.js";
import { n as normalizeMatrixMessagingTarget, t as isMatrixQualifiedUserId } from "./target-ids-BCKwsiMr.js";
import { n as resolveMatrixAuth } from "./config-BKydsp1f.js";
import "./client-DN99_BkQ.js";
import { t as MatrixAuthedHttpClient } from "./http-client-VxV5tPDL.js";
//#region extensions/matrix/src/directory-live.ts
const MATRIX_DIRECTORY_TIMEOUT_MS = 1e4;
function resolveMatrixDirectoryLimit(limit) {
return typeof limit === "number" && Number.isFinite(limit) && limit > 0 ? Math.max(1, Math.floor(limit)) : 20;
}
function createMatrixDirectoryClient(auth) {
return new MatrixAuthedHttpClient({
homeserver: auth.homeserver,
accessToken: auth.accessToken,
ssrfPolicy: auth.ssrfPolicy,
dispatcherPolicy: auth.dispatcherPolicy
});
}
async function resolveMatrixDirectoryContext(params) {
const query = normalizeOptionalString(params.query) ?? "";
if (!query) return null;
const auth = await resolveMatrixAuth({
cfg: params.cfg,
accountId: params.accountId
});
return {
auth,
client: createMatrixDirectoryClient(auth),
query,
queryLower: normalizeLowercaseStringOrEmpty(query)
};
}
function createGroupDirectoryEntry(params) {
return {
kind: "group",
id: params.id,
name: params.name,
handle: params.handle
};
}
async function requestMatrixJson(client, params) {
return await client.requestJson({
method: params.method,
endpoint: params.endpoint,
body: params.body,
timeoutMs: MATRIX_DIRECTORY_TIMEOUT_MS
});
}
async function listMatrixDirectoryPeersLive(params) {
const query = normalizeOptionalString(params.query) ?? "";
if (!query) return [];
const directUserId = normalizeMatrixMessagingTarget(query);
if (directUserId && isMatrixQualifiedUserId(directUserId)) return [{
kind: "user",
id: directUserId
}];
const context = await resolveMatrixDirectoryContext({
...params,
query
});
if (!context) return [];
return ((await requestMatrixJson(context.client, {
method: "POST",
endpoint: "/_matrix/client/v3/user_directory/search",
body: {
search_term: context.query,
limit: resolveMatrixDirectoryLimit(params.limit)
}
})).results ?? []).map((entry) => {
const userId = normalizeOptionalString(entry.user_id);
if (!userId) return null;
const displayName = normalizeOptionalString(entry.display_name);
return {
kind: "user",
id: userId,
name: displayName,
handle: displayName ? `@${displayName}` : void 0,
raw: entry
};
}).filter(Boolean);
}
async function resolveMatrixRoomAlias(client, alias) {
try {
return normalizeOptionalString((await requestMatrixJson(client, {
method: "GET",
endpoint: `/_matrix/client/v3/directory/room/${encodeURIComponent(alias)}`
})).room_id) ?? null;
} catch {
return null;
}
}
async function fetchMatrixRoomName(client, roomId) {
try {
return normalizeOptionalString((await requestMatrixJson(client, {
method: "GET",
endpoint: `/_matrix/client/v3/rooms/${encodeURIComponent(roomId)}/state/m.room.name`
})).name) ?? null;
} catch {
return null;
}
}
async function listMatrixDirectoryGroupsLive(params) {
const query = normalizeOptionalString(params.query) ?? "";
if (!query) return [];
const directTarget = normalizeMatrixMessagingTarget(query);
if (directTarget?.startsWith("!")) return [createGroupDirectoryEntry({
id: directTarget,
name: directTarget
})];
const context = await resolveMatrixDirectoryContext({
...params,
query
});
if (!context) return [];
const { client, queryLower } = context;
const limit = resolveMatrixDirectoryLimit(params.limit);
if (directTarget?.startsWith("#")) {
const roomId = await resolveMatrixRoomAlias(client, directTarget);
if (!roomId) return [];
return [createGroupDirectoryEntry({
id: roomId,
name: directTarget,
handle: directTarget
})];
}
const rooms = ((await requestMatrixJson(client, {
method: "GET",
endpoint: "/_matrix/client/v3/joined_rooms"
})).joined_rooms ?? []).map((roomId) => normalizeOptionalString(roomId)).filter((roomId) => Boolean(roomId));
const results = [];
for (const roomId of rooms) {
const name = await fetchMatrixRoomName(client, roomId);
if (!name || !normalizeLowercaseStringOrEmpty(name).includes(queryLower)) continue;
results.push({
kind: "group",
id: roomId,
name,
handle: `#${name}`
});
if (results.length >= limit) break;
}
return results;
}
//#endregion
export { listMatrixDirectoryPeersLive as n, listMatrixDirectoryGroupsLive as t };