openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
46 lines (45 loc) • 3.19 kB
JavaScript
import { t as ReefAutonomySchema } from "../../friend-types-DBQVddbp.js";
import { n as getActiveReef } from "../../runtime-DYnXNGON.js";
//#region extensions/reef/src/commands.ts
async function handleReefCommand({ args, senderIsOwner }) {
const words = (args ?? "").trim().split(/\s+/).filter(Boolean);
const changesFriendship = words[0] === "friend" && /^(code|request|remove|block|autonomy)$/.test(words[1] ?? "");
const decidesReview = words[0] === "review" && /^(approve|deny)$/.test(words[1] ?? "");
if ((changesFriendship || decidesReview) && senderIsOwner !== true) return { text: "Only an owner in commands.ownerAllowFrom can change Reef friends or decide reviews. Ask a configured owner; friendship changes can also use openclaw reef locally." };
const active = getActiveReef();
if (words[0] === "friend" && words[1] === "code") {
const minted = await active.friends.mintCode();
return { text: `Reef friend code: ${minted.code} (expires ${(/* @__PURE__ */ new Date(minted.expires * 1e3)).toISOString()})` };
}
if (words[0] === "friend" && words[1] === "request" && words[2]) {
await active.friends.request(words[2].replace(/^@/, "").toLowerCase(), words[3]);
return { text: "Reef friend request submitted." };
}
if (words[0] === "friend" && words[1] === "list") {
const friends = await active.friends.list();
return { text: friends.length ? friends.map((friend) => `@${friend.peer} ${friend.status} epoch=${friend.key_epoch} fingerprint=${friend.fingerprint} autonomy=${friend.autonomy ?? "unapproved"}`).join("\n") : "No Reef friends." };
}
if (words[0] === "friend" && /^(remove|block)$/.test(words[1] ?? "") && words[2]) {
const peer = words[2].replace(/^@/, "").toLowerCase();
await active.friends.remove(peer);
return { text: `Reef friend @${peer} blocked and removed locally.` };
}
if (words[0] === "friend" && words[1] === "autonomy" && words[2] && words[3]) {
const peer = words[2].replace(/^@/, "").toLowerCase();
const autonomy = ReefAutonomySchema.parse(words[3]);
await active.friends.setAutonomy(peer, autonomy);
return { text: `Reef friend @${peer} autonomy set to ${autonomy}.` };
}
if (words[0] === "review" && words[1] === "list") {
const reviews = await active.reviews.list();
return { text: reviews.length ? reviews.map((review) => `${review.approvalDigest} ${review.direction} ${review.from} -> ${review.to} ${review.verdict.category}`).join("\n") : "No pending Reef reviews." };
}
if (words[0] === "review" && /^(approve|deny)$/.test(words[1] ?? "") && words[2]) {
const decided = await active.reviews.decide(words[2], words[1] === "approve");
if (!decided) return { text: "Unknown Reef approval digest." };
return { text: decided.direction === "inbound" ? `Reef review ${words[1]}d. The parked message from ${decided.from} is re-processed from the relay within about 30 seconds.` : `Reef review ${words[1]}d. Retry the identical message to re-run the guard.` };
}
return { text: "Usage: /reef friend code|request <handle> [code]|list|remove <handle>|autonomy <handle> <notify-only|bounded|extended>; /reef review list|approve <digest>|deny <digest>" };
}
//#endregion
export { handleReefCommand };