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