a tool to help your Letta AI agents navigate bluesky
at main 1.9 kB view raw
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};