@gguf/claw
Version:
Multi-channel AI gateway with extensible messaging integrations
134 lines (131 loc) • 4.78 kB
JavaScript
import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
import { r as markdownToSlackMrkdwnChunks, t as sendMessageSlack } from "./send-DyFx4sCR.js";
import { i as chunkMarkdownTextWithMode } from "./chunk-C9J4kyVw.js";
import { n as SILENT_REPLY_TOKEN, r as isSilentReplyText } from "./tokens-D1LxPszt.js";
//#region src/auto-reply/reply/reply-reference.ts
function createReplyReferencePlanner(options) {
let hasReplied = options.hasReplied ?? false;
const allowReference = options.allowReference !== false;
const existingId = options.existingId?.trim();
const startId = options.startId?.trim();
const use = () => {
if (!allowReference) return;
if (options.replyToMode === "off") return;
const id = existingId ?? startId;
if (!id) return;
if (options.replyToMode === "all") {
hasReplied = true;
return id;
}
if (!hasReplied) {
hasReplied = true;
return id;
}
};
const markSent = () => {
hasReplied = true;
};
return {
use,
markSent,
hasReplied: () => hasReplied
};
}
//#endregion
//#region src/slack/monitor/replies.ts
var replies_exports = /* @__PURE__ */ __exportAll({
createSlackReplyDeliveryPlan: () => createSlackReplyDeliveryPlan,
deliverReplies: () => deliverReplies,
deliverSlackSlashReplies: () => deliverSlackSlashReplies,
resolveSlackThreadTs: () => resolveSlackThreadTs
});
async function deliverReplies(params) {
for (const payload of params.replies) {
const threadTs = payload.replyToId ?? params.replyThreadTs;
const mediaList = payload.mediaUrls ?? (payload.mediaUrl ? [payload.mediaUrl] : []);
const text = payload.text ?? "";
if (!text && mediaList.length === 0) continue;
if (mediaList.length === 0) {
const trimmed = text.trim();
if (!trimmed || isSilentReplyText(trimmed, SILENT_REPLY_TOKEN)) continue;
await sendMessageSlack(params.target, trimmed, {
token: params.token,
threadTs,
accountId: params.accountId
});
} else {
let first = true;
for (const mediaUrl of mediaList) {
const caption = first ? text : "";
first = false;
await sendMessageSlack(params.target, caption, {
token: params.token,
mediaUrl,
threadTs,
accountId: params.accountId
});
}
}
params.runtime.log?.(`delivered reply to ${params.target}`);
}
}
/**
* Compute effective threadTs for a Slack reply based on replyToMode.
* - "off": stay in thread if already in one, otherwise main channel
* - "first": first reply goes to thread, subsequent replies to main channel
* - "all": all replies go to thread
*/
function resolveSlackThreadTs(params) {
return createSlackReplyReferencePlanner({
replyToMode: params.replyToMode,
incomingThreadTs: params.incomingThreadTs,
messageTs: params.messageTs,
hasReplied: params.hasReplied
}).use();
}
function createSlackReplyReferencePlanner(params) {
return createReplyReferencePlanner({
replyToMode: params.incomingThreadTs ? "all" : params.replyToMode,
existingId: params.incomingThreadTs,
startId: params.messageTs,
hasReplied: params.hasReplied
});
}
function createSlackReplyDeliveryPlan(params) {
const replyReference = createSlackReplyReferencePlanner({
replyToMode: params.replyToMode,
incomingThreadTs: params.incomingThreadTs,
messageTs: params.messageTs,
hasReplied: params.hasRepliedRef.value
});
return {
nextThreadTs: () => replyReference.use(),
markSent: () => {
replyReference.markSent();
params.hasRepliedRef.value = replyReference.hasReplied();
}
};
}
async function deliverSlackSlashReplies(params) {
const messages = [];
const chunkLimit = Math.min(params.textLimit, 4e3);
for (const payload of params.replies) {
const textRaw = payload.text?.trim() ?? "";
const text = textRaw && !isSilentReplyText(textRaw, SILENT_REPLY_TOKEN) ? textRaw : void 0;
const mediaList = payload.mediaUrls ?? (payload.mediaUrl ? [payload.mediaUrl] : []);
const combined = [text ?? "", ...mediaList.map((url) => url.trim()).filter(Boolean)].filter(Boolean).join("\n");
if (!combined) continue;
const chunkMode = params.chunkMode ?? "length";
const chunks = (chunkMode === "newline" ? chunkMarkdownTextWithMode(combined, chunkLimit, chunkMode) : [combined]).flatMap((markdown) => markdownToSlackMrkdwnChunks(markdown, chunkLimit, { tableMode: params.tableMode }));
if (!chunks.length && combined) chunks.push(combined);
for (const chunk of chunks) messages.push(chunk);
}
if (messages.length === 0) return;
const responseType = params.ephemeral ? "ephemeral" : "in_channel";
for (const text of messages) await params.respond({
text,
response_type: responseType
});
}
//#endregion
export { createReplyReferencePlanner as a, resolveSlackThreadTs as i, deliverReplies as n, replies_exports as r, createSlackReplyDeliveryPlan as t };