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