gemikenwork / runtime-dist /runtime /simpleAgent.js
burtenshaw's picture
burtenshaw HF Staff
Deploy public WorkAdventure agent town
8eaf022 verified
Raw History Blame Contribute Delete
3.04 kB
export class SimpleAgentRuntime {
agentName;
respondToAllBubbleMessages;
enableVoiceReplies;
hooks;
disclosedSessions = new Set();
constructor(options = {}) {
this.agentName = options.agentName ?? process.env.WA_AGENT_NAME ?? "AI Agent";
this.respondToAllBubbleMessages = options.respondToAllBubbleMessages ?? process.env.WA_AGENT_RESPOND_TO_ALL === "true";
this.enableVoiceReplies = options.enableVoiceReplies ?? process.env.WA_AGENT_ENABLE_VOICE !== "false";
this.hooks = options.hooks ?? [];
}
async handleObservation(session, observation, enqueue, synthesizeSpeech) {
for (const hook of this.hooks) {
await hook.afterObservation?.(observation, session);
}
if (observation.type !== "chatMessage" || observation.scope !== "bubble") {
return;
}
if (!this.shouldRespond(observation)) {
return;
}
const reply = this.makeReply(session.id, observation);
await this.enqueueWithHooks({ type: "startTyping", channel: "bubble" }, session, enqueue);
await new Promise((resolve) => setTimeout(resolve, Math.min(900, Math.max(250, reply.length * 12))));
await this.enqueueWithHooks({ type: "say", channel: "bubble", text: reply }, session, enqueue);
await this.enqueueWithHooks({ type: "stopTyping", channel: "bubble" }, session, enqueue);
if (this.enableVoiceReplies && synthesizeSpeech) {
try {
await synthesizeSpeech(reply);
}
catch (error) {
console.error("Failed to synthesize voice reply", error);
}
}
}
shouldRespond(observation) {
const authorName = observation.author?.name?.toLowerCase();
if (authorName && authorName === this.agentName.toLowerCase()) {
return false;
}
if (this.respondToAllBubbleMessages) {
return true;
}
const normalized = observation.message.toLowerCase();
return normalized.includes(this.agentName.toLowerCase()) || normalized.includes("@agent") || normalized.includes("ai agent");
}
makeReply(sessionId, observation) {
const prefix = this.disclosedSessions.has(sessionId) ? "" : "I am an AI agent. ";
this.disclosedSessions.add(sessionId);
const author = observation.author?.name ? `${observation.author.name}, ` : "";
return `${prefix}${author}I heard: "${observation.message}". This prototype is wired for WorkAdventure text and voice responses.`;
}
async enqueueWithHooks(action, session, enqueue) {
let nextAction = action;
for (const hook of this.hooks) {
if (!nextAction) {
return;
}
if (hook.beforeAction) {
nextAction = await hook.beforeAction(nextAction, session);
}
}
if (nextAction) {
enqueue(nextAction);
}
}
}
//# sourceMappingURL=simpleAgent.js.map