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