feat: added capability for clawdbot to react

This commit is contained in:
Bohdan Podvirnyi
2026-01-13 21:34:40 +02:00
committed by Peter Steinberger
parent d05c3d0659
commit 0e1dcf9cb4
12 changed files with 503 additions and 56 deletions

View File

@@ -0,0 +1,117 @@
import { afterAll, beforeAll, describe, expect, it } from "vitest";
import type { ClawdbotConfig } from "../config/config.js";
import { resolveTelegramReactionLevel } from "./reaction-level.js";
describe("resolveTelegramReactionLevel", () => {
const prevTelegramToken = process.env.TELEGRAM_BOT_TOKEN;
beforeAll(() => {
process.env.TELEGRAM_BOT_TOKEN = "test-token";
});
afterAll(() => {
if (prevTelegramToken === undefined) {
delete process.env.TELEGRAM_BOT_TOKEN;
} else {
process.env.TELEGRAM_BOT_TOKEN = prevTelegramToken;
}
});
it("defaults to ack level when reactionLevel is not set", () => {
const cfg: ClawdbotConfig = {
channels: { telegram: {} },
};
const result = resolveTelegramReactionLevel({ cfg });
expect(result.level).toBe("ack");
expect(result.ackEnabled).toBe(true);
expect(result.agentReactionsEnabled).toBe(false);
expect(result.agentReactionGuidance).toBeUndefined();
});
it("returns off level with no reactions enabled", () => {
const cfg: ClawdbotConfig = {
channels: { telegram: { reactionLevel: "off" } },
};
const result = resolveTelegramReactionLevel({ cfg });
expect(result.level).toBe("off");
expect(result.ackEnabled).toBe(false);
expect(result.agentReactionsEnabled).toBe(false);
expect(result.agentReactionGuidance).toBeUndefined();
});
it("returns ack level with only ackEnabled", () => {
const cfg: ClawdbotConfig = {
channels: { telegram: { reactionLevel: "ack" } },
};
const result = resolveTelegramReactionLevel({ cfg });
expect(result.level).toBe("ack");
expect(result.ackEnabled).toBe(true);
expect(result.agentReactionsEnabled).toBe(false);
expect(result.agentReactionGuidance).toBeUndefined();
});
it("returns minimal level with agent reactions enabled and minimal guidance", () => {
const cfg: ClawdbotConfig = {
channels: { telegram: { reactionLevel: "minimal" } },
};
const result = resolveTelegramReactionLevel({ cfg });
expect(result.level).toBe("minimal");
expect(result.ackEnabled).toBe(false);
expect(result.agentReactionsEnabled).toBe(true);
expect(result.agentReactionGuidance).toBe("minimal");
});
it("returns extensive level with agent reactions enabled and extensive guidance", () => {
const cfg: ClawdbotConfig = {
channels: { telegram: { reactionLevel: "extensive" } },
};
const result = resolveTelegramReactionLevel({ cfg });
expect(result.level).toBe("extensive");
expect(result.ackEnabled).toBe(false);
expect(result.agentReactionsEnabled).toBe(true);
expect(result.agentReactionGuidance).toBe("extensive");
});
it("resolves reaction level from a specific account", () => {
const cfg: ClawdbotConfig = {
channels: {
telegram: {
reactionLevel: "ack",
accounts: {
work: { botToken: "tok-work", reactionLevel: "extensive" },
},
},
},
};
const result = resolveTelegramReactionLevel({ cfg, accountId: "work" });
expect(result.level).toBe("extensive");
expect(result.ackEnabled).toBe(false);
expect(result.agentReactionsEnabled).toBe(true);
expect(result.agentReactionGuidance).toBe("extensive");
});
it("falls back to global level when account has no reactionLevel", () => {
const cfg: ClawdbotConfig = {
channels: {
telegram: {
reactionLevel: "minimal",
accounts: {
work: { botToken: "tok-work" },
},
},
},
};
const result = resolveTelegramReactionLevel({ cfg, accountId: "work" });
expect(result.level).toBe("minimal");
expect(result.agentReactionsEnabled).toBe(true);
expect(result.agentReactionGuidance).toBe("minimal");
});
});