refactor: unify extension allowlist resolver and directory scaffolding

This commit is contained in:
Peter Steinberger
2026-03-07 22:13:54 +00:00
parent 8e0e76697a
commit 7230b96cc7
10 changed files with 398 additions and 223 deletions

View File

@@ -0,0 +1,40 @@
import type { ClawdbotConfig } from "openclaw/plugin-sdk/feishu";
import { describe, expect, it, vi } from "vitest";
vi.mock("./accounts.js", () => ({
resolveFeishuAccount: vi.fn(() => ({
configured: false,
config: {
allowFrom: ["user:alice", "user:bob"],
dms: {
"user:carla": {},
},
groups: {
"chat-1": {},
},
groupAllowFrom: ["chat-2"],
},
})),
}));
import { listFeishuDirectoryGroups, listFeishuDirectoryPeers } from "./directory.js";
describe("feishu directory (config-backed)", () => {
const cfg = {} as ClawdbotConfig;
it("merges allowFrom + dms into peer entries", async () => {
const peers = await listFeishuDirectoryPeers({ cfg, query: "a" });
expect(peers).toEqual([
{ kind: "user", id: "alice" },
{ kind: "user", id: "carla" },
]);
});
it("merges groups map + groupAllowFrom into group entries", async () => {
const groups = await listFeishuDirectoryGroups({ cfg });
expect(groups).toEqual([
{ kind: "group", id: "chat-1" },
{ kind: "group", id: "chat-2" },
]);
});
});

View File

@@ -1,3 +1,7 @@
import {
listDirectoryGroupEntriesFromMapKeysAndAllowFrom,
listDirectoryUserEntriesFromAllowFromAndMapKeys,
} from "openclaw/plugin-sdk";
import type { ClawdbotConfig } from "openclaw/plugin-sdk/feishu";
import { resolveFeishuAccount } from "./accounts.js";
import { createFeishuClient } from "./client.js";
@@ -22,31 +26,14 @@ export async function listFeishuDirectoryPeers(params: {
accountId?: string;
}): Promise<FeishuDirectoryPeer[]> {
const account = resolveFeishuAccount({ cfg: params.cfg, accountId: params.accountId });
const feishuCfg = account.config;
const q = params.query?.trim().toLowerCase() || "";
const ids = new Set<string>();
for (const entry of feishuCfg?.allowFrom ?? []) {
const trimmed = String(entry).trim();
if (trimmed && trimmed !== "*") {
ids.add(trimmed);
}
}
for (const userId of Object.keys(feishuCfg?.dms ?? {})) {
const trimmed = userId.trim();
if (trimmed) {
ids.add(trimmed);
}
}
return Array.from(ids)
.map((raw) => raw.trim())
.filter(Boolean)
.map((raw) => normalizeFeishuTarget(raw) ?? raw)
.filter((id) => (q ? id.toLowerCase().includes(q) : true))
.slice(0, params.limit && params.limit > 0 ? params.limit : undefined)
.map((id) => ({ kind: "user" as const, id }));
return listDirectoryUserEntriesFromAllowFromAndMapKeys({
allowFrom: account.config.allowFrom,
map: account.config.dms,
query: params.query,
limit: params.limit,
normalizeAllowFromId: (entry) => normalizeFeishuTarget(entry) ?? entry,
normalizeMapKeyId: (entry) => normalizeFeishuTarget(entry) ?? entry,
});
}
export async function listFeishuDirectoryGroups(params: {
@@ -56,30 +43,12 @@ export async function listFeishuDirectoryGroups(params: {
accountId?: string;
}): Promise<FeishuDirectoryGroup[]> {
const account = resolveFeishuAccount({ cfg: params.cfg, accountId: params.accountId });
const feishuCfg = account.config;
const q = params.query?.trim().toLowerCase() || "";
const ids = new Set<string>();
for (const groupId of Object.keys(feishuCfg?.groups ?? {})) {
const trimmed = groupId.trim();
if (trimmed && trimmed !== "*") {
ids.add(trimmed);
}
}
for (const entry of feishuCfg?.groupAllowFrom ?? []) {
const trimmed = String(entry).trim();
if (trimmed && trimmed !== "*") {
ids.add(trimmed);
}
}
return Array.from(ids)
.map((raw) => raw.trim())
.filter(Boolean)
.filter((id) => (q ? id.toLowerCase().includes(q) : true))
.slice(0, params.limit && params.limit > 0 ? params.limit : undefined)
.map((id) => ({ kind: "group" as const, id }));
return listDirectoryGroupEntriesFromMapKeysAndAllowFrom({
groups: account.config.groups,
allowFrom: account.config.groupAllowFrom,
query: params.query,
limit: params.limit,
});
}
export async function listFeishuDirectoryPeersLive(params: {