a tool to help your Letta AI agents navigate bluesky

Update time utilities with Temporal and session improvements

Changed files
+44 -37
util
+1
deno.json
··· 6 6 "start": "deno run --allow-net --allow-env --env main.ts" 7 7 }, 8 8 "imports": { 9 + "@hunk/simple-temporal": "jsr:@hunk/simple-temporal@^1.0.0", 9 10 "@std/assert": "jsr:@std/assert@1", 10 11 "@std/datetime": "jsr:@std/datetime", 11 12 "@atproto/api": "npm:@atproto/api",
+9 -11
util/session.ts
··· 38 38 ? Number(Deno.env.get("DELAY_REFLECT_MINUTES_MAX")) * 60000 39 39 : 300000; 40 40 41 - const delayReflectMultiplier = Deno.env.get("DELAY_REFLECT_MULTIPLIER_PERCENT") 42 - ? (Number(Deno.env.get("DELAY_REFLECT_MULTIPLIER_PERCENT")) / 100) + 1 43 - : 1.05; 44 - 45 41 const sleepTimeEnabled = 46 42 Deno.env.get("SLEEP_START_TIME") && Deno.env.get("SLEEP_END_TIME") 47 43 ? true 48 44 : false; 49 45 50 - const sleepTimeEnd = Deno.env.get("SLEEP_END_TIME") 51 - ? Number(Deno.env.get("SLEEP_END_TIME")) 46 + const timeZone: string = Deno.env.get("TIME_ZONE") ?? "America/Los_Angeles"; 47 + 48 + const wakeTime = Deno.env.get("WAKE_TIME") 49 + ? Number(Deno.env.get("WAKE_TIME")) 52 50 : 23; 53 - const sleepTimeStart = Deno.env.get("SLEEP_START_TIME") 54 - ? Number(Deno.env.get("SLEEP_START_TIME")) 51 + const sleepTime = Deno.env.get("SLEEP_TIME") 52 + ? Number(Deno.env.get("SLEEP_TIME")) 55 53 : 0; 56 54 57 55 export const session = { ··· 86 84 minReflectDelayMinutes: delayReflectMin, 87 85 currentReflectDelayMinutes: delayReflectMin, 88 86 maxReflectDelayMinutes: delayReflectMax, 89 - reflectDelayMultiplier: delayReflectMultiplier, 90 87 sleepTimeEnabled: sleepTimeEnabled, 91 - sleepEnds: sleepTimeEnd, 92 - sleepStarts: sleepTimeStart, 88 + timeZone: timeZone, 89 + wakeTime: wakeTime, 90 + sleepTime: sleepTime, 93 91 }; 94 92 95 93 export const claimTaskThread = () => {
+34 -26
util/time.ts
··· 1 + import { session } from "./session.ts"; 2 + import { Temporal } from "@js-temporal/polyfill"; 3 + 1 4 /** 2 5 * Generate a random time interval in milliseconds within a defined range 3 6 * ··· 35 38 }; 36 39 37 40 export const msUntilNextWakeWindow = ( 38 - sleepStarts: number, 39 - sleepEnds: number, 41 + sleepTime: number, 42 + wakeTime: number, 40 43 minMinutesOffset: number, 41 44 maxMinutesOffset: number, 42 45 ): number => { 43 - const now = new Date(); 44 - const d = { 45 - hour: now.getHours(), 46 - day: now.getDate(), 47 - month: now.getMonth(), 48 - year: now.getFullYear(), 46 + const current = Temporal.Now.zonedDateTimeISO(session.timeZone); 47 + 48 + const dt = { 49 + hour: current.hour, 50 + day: current.day, 51 + month: current.month, 52 + year: current.year, 49 53 }; 50 54 51 - if (d.hour >= sleepEnds && d.hour < sleepStarts) { 55 + if (dt.hour >= wakeTime && dt.hour < sleepTime) { 52 56 return 0; 53 57 } else { 54 - let wakeTime; 58 + let newTime; 55 59 56 - if (d.hour < sleepEnds) { 57 - wakeTime = new Date(d.year, d.month, d.day, sleepEnds); 60 + if (dt.hour < wakeTime) { 61 + newTime = current.with({ hour: wakeTime }); 58 62 } else { 59 - wakeTime = new Date(d.year, d.month, d.day + 1, sleepEnds); 63 + newTime = current.with({ day: dt.day + 1, hour: wakeTime }); 60 64 } 61 65 62 - return wakeTime.getTime() + 63 - msRandomOffset(minMinutesOffset, maxMinutesOffset) - now.getTime(); 66 + return newTime.toInstant().epochMilliseconds + 67 + msRandomOffset(minMinutesOffset, maxMinutesOffset) - 68 + current.toInstant().epochMilliseconds; 64 69 } 65 70 }; 66 71 ··· 69 74 minMinutesOffset: number, 70 75 maxMinutesOffset: number, 71 76 ) => { 72 - const now = new Date(); 73 - const d = { 74 - hour: now.getHours(), 75 - day: now.getDate(), 76 - month: now.getMonth(), 77 - year: now.getFullYear(), 77 + const current = Temporal.Now.zonedDateTimeISO(session.timeZone); 78 + 79 + const dt = { 80 + hour: current.hour, 81 + day: current.day, 82 + month: current.month, 83 + year: current.year, 78 84 }; 79 85 80 86 let msToWindow; 81 - if (d.hour < window) { 82 - msToWindow = new Date(d.year, d.month, d.day, window); 87 + if (dt.hour < window) { 88 + msToWindow = current.with({ hour: window }).toInstant().epochMilliseconds; 83 89 } else { 84 - msToWindow = new Date(d.year, d.month, d.day + 1, window); 90 + msToWindow = current.with({ day: dt.day + 1, hour: window }).toInstant() 91 + .epochMilliseconds; 85 92 } 86 93 87 - return msToWindow.getTime() + 88 - msRandomOffset(minMinutesOffset, maxMinutesOffset) - now.getTime(); 94 + return msToWindow + 95 + msRandomOffset(minMinutesOffset, maxMinutesOffset) - 96 + current.toInstant().epochMilliseconds; 89 97 };