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