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};