a tool to help your Letta AI agents navigate bluesky
1import {
2 agentContext,
3 claimTaskThread,
4 releaseTaskThread,
5 isAgentAwake,
6} from "../utils/agentContext.ts";
7import { getNow, msFrom, msRandomOffset } from "../utils/time.ts";
8import { messageAgent } from "../utils/messageAgent.ts";
9import { wakePrompt } from "../prompts/wakePrompt.ts";
10import { msUntilDailyWindow } from "../utils/time.ts";
11
12export const sendWakeMessage = async () => {
13 if (!claimTaskThread()) {
14 const newDelay = msFrom.minutes(2);
15 console.log(
16 `🔹 ${agentContext.agentBskyName} is busy, sending wake message again in ${
17 (newDelay / 1000) / 60
18 } minutes…`,
19 );
20 // session is busy, try to check notifications in 2 minutes.
21 setTimeout(sendWakeMessage, newDelay);
22 return;
23 }
24
25 if (!agentContext.sleepEnabled) {
26 console.log(
27 `🔹 ${agentContext.agentBskyName} is not enabled for sleep mode. Opting out of wake messaging…`,
28 );
29 releaseTaskThread();
30 return;
31 }
32
33 const now = getNow();
34
35 if (isAgentAwake(now.hour)) {
36 console.log(`🔹 attempting to wake up ${agentContext.agentBskyName}`);
37 } else {
38 const delay = msUntilDailyWindow(
39 agentContext.wakeTime,
40 0,
41 msFrom.minutes(30),
42 );
43 setTimeout(sendWakeMessage, delay);
44 console.log(
45 `🔹 ${agentContext.agentBskyName} should still be asleep. Scheduling wake message for ${
46 (delay / 1000 / 60 / 60).toFixed(2)
47 } hours from now…`,
48 );
49 releaseTaskThread();
50 return;
51 }
52
53 try {
54 await messageAgent(wakePrompt);
55 } catch (error) {
56 console.error("error in sendWakeMessage: ", error);
57 } finally {
58 console.log("🔹 wake attempt processed, scheduling next wake prompt…");
59 setTimeout(
60 sendWakeMessage,
61 msUntilDailyWindow(agentContext.wakeTime, 0, msFrom.minutes(30)),
62 );
63 console.log("🔹 exiting wake process");
64 releaseTaskThread();
65 }
66};