fix: pair capture on message sending

This commit is contained in:
2026-04-12 23:39:46 +00:00
parent f2ec5d43de
commit 0371739877
3 changed files with 41 additions and 19 deletions

View File

@@ -20,6 +20,30 @@ function shouldCapturePrompt(prompt, minLength) {
return text.length >= minLength;
}
function buildKeys(...values) {
return [...new Set(values.map((v) => trimText(v)).filter(Boolean))];
}
function rememberPending(store, keys, payload) {
for (const key of keys) store.set(key, payload);
}
function takePending(store, keys) {
for (const key of keys) {
const value = store.get(key);
if (value) {
for (const k of keys) store.delete(k);
store.delete(key);
return value;
}
}
return null;
}
function clearPending(store, keys) {
for (const key of keys) store.delete(key);
}
async function postInteraction(baseUrl, payload, logger) {
try {
const res = await fetch(`${baseUrl.replace(/\/$/, "")}/interactions`, {
@@ -50,29 +74,28 @@ export default definePluginEntry({
const config = api.getConfig?.() || {};
const minPromptLength = Number(config.minPromptLength || DEFAULT_MIN_PROMPT_LENGTH);
const prompt = trimText(event?.body || event?.content || "");
const key = ctx?.sessionKey || event?.sessionKey;
if (!key) return;
const keys = buildKeys(ctx?.sessionKey, ctx?.sessionId, event?.sessionKey, event?.sessionId, ctx?.conversationId, event?.conversationId);
if (!keys.length) return;
if (!shouldCapturePrompt(prompt, minPromptLength)) {
pendingBySession.delete(key);
clearPending(pendingBySession, keys);
return;
}
pendingBySession.set(key, {
rememberPending(pendingBySession, keys, {
prompt,
sessionId: key,
sessionKey: key,
sessionId: trimText(ctx?.sessionId || event?.sessionId || ""),
sessionKey: trimText(ctx?.sessionKey || event?.sessionKey || ""),
conversationId: trimText(ctx?.conversationId || event?.conversationId || ""),
project: ""
});
});
api.on("llm_output", async (event, ctx) => {
if (ctx?.trigger && ctx.trigger !== "user") return;
const key = ctx.sessionKey || ctx.sessionId;
const pending = pendingBySession.get(key);
api.on("message_sending", async (event, ctx) => {
const keys = buildKeys(ctx?.sessionKey, ctx?.sessionId, ctx?.conversationId);
const pending = takePending(pendingBySession, keys);
if (!pending) return;
const assistantTexts = Array.isArray(event?.assistantTexts) ? event.assistantTexts : [];
const response = truncateResponse(
trimText(assistantTexts.join("\n\n")),
trimText(event?.content || ""),
Number((api.getConfig?.() || {}).maxResponseLength || DEFAULT_MAX_RESPONSE_LENGTH)
);
if (!response) return;
@@ -83,23 +106,20 @@ export default definePluginEntry({
prompt: pending.prompt,
response,
client: "openclaw",
session_id: pending.sessionKey || pending.sessionId,
session_id: pending.sessionKey || pending.sessionId || pending.conversationId,
project: pending.project || "",
reinforce: true
};
await postInteraction(baseUrl, payload, logger);
pendingBySession.delete(key);
});
api.on("agent_end", async (event) => {
const key = event?.sessionKey || event?.sessionId;
if (key) pendingBySession.delete(key);
clearPending(pendingBySession, buildKeys(event?.sessionKey, event?.sessionId));
});
api.on("session_end", async (event) => {
const key = event?.sessionKey || event?.sessionId;
if (key) pendingBySession.delete(key);
clearPending(pendingBySession, buildKeys(event?.sessionKey, event?.sessionId));
});
}
});