a tool to help your Letta AI agents navigate bluesky

Add project setup with .env generation script

+6
.env.example
···
··· 1 + LETTA_API_KEY= 2 + LETTA_PROJECT_SLUG= 3 + LETTA_AGENT_ID= 4 + BSKY_SERVICE_URL= 5 + BSKY_USERNAME= 6 + BSKY_APP_PASSWORD=
+2
README.md
···
··· 1 + run with watch: `deno task dev` 2 + run on server: `deno task start`
+12
deno.json
···
··· 1 + { 2 + "tasks": { 3 + "setup": "deno run --allow-read --allow-write setup.ts", 4 + "dev": "deno run --allow-net --allow-env --env --watch server.ts", 5 + "start": "deno run --allow-net --allow-env --env server.ts" 6 + }, 7 + "imports": { 8 + "@std/assert": "jsr:@std/assert@1", 9 + "@atproto/api": "npm:@atproto/api", 10 + "@letta-ai/letta-client": "npm:@letta-ai/letta-client" 11 + } 12 + }
+335
deno.lock
···
··· 1 + { 2 + "version": "5", 3 + "specifiers": { 4 + "npm:@atproto/api@*": "0.17.2", 5 + "npm:@letta-ai/letta-client@*": "0.0.68664" 6 + }, 7 + "npm": { 8 + "@atproto/api@0.17.2": { 9 + "integrity": "sha512-luRY9YPaRQFpm3v7a1bTOaekQ/KPCG3gb0jVyaOtfMXDSfIZJh9lr9MtmGPdEp7AvfE8urkngZ+V/p8Ial3z2g==", 10 + "dependencies": [ 11 + "@atproto/common-web", 12 + "@atproto/lexicon", 13 + "@atproto/syntax", 14 + "@atproto/xrpc", 15 + "await-lock", 16 + "multiformats", 17 + "tlds", 18 + "zod" 19 + ] 20 + }, 21 + "@atproto/common-web@0.4.3": { 22 + "integrity": "sha512-nRDINmSe4VycJzPo6fP/hEltBcULFxt9Kw7fQk6405FyAWZiTluYHlXOnU7GkQfeUK44OENG1qFTBcmCJ7e8pg==", 23 + "dependencies": [ 24 + "graphemer", 25 + "multiformats", 26 + "uint8arrays", 27 + "zod" 28 + ] 29 + }, 30 + "@atproto/lexicon@0.5.1": { 31 + "integrity": "sha512-y8AEtYmfgVl4fqFxqXAeGvhesiGkxiy3CWoJIfsFDDdTlZUC8DFnZrYhcqkIop3OlCkkljvpSJi1hbeC1tbi8A==", 32 + "dependencies": [ 33 + "@atproto/common-web", 34 + "@atproto/syntax", 35 + "iso-datestring-validator", 36 + "multiformats", 37 + "zod" 38 + ] 39 + }, 40 + "@atproto/syntax@0.4.1": { 41 + "integrity": "sha512-CJdImtLAiFO+0z3BWTtxwk6aY5w4t8orHTMVJgkf++QRJWTxPbIFko/0hrkADB7n2EruDxDSeAgfUGehpH6ngw==" 42 + }, 43 + "@atproto/xrpc@0.7.5": { 44 + "integrity": "sha512-MUYNn5d2hv8yVegRL0ccHvTHAVj5JSnW07bkbiaz96UH45lvYNRVwt44z+yYVnb0/mvBzyD3/ZQ55TRGt7fHkA==", 45 + "dependencies": [ 46 + "@atproto/lexicon", 47 + "zod" 48 + ] 49 + }, 50 + "@letta-ai/letta-client@0.0.68664": { 51 + "integrity": "sha512-/0g8dV3IIX0WfnOUDY1EEgnhj/747m73zhTmbLhldEMjCk/RzKyjvUeZbHiukiGoCf/u1nxRgcRUn66MKMYB2A==", 52 + "dependencies": [ 53 + "form-data", 54 + "form-data-encoder", 55 + "formdata-node", 56 + "node-fetch", 57 + "qs", 58 + "readable-stream", 59 + "url-join" 60 + ] 61 + }, 62 + "abort-controller@3.0.0": { 63 + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 64 + "dependencies": [ 65 + "event-target-shim" 66 + ] 67 + }, 68 + "asynckit@0.4.0": { 69 + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 70 + }, 71 + "await-lock@2.2.2": { 72 + "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" 73 + }, 74 + "base64-js@1.5.1": { 75 + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 76 + }, 77 + "buffer@6.0.3": { 78 + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", 79 + "dependencies": [ 80 + "base64-js", 81 + "ieee754" 82 + ] 83 + }, 84 + "call-bind-apply-helpers@1.0.2": { 85 + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", 86 + "dependencies": [ 87 + "es-errors", 88 + "function-bind" 89 + ] 90 + }, 91 + "call-bound@1.0.4": { 92 + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", 93 + "dependencies": [ 94 + "call-bind-apply-helpers", 95 + "get-intrinsic" 96 + ] 97 + }, 98 + "combined-stream@1.0.8": { 99 + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 100 + "dependencies": [ 101 + "delayed-stream" 102 + ] 103 + }, 104 + "delayed-stream@1.0.0": { 105 + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" 106 + }, 107 + "dunder-proto@1.0.1": { 108 + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 109 + "dependencies": [ 110 + "call-bind-apply-helpers", 111 + "es-errors", 112 + "gopd" 113 + ] 114 + }, 115 + "es-define-property@1.0.1": { 116 + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" 117 + }, 118 + "es-errors@1.3.0": { 119 + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" 120 + }, 121 + "es-object-atoms@1.1.1": { 122 + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", 123 + "dependencies": [ 124 + "es-errors" 125 + ] 126 + }, 127 + "es-set-tostringtag@2.1.0": { 128 + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", 129 + "dependencies": [ 130 + "es-errors", 131 + "get-intrinsic", 132 + "has-tostringtag", 133 + "hasown" 134 + ] 135 + }, 136 + "event-target-shim@5.0.1": { 137 + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" 138 + }, 139 + "events@3.3.0": { 140 + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" 141 + }, 142 + "form-data-encoder@4.1.0": { 143 + "integrity": "sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==" 144 + }, 145 + "form-data@4.0.4": { 146 + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", 147 + "dependencies": [ 148 + "asynckit", 149 + "combined-stream", 150 + "es-set-tostringtag", 151 + "hasown", 152 + "mime-types" 153 + ] 154 + }, 155 + "formdata-node@6.0.3": { 156 + "integrity": "sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg==" 157 + }, 158 + "function-bind@1.1.2": { 159 + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" 160 + }, 161 + "get-intrinsic@1.3.0": { 162 + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", 163 + "dependencies": [ 164 + "call-bind-apply-helpers", 165 + "es-define-property", 166 + "es-errors", 167 + "es-object-atoms", 168 + "function-bind", 169 + "get-proto", 170 + "gopd", 171 + "has-symbols", 172 + "hasown", 173 + "math-intrinsics" 174 + ] 175 + }, 176 + "get-proto@1.0.1": { 177 + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", 178 + "dependencies": [ 179 + "dunder-proto", 180 + "es-object-atoms" 181 + ] 182 + }, 183 + "gopd@1.2.0": { 184 + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" 185 + }, 186 + "graphemer@1.4.0": { 187 + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" 188 + }, 189 + "has-symbols@1.1.0": { 190 + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" 191 + }, 192 + "has-tostringtag@1.0.2": { 193 + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", 194 + "dependencies": [ 195 + "has-symbols" 196 + ] 197 + }, 198 + "hasown@2.0.2": { 199 + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 200 + "dependencies": [ 201 + "function-bind" 202 + ] 203 + }, 204 + "ieee754@1.2.1": { 205 + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 206 + }, 207 + "iso-datestring-validator@2.2.2": { 208 + "integrity": "sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==" 209 + }, 210 + "math-intrinsics@1.1.0": { 211 + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" 212 + }, 213 + "mime-db@1.52.0": { 214 + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 215 + }, 216 + "mime-types@2.1.35": { 217 + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 218 + "dependencies": [ 219 + "mime-db" 220 + ] 221 + }, 222 + "multiformats@9.9.0": { 223 + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" 224 + }, 225 + "node-fetch@2.7.0": { 226 + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", 227 + "dependencies": [ 228 + "whatwg-url" 229 + ] 230 + }, 231 + "object-inspect@1.13.4": { 232 + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==" 233 + }, 234 + "process@0.11.10": { 235 + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" 236 + }, 237 + "qs@6.14.0": { 238 + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", 239 + "dependencies": [ 240 + "side-channel" 241 + ] 242 + }, 243 + "readable-stream@4.7.0": { 244 + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", 245 + "dependencies": [ 246 + "abort-controller", 247 + "buffer", 248 + "events", 249 + "process", 250 + "string_decoder" 251 + ] 252 + }, 253 + "safe-buffer@5.2.1": { 254 + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 255 + }, 256 + "side-channel-list@1.0.0": { 257 + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", 258 + "dependencies": [ 259 + "es-errors", 260 + "object-inspect" 261 + ] 262 + }, 263 + "side-channel-map@1.0.1": { 264 + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", 265 + "dependencies": [ 266 + "call-bound", 267 + "es-errors", 268 + "get-intrinsic", 269 + "object-inspect" 270 + ] 271 + }, 272 + "side-channel-weakmap@1.0.2": { 273 + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", 274 + "dependencies": [ 275 + "call-bound", 276 + "es-errors", 277 + "get-intrinsic", 278 + "object-inspect", 279 + "side-channel-map" 280 + ] 281 + }, 282 + "side-channel@1.1.0": { 283 + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", 284 + "dependencies": [ 285 + "es-errors", 286 + "object-inspect", 287 + "side-channel-list", 288 + "side-channel-map", 289 + "side-channel-weakmap" 290 + ] 291 + }, 292 + "string_decoder@1.3.0": { 293 + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 294 + "dependencies": [ 295 + "safe-buffer" 296 + ] 297 + }, 298 + "tlds@1.260.0": { 299 + "integrity": "sha512-78+28EWBhCEE7qlyaHA9OR3IPvbCLiDh3Ckla593TksfFc9vfTsgvH7eS+dr3o9qr31gwGbogcI16yN91PoRjQ==", 300 + "bin": true 301 + }, 302 + "tr46@0.0.3": { 303 + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 304 + }, 305 + "uint8arrays@3.0.0": { 306 + "integrity": "sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==", 307 + "dependencies": [ 308 + "multiformats" 309 + ] 310 + }, 311 + "url-join@4.0.1": { 312 + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" 313 + }, 314 + "webidl-conversions@3.0.1": { 315 + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 316 + }, 317 + "whatwg-url@5.0.0": { 318 + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 319 + "dependencies": [ 320 + "tr46", 321 + "webidl-conversions" 322 + ] 323 + }, 324 + "zod@3.25.76": { 325 + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==" 326 + } 327 + }, 328 + "workspace": { 329 + "dependencies": [ 330 + "jsr:@std/assert@1", 331 + "npm:@atproto/api@*", 332 + "npm:@letta-ai/letta-client@*" 333 + ] 334 + } 335 + }
+10
setup.ts
···
··· 1 + // setup.ts 2 + const envExample = await Deno.readTextFile(".env.example"); 3 + 4 + try { 5 + await Deno.stat(".env"); 6 + console.log("✓ .env already exists, skipping..."); 7 + } catch { 8 + await Deno.writeTextFile(".env", envExample); 9 + console.log("✓ Created .env from .env.example"); 10 + }