alf: the atproto Latency Fabric alf.fly.dev/
7
fork

Configure Feed

Select the types of activity you want to include in your feed.

Fix demo Docker build: copy packages/ for @newpublic/recurrence dep

demo/client/index.ts now imports parseRecurrenceRule and formatRecurrenceRule
from @newpublic/recurrence (added in the NLP parser feature). Dockerfile.demo
was not copying the packages/ directory, so npm ci failed to resolve the
file: dependency.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

+18 -296
+1
Dockerfile.demo
··· 2 2 3 3 WORKDIR /app/demo 4 4 5 + COPY packages ../packages 5 6 COPY demo/package*.json ./ 6 7 RUN npm ci 7 8
+16 -296
demo/package-lock.json
··· 8 8 "name": "alf-demo", 9 9 "version": "1.0.0", 10 10 "dependencies": { 11 - "@atproto/identity": "^0.4.4", 12 11 "@atproto/oauth-client-browser": "^0.3.41", 13 - "@atproto/oauth-client-node": "^0.2.14", 14 - "cookie-parser": "^1.4.6", 12 + "@newpublic/recurrence": "file:../packages/recurrence", 15 13 "dotenv": "^16.4.5", 16 14 "esbuild": "^0.27.3", 17 15 "express": "^4.19.2" 18 16 }, 19 17 "devDependencies": { 20 - "@types/cookie-parser": "^1.4.7", 21 18 "@types/express": "^4.17.21", 22 19 "@types/node": "^20.0.0", 23 20 "ts-node": "^10.9.2", 24 21 "typescript": "^5.4.5" 25 22 } 26 23 }, 27 - "node_modules/@atproto-labs/did-resolver": { 28 - "version": "0.1.13", 29 - "resolved": "https://registry.npmjs.org/@atproto-labs/did-resolver/-/did-resolver-0.1.13.tgz", 30 - "integrity": "sha512-DG3YNaCKc6PAIv1Gsz3E1Kufw2t14OBxe4LdKK7KKLCNoex51hm+A5yMevShe3BSll+QosqWYIEgkPSc5xBoGQ==", 31 - "license": "MIT", 24 + "../packages/recurrence": { 25 + "name": "@newpublic/recurrence", 26 + "version": "0.1.0", 27 + "license": "Apache-2.0", 32 28 "dependencies": { 33 - "@atproto-labs/fetch": "0.2.3", 34 - "@atproto-labs/pipe": "0.1.1", 35 - "@atproto-labs/simple-store": "0.2.0", 36 - "@atproto-labs/simple-store-memory": "0.1.3", 37 - "@atproto/did": "0.1.5", 38 - "zod": "^3.23.8" 29 + "luxon": "^3.5.0" 30 + }, 31 + "devDependencies": { 32 + "@types/jest": "^29.5.14", 33 + "@types/luxon": "^3.4.2", 34 + "jest": "^29.7.0", 35 + "ts-jest": "^29.4.6", 36 + "typescript": "^5.6.0" 39 37 } 40 38 }, 41 39 "node_modules/@atproto-labs/fetch": { ··· 47 45 "@atproto-labs/pipe": "0.1.1" 48 46 } 49 47 }, 50 - "node_modules/@atproto-labs/fetch-node": { 51 - "version": "0.1.9", 52 - "resolved": "https://registry.npmjs.org/@atproto-labs/fetch-node/-/fetch-node-0.1.9.tgz", 53 - "integrity": "sha512-8sHDDXZEzQptLu8ddUU/8U+THS6dumgPynVX0/1PjUYd4S/FWyPcz6yMIiVChTfzKnZvYRRz47+qvOKhydrHQw==", 54 - "license": "MIT", 55 - "dependencies": { 56 - "@atproto-labs/fetch": "0.2.3", 57 - "@atproto-labs/pipe": "0.1.1", 58 - "ipaddr.js": "^2.1.0", 59 - "undici": "^6.14.1" 60 - }, 61 - "engines": { 62 - "node": ">=18.7.0" 63 - } 64 - }, 65 - "node_modules/@atproto-labs/handle-resolver": { 66 - "version": "0.1.8", 67 - "resolved": "https://registry.npmjs.org/@atproto-labs/handle-resolver/-/handle-resolver-0.1.8.tgz", 68 - "integrity": "sha512-Y0ckccoCGDo/3g4thPkgp9QcORmc+qqEaCBCYCZYtfLIQp4775u22wd+4fyEyJP4DqoReKacninkICgRGfs3dQ==", 69 - "license": "MIT", 70 - "dependencies": { 71 - "@atproto-labs/simple-store": "0.2.0", 72 - "@atproto-labs/simple-store-memory": "0.1.3", 73 - "@atproto/did": "0.1.5", 74 - "zod": "^3.23.8" 75 - } 76 - }, 77 - "node_modules/@atproto-labs/handle-resolver-node": { 78 - "version": "0.1.16", 79 - "resolved": "https://registry.npmjs.org/@atproto-labs/handle-resolver-node/-/handle-resolver-node-0.1.16.tgz", 80 - "integrity": "sha512-i2F989zjyC7b/odrV3/tOpIT1IDIxR3F0khPG4REfOWcmJ89QcP8BiejJ6KFJk3hbTJHq6X9/pTG1vesCvyIKA==", 81 - "license": "MIT", 82 - "dependencies": { 83 - "@atproto-labs/fetch-node": "0.1.9", 84 - "@atproto-labs/handle-resolver": "0.1.8", 85 - "@atproto/did": "0.1.5" 86 - }, 87 - "engines": { 88 - "node": ">=18.7.0" 89 - } 90 - }, 91 - "node_modules/@atproto-labs/identity-resolver": { 92 - "version": "0.1.18", 93 - "resolved": "https://registry.npmjs.org/@atproto-labs/identity-resolver/-/identity-resolver-0.1.18.tgz", 94 - "integrity": "sha512-DArYXP1hzZJIBcojun0CWEF+TjAhlGKcVq/RwLiGfY1mKq2yPjCiXyHj+5L0+z9jBSZiAB7L65JgcjI2+MFiRg==", 95 - "license": "MIT", 96 - "dependencies": { 97 - "@atproto-labs/did-resolver": "0.1.13", 98 - "@atproto-labs/handle-resolver": "0.1.8", 99 - "@atproto/syntax": "0.4.0" 100 - } 101 - }, 102 - "node_modules/@atproto-labs/identity-resolver/node_modules/@atproto/syntax": { 103 - "version": "0.4.0", 104 - "resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.4.0.tgz", 105 - "integrity": "sha512-b9y5ceHS8YKOfP3mdKmwAx5yVj9294UN7FG2XzP6V5aKUdFazEYRnR9m5n5ZQFKa3GNvz7de9guZCJ/sUTcOAA==", 106 - "license": "MIT" 107 - }, 108 48 "node_modules/@atproto-labs/pipe": { 109 49 "version": "0.1.1", 110 50 "resolved": "https://registry.npmjs.org/@atproto-labs/pipe/-/pipe-0.1.1.tgz", 111 51 "integrity": "sha512-hdNw2oUs2B6BN1lp+32pF7cp8EMKuIN5Qok2Vvv/aOpG/3tNSJ9YkvfI0k6Zd188LeDDYRUpYpxcoFIcGH/FNg==", 112 52 "license": "MIT" 113 53 }, 114 - "node_modules/@atproto-labs/simple-store": { 115 - "version": "0.2.0", 116 - "resolved": "https://registry.npmjs.org/@atproto-labs/simple-store/-/simple-store-0.2.0.tgz", 117 - "integrity": "sha512-0bRbAlI8Ayh03wRwncAMEAyUKtZ+AuTS1jgPrfym1WVOAOiottI/ZmgccqLl6w5MbxVcClNQF7WYGKvGwGoIhA==", 118 - "license": "MIT" 119 - }, 120 - "node_modules/@atproto-labs/simple-store-memory": { 121 - "version": "0.1.3", 122 - "resolved": "https://registry.npmjs.org/@atproto-labs/simple-store-memory/-/simple-store-memory-0.1.3.tgz", 123 - "integrity": "sha512-jkitT9+AtU+0b28DoN92iURLaCt/q/q4yX8q6V+9LSwYlUTqKoj/5NFKvF7x6EBuG+gpUdlcycbH7e60gjOhRQ==", 124 - "license": "MIT", 125 - "dependencies": { 126 - "@atproto-labs/simple-store": "0.2.0", 127 - "lru-cache": "^10.2.0" 128 - } 129 - }, 130 54 "node_modules/@atproto/common-web": { 131 55 "version": "0.4.17", 132 56 "resolved": "https://registry.npmjs.org/@atproto/common-web/-/common-web-0.4.17.tgz", ··· 139 63 "zod": "^3.23.8" 140 64 } 141 65 }, 142 - "node_modules/@atproto/crypto": { 143 - "version": "0.4.5", 144 - "resolved": "https://registry.npmjs.org/@atproto/crypto/-/crypto-0.4.5.tgz", 145 - "integrity": "sha512-n40aKkMoCatP0u9Yvhrdk6fXyOHFDDbkdm4h4HCyWW+KlKl8iXfD5iV+ECq+w5BM+QH25aIpt3/j6EUNerhLxw==", 146 - "license": "MIT", 147 - "dependencies": { 148 - "@noble/curves": "^1.7.0", 149 - "@noble/hashes": "^1.6.1", 150 - "uint8arrays": "3.0.0" 151 - }, 152 - "engines": { 153 - "node": ">=18.7.0" 154 - } 155 - }, 156 - "node_modules/@atproto/did": { 157 - "version": "0.1.5", 158 - "resolved": "https://registry.npmjs.org/@atproto/did/-/did-0.1.5.tgz", 159 - "integrity": "sha512-8+1D08QdGE5TF0bB0vV8HLVrVZJeLNITpRTUVEoABNMRaUS7CoYSVb0+JNQDeJIVmqMjOL8dOjvCUDkp3gEaGQ==", 160 - "license": "MIT", 161 - "dependencies": { 162 - "zod": "^3.23.8" 163 - } 164 - }, 165 - "node_modules/@atproto/identity": { 166 - "version": "0.4.12", 167 - "resolved": "https://registry.npmjs.org/@atproto/identity/-/identity-0.4.12.tgz", 168 - "integrity": "sha512-P+Jn0HvKhIh1tps5n3xGrCxt+XiFWzp4kdgloyFhFmVLwjDU547DQkWx4r5Vhuiah7fRZGVSlk39R4U6SPrACg==", 169 - "license": "MIT", 170 - "dependencies": { 171 - "@atproto/common-web": "^0.4.17", 172 - "@atproto/crypto": "^0.4.5" 173 - }, 174 - "engines": { 175 - "node": ">=18.7.0" 176 - } 177 - }, 178 - "node_modules/@atproto/jwk": { 179 - "version": "0.3.0", 180 - "resolved": "https://registry.npmjs.org/@atproto/jwk/-/jwk-0.3.0.tgz", 181 - "integrity": "sha512-MIAXyNMGu1tCNHjqW/8jqfE/wgWCIoK2cJ0mR6UxwhNPvkbe35TcpRYJdtQu/E6MUd7TziyDBa/GO4dKAiePhQ==", 182 - "license": "MIT", 183 - "dependencies": { 184 - "multiformats": "^9.9.0", 185 - "zod": "^3.23.8" 186 - } 187 - }, 188 - "node_modules/@atproto/jwk-jose": { 189 - "version": "0.1.8", 190 - "resolved": "https://registry.npmjs.org/@atproto/jwk-jose/-/jwk-jose-0.1.8.tgz", 191 - "integrity": "sha512-aoU2Q0GpIl388KhCcv9YvAxNscALUv3xzLq5gjVPdJ+zmqw94nGZNcjiNvpnbfS+VQM9e2DrrTuwmDXnxfrrSA==", 192 - "license": "MIT", 193 - "dependencies": { 194 - "@atproto/jwk": "0.3.0", 195 - "jose": "^5.2.0" 196 - } 197 - }, 198 - "node_modules/@atproto/jwk-webcrypto": { 199 - "version": "0.1.8", 200 - "resolved": "https://registry.npmjs.org/@atproto/jwk-webcrypto/-/jwk-webcrypto-0.1.8.tgz", 201 - "integrity": "sha512-oOW/G40f6M0NbTOo8uZgiSsFtcvlfNFldyxm+V+fVo5yKe6cvgvPNqckpqMsoBe6JYfImdc/zdVak9fCSSh41A==", 202 - "license": "MIT", 203 - "dependencies": { 204 - "@atproto/jwk": "0.3.0", 205 - "@atproto/jwk-jose": "0.1.8", 206 - "zod": "^3.23.8" 207 - } 208 - }, 209 66 "node_modules/@atproto/lex-data": { 210 67 "version": "0.0.12", 211 68 "resolved": "https://registry.npmjs.org/@atproto/lex-data/-/lex-data-0.0.12.tgz", ··· 226 83 "dependencies": { 227 84 "@atproto/lex-data": "^0.0.12", 228 85 "tslib": "^2.8.1" 229 - } 230 - }, 231 - "node_modules/@atproto/lexicon": { 232 - "version": "0.4.14", 233 - "resolved": "https://registry.npmjs.org/@atproto/lexicon/-/lexicon-0.4.14.tgz", 234 - "integrity": "sha512-jiKpmH1QER3Gvc7JVY5brwrfo+etFoe57tKPQX/SmPwjvUsFnJAow5xLIryuBaJgFAhnTZViXKs41t//pahGHQ==", 235 - "license": "MIT", 236 - "dependencies": { 237 - "@atproto/common-web": "^0.4.2", 238 - "@atproto/syntax": "^0.4.0", 239 - "iso-datestring-validator": "^2.2.2", 240 - "multiformats": "^9.9.0", 241 - "zod": "^3.23.8" 242 - } 243 - }, 244 - "node_modules/@atproto/oauth-client": { 245 - "version": "0.4.0", 246 - "resolved": "https://registry.npmjs.org/@atproto/oauth-client/-/oauth-client-0.4.0.tgz", 247 - "integrity": "sha512-uWVnlhennWkgvzqP0l53sFaw6DM6B4zmq0fv1xs05vt56Sjly8YirAj0GVDXlb37/BQRJQ1WOBzJVYDI3bH9uw==", 248 - "license": "MIT", 249 - "dependencies": { 250 - "@atproto-labs/did-resolver": "0.1.13", 251 - "@atproto-labs/fetch": "0.2.3", 252 - "@atproto-labs/handle-resolver": "0.1.8", 253 - "@atproto-labs/identity-resolver": "0.1.18", 254 - "@atproto-labs/simple-store": "0.2.0", 255 - "@atproto-labs/simple-store-memory": "0.1.3", 256 - "@atproto/did": "0.1.5", 257 - "@atproto/jwk": "0.3.0", 258 - "@atproto/oauth-types": "0.3.0", 259 - "@atproto/xrpc": "0.7.0", 260 - "multiformats": "^9.9.0", 261 - "zod": "^3.23.8" 262 86 } 263 87 }, 264 88 "node_modules/@atproto/oauth-client-browser": { ··· 425 249 "zod": "^3.23.8" 426 250 } 427 251 }, 428 - "node_modules/@atproto/oauth-client-node": { 429 - "version": "0.2.24", 430 - "resolved": "https://registry.npmjs.org/@atproto/oauth-client-node/-/oauth-client-node-0.2.24.tgz", 431 - "integrity": "sha512-WsUiFkHjlm80J2d4czP7msYZoxvKB4hDpZGw34RgMD4VLA2jt03GMH4wTQPIZxfV3/9yrgMoOW/BDC9Iv4MavA==", 432 - "license": "MIT", 433 - "dependencies": { 434 - "@atproto-labs/did-resolver": "0.1.13", 435 - "@atproto-labs/handle-resolver-node": "0.1.16", 436 - "@atproto-labs/simple-store": "0.2.0", 437 - "@atproto/did": "0.1.5", 438 - "@atproto/jwk": "0.3.0", 439 - "@atproto/jwk-jose": "0.1.8", 440 - "@atproto/jwk-webcrypto": "0.1.8", 441 - "@atproto/oauth-client": "0.4.0", 442 - "@atproto/oauth-types": "0.3.0" 443 - }, 444 - "engines": { 445 - "node": ">=18.7.0" 446 - } 447 - }, 448 - "node_modules/@atproto/oauth-types": { 449 - "version": "0.3.0", 450 - "resolved": "https://registry.npmjs.org/@atproto/oauth-types/-/oauth-types-0.3.0.tgz", 451 - "integrity": "sha512-ptfsJARKODXfuOoDQag4a6PpEkDEj4Urz3jOmnQZy2YspPc/TNm1o0HglU0YehELv1vfhh9gEz40BJztPPhiLA==", 452 - "license": "MIT", 453 - "dependencies": { 454 - "@atproto/jwk": "0.3.0", 455 - "zod": "^3.23.8" 456 - } 457 - }, 458 252 "node_modules/@atproto/syntax": { 459 253 "version": "0.4.3", 460 254 "resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.4.3.tgz", ··· 464 258 "tslib": "^2.8.1" 465 259 } 466 260 }, 467 - "node_modules/@atproto/xrpc": { 468 - "version": "0.7.0", 469 - "resolved": "https://registry.npmjs.org/@atproto/xrpc/-/xrpc-0.7.0.tgz", 470 - "integrity": "sha512-SfhP9dGx2qclaScFDb58Jnrmim5nk4geZXCqg6sB0I/KZhZEkr9iIx1hLCp+sxkIfEsmEJjeWO4B0rjUIJW5cw==", 471 - "license": "MIT", 472 - "dependencies": { 473 - "@atproto/lexicon": "^0.4.11", 474 - "zod": "^3.23.8" 475 - } 476 - }, 477 261 "node_modules/@cspotcode/source-map-support": { 478 262 "version": "0.8.1", 479 263 "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", ··· 931 715 "@jridgewell/sourcemap-codec": "^1.4.10" 932 716 } 933 717 }, 934 - "node_modules/@noble/curves": { 935 - "version": "1.9.7", 936 - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", 937 - "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", 938 - "license": "MIT", 939 - "dependencies": { 940 - "@noble/hashes": "1.8.0" 941 - }, 942 - "engines": { 943 - "node": "^14.21.3 || >=16" 944 - }, 945 - "funding": { 946 - "url": "https://paulmillr.com/funding/" 947 - } 948 - }, 949 - "node_modules/@noble/hashes": { 950 - "version": "1.8.0", 951 - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", 952 - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", 953 - "license": "MIT", 954 - "engines": { 955 - "node": "^14.21.3 || >=16" 956 - }, 957 - "funding": { 958 - "url": "https://paulmillr.com/funding/" 959 - } 718 + "node_modules/@newpublic/recurrence": { 719 + "resolved": "../packages/recurrence", 720 + "link": true 960 721 }, 961 722 "node_modules/@tsconfig/node10": { 962 723 "version": "1.0.12", ··· 1007 768 "@types/node": "*" 1008 769 } 1009 770 }, 1010 - "node_modules/@types/cookie-parser": { 1011 - "version": "1.4.10", 1012 - "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.10.tgz", 1013 - "integrity": "sha512-B4xqkqfZ8Wek+rCOeRxsjMS9OgvzebEzzLYw7NHYuvzb7IdxOkI0ZHGgeEBX4PUM7QGVvNSK60T3OvWj3YfBRg==", 1014 - "dev": true, 1015 - "license": "MIT", 1016 - "peerDependencies": { 1017 - "@types/express": "*" 1018 - } 1019 - }, 1020 771 "node_modules/@types/express": { 1021 772 "version": "4.17.25", 1022 773 "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", ··· 1260 1011 "node": ">= 0.6" 1261 1012 } 1262 1013 }, 1263 - "node_modules/cookie-parser": { 1264 - "version": "1.4.7", 1265 - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", 1266 - "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", 1267 - "license": "MIT", 1268 - "dependencies": { 1269 - "cookie": "0.7.2", 1270 - "cookie-signature": "1.0.6" 1271 - }, 1272 - "engines": { 1273 - "node": ">= 0.8.0" 1274 - } 1275 - }, 1276 1014 "node_modules/cookie-signature": { 1277 1015 "version": "1.0.6", 1278 1016 "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", ··· 1663 1401 "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1664 1402 "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1665 1403 "license": "ISC" 1666 - }, 1667 - "node_modules/ipaddr.js": { 1668 - "version": "2.3.0", 1669 - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", 1670 - "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", 1671 - "license": "MIT", 1672 - "engines": { 1673 - "node": ">= 10" 1674 - } 1675 1404 }, 1676 1405 "node_modules/iso-datestring-validator": { 1677 1406 "version": "2.2.2", ··· 2143 1872 "license": "MIT", 2144 1873 "dependencies": { 2145 1874 "multiformats": "^9.4.2" 2146 - } 2147 - }, 2148 - "node_modules/undici": { 2149 - "version": "6.23.0", 2150 - "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", 2151 - "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", 2152 - "license": "MIT", 2153 - "engines": { 2154 - "node": ">=18.17" 2155 1875 } 2156 1876 }, 2157 1877 "node_modules/undici-types": {
+1
demo/package.json
··· 9 9 "start": "npm run build && ts-node server.ts" 10 10 }, 11 11 "dependencies": { 12 + "@newpublic/recurrence": "file:../packages/recurrence", 12 13 "@atproto/oauth-client-browser": "^0.3.41", 13 14 "dotenv": "^16.4.5", 14 15 "esbuild": "^0.27.3",