wip bsky client for the web & android
0
fork

Configure Feed

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

feat(pluralhost): add lexicons

vi 1a5c10b6 56ae5cf2

+848
+35
bun.lock
··· 26 26 "vue": "^3.5.28", 27 27 }, 28 28 "devDependencies": { 29 + "@atcute/lex-cli": "^2.5.3", 29 30 "@capacitor/cli": "^8.1.0", 30 31 "@prettier/plugin-oxc": "^0.0.5", 31 32 "@tsconfig/node24": "^24.0.4", ··· 57 58 58 59 "@atcute/bluesky-richtext-parser": ["@atcute/bluesky-richtext-parser@2.1.1", "", {}, "sha512-2CJiZ1oLAxQEz6BL5r1m/p+m89bb02959dFEvMvYI7CbHgIzbZsDOp3JB2XVu49DjPNtd9Mz5VnF5OBBpTgWdg=="], 59 60 61 + "@atcute/car": ["@atcute/car@5.1.1", "", { "dependencies": { "@atcute/cbor": "^2.3.2", "@atcute/cid": "^2.4.1", "@atcute/uint8array": "^1.1.1", "@atcute/varint": "^2.0.0" } }, "sha512-MeRUJNXYgAHrJZw7mMoZJb9xIqv3LZLQw90rRRAVAo8SGNdICwyqe6Bf2LGesX73QM04MBuYO6Kqhvold3TFfg=="], 62 + 63 + "@atcute/cbor": ["@atcute/cbor@2.3.2", "", { "dependencies": { "@atcute/cid": "^2.4.1", "@atcute/multibase": "^1.1.8", "@atcute/uint8array": "^1.1.1" } }, "sha512-xP2SORSau/VVI00x2V4BjwIkHr6EQ7l/MXEOPaa4LGYtePFc4gnD4L1yN10dT5NEuUnvGEuCh6arLB7gz1smVQ=="], 64 + 65 + "@atcute/cid": ["@atcute/cid@2.4.1", "", { "dependencies": { "@atcute/multibase": "^1.1.8", "@atcute/uint8array": "^1.1.1" } }, "sha512-bwhna69RCv7yetXudtj+2qrMPYvhhIQqvJz6YUpUS98v7OdF3X2dnye9Nig2NDrklZcuyOsu7sQo7GOykJXRLQ=="], 66 + 60 67 "@atcute/client": ["@atcute/client@4.2.1", "", { "dependencies": { "@atcute/identity": "^1.1.3", "@atcute/lexicons": "^1.2.6" } }, "sha512-ZBFM2pW075JtgGFu5g7HHZBecrClhlcNH8GVP9Zz1aViWR+cjjBsTpeE63rJs+FCOHFYlirUyo5L8SGZ4kMINw=="], 68 + 69 + "@atcute/crypto": ["@atcute/crypto@2.4.0", "", { "dependencies": { "@atcute/multibase": "^1.1.8", "@atcute/uint8array": "^1.1.1", "@noble/secp256k1": "^3.0.0" } }, "sha512-XtEeDaSgfr92C7b1VDRvd3F9pI8tVUyy8PJAeu8IWQC7+e/GXZOSl58uWh5YP/9p1Lsa0I16uKHwogygxEwlMQ=="], 61 70 62 71 "@atcute/identity": ["@atcute/identity@1.1.3", "", { "dependencies": { "@atcute/lexicons": "^1.2.4", "@badrap/valita": "^0.4.6" } }, "sha512-oIqPoI8TwWeQxvcLmFEZLdN2XdWcaLVtlm8pNk0E72As9HNzzD9pwKPrLr3rmTLRIoULPPFmq9iFNsTeCIU9ng=="], 63 72 64 73 "@atcute/identity-resolver": ["@atcute/identity-resolver@1.2.2", "", { "dependencies": { "@atcute/lexicons": "^1.2.6", "@atcute/util-fetch": "^1.0.5", "@badrap/valita": "^0.4.6" }, "peerDependencies": { "@atcute/identity": "^1.0.0" } }, "sha512-eUh/UH4bFvuXS0X7epYCeJC/kj4rbBXfSRumLEH4smMVwNOgTo7cL/0Srty+P/qVPoZEyXdfEbS0PHJyzoXmHw=="], 65 74 75 + "@atcute/lex-cli": ["@atcute/lex-cli@2.5.3", "", { "dependencies": { "@atcute/identity": "^1.1.3", "@atcute/identity-resolver": "^1.2.2", "@atcute/lexicon-doc": "^2.1.0", "@atcute/lexicon-resolver": "^0.1.6", "@atcute/lexicons": "^1.2.7", "@badrap/valita": "^0.4.6", "@optique/core": "^0.6.10", "@optique/run": "^0.6.10", "picocolors": "^1.1.1", "prettier": "^3.7.4" }, "bin": { "lex-cli": "cli.mjs" } }, "sha512-829rvezMOfRkJQRKvupNT8TWT/YYffJ2QsB80D9aPjkXSogrETZA7xZcPaMZBXg+mJaVbLO9S4ThPQmlF0L4UQ=="], 76 + 77 + "@atcute/lexicon-doc": ["@atcute/lexicon-doc@2.1.1", "", { "dependencies": { "@atcute/identity": "^1.1.3", "@atcute/lexicons": "^1.2.9", "@atcute/uint8array": "^1.1.1", "@atcute/util-text": "^1.1.1", "@badrap/valita": "^0.4.6" } }, "sha512-DirteHRK0GPLFVsIkaxD2IxUQUtpMO3I/EM8gy+2HAn6nODfN85qDYMefE2oA/QvTa97SVkXaoFNzZkCshx7+g=="], 78 + 79 + "@atcute/lexicon-resolver": ["@atcute/lexicon-resolver@0.1.6", "", { "dependencies": { "@atcute/crypto": "^2.3.0", "@atcute/lexicon-doc": "^2.0.6", "@atcute/lexicons": "^1.2.6", "@atcute/repo": "^0.1.1", "@atcute/util-fetch": "^1.0.5", "@badrap/valita": "^0.4.6" }, "peerDependencies": { "@atcute/identity": "^1.1.0", "@atcute/identity-resolver": "^1.1.3" } }, "sha512-wJC/ChmpP7k+ywpOd07CMvioXjIGaFpF3bDwXLi/086LYjSWHOvtW6pyC+mqP5wLhjyH2hn4wmi77Buew1l1aw=="], 80 + 66 81 "@atcute/lexicons": ["@atcute/lexicons@1.2.9", "", { "dependencies": { "@atcute/uint8array": "^1.1.1", "@atcute/util-text": "^1.1.1", "@standard-schema/spec": "^1.1.0", "esm-env": "^1.2.2" } }, "sha512-/RRHm2Cw9o8Mcsrq0eo8fjS9okKYLGfuFwrQ0YoP/6sdSDsXshaTLJsvLlcUcaDaSJ1YFOuHIo3zr2Om2F/16g=="], 67 82 83 + "@atcute/mst": ["@atcute/mst@1.0.0", "", { "dependencies": { "@atcute/cbor": "^2.3.2", "@atcute/cid": "^2.4.1", "@atcute/uint8array": "^1.1.1" } }, "sha512-pMce2efib+dmKtnGnIvJZitVncJkpr3AmhyfgfYllni8KzsaDGsJmuGavSVpuojAhQe+6jYwHFtpm/beiiH4uw=="], 84 + 68 85 "@atcute/multibase": ["@atcute/multibase@1.1.6", "", { "dependencies": { "@atcute/uint8array": "^1.0.5" } }, "sha512-HBxuCgYLKPPxETV0Rot4VP9e24vKl8JdzGCZOVsDaOXJgbRZoRIF67Lp0H/OgnJeH/Xpva8Z5ReoTNJE5dn3kg=="], 69 86 70 87 "@atcute/oauth-browser-client": ["@atcute/oauth-browser-client@2.0.3", "", { "dependencies": { "@atcute/client": "^4.1.1", "@atcute/identity-resolver": "^1.2.0", "@atcute/lexicons": "^1.2.5", "@atcute/multibase": "^1.1.6", "@atcute/uint8array": "^1.0.6", "nanoid": "^5.1.6" } }, "sha512-rzUjwhjE4LRRKdQnCFQag/zXRZMEAB1hhBoLfnoQuHwWbmDUCL7fzwC3jRhDPp3om8XaYNDj8a/iqRip0wRqoQ=="], 88 + 89 + "@atcute/repo": ["@atcute/repo@0.1.3", "", { "dependencies": { "@atcute/car": "^5.1.1", "@atcute/cbor": "^2.3.2", "@atcute/cid": "^2.4.1", "@atcute/crypto": "^2.4.0", "@atcute/lexicons": "^1.2.9", "@atcute/mst": "^1.0.0", "@atcute/uint8array": "^1.1.1" } }, "sha512-kN4gkrkQgJwI5xkVQ9zSdI8ULR47uH48EdJdjMvKAWsSDu8zKYd8ZQ6n778qa6o3WYEq02v9QVf7pzeU+3fYVA=="], 71 90 72 91 "@atcute/uint8array": ["@atcute/uint8array@1.1.1", "", {}, "sha512-3LsC8XB8TKe9q/5hOA5sFuzGaIFdJZJNewC5OKa3o/eU6+K7JR6see9Zy2JbQERNVnRl11EzbNov1efgLMAs4g=="], 73 92 74 93 "@atcute/util-fetch": ["@atcute/util-fetch@1.0.5", "", { "dependencies": { "@badrap/valita": "^0.4.6" } }, "sha512-qjHj01BGxjSjIFdPiAjSARnodJIIyKxnCMMEcXMESo9TAyND6XZQqrie5fia+LlYWVXdpsTds8uFQwc9jdKTig=="], 75 94 76 95 "@atcute/util-text": ["@atcute/util-text@1.1.1", "", { "dependencies": { "unicode-segmenter": "^0.14.5" } }, "sha512-JH0SxzUQJAmbOBTYyhxQbkkI6M33YpjlVLEcbP5GYt43xgFArzV0FJVmEpvIj0kjsmphHB45b6IitdvxPdec9w=="], 96 + 97 + "@atcute/varint": ["@atcute/varint@2.0.0", "", {}, "sha512-CEY/oVK/nVpL4e5y3sdenLETDL6/Xu5xsE/0TupK+f0Yv8jcD60t2gD8SHROWSvUwYLdkjczLCSA7YrtnjCzWw=="], 77 98 78 99 "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], 79 100 ··· 225 246 226 247 "@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], 227 248 249 + "@noble/secp256k1": ["@noble/secp256k1@3.0.0", "", {}, "sha512-NJBaR352KyIvj3t6sgT/+7xrNyF9Xk9QlLSIqUGVUYlsnDTAUqY8LOmwpcgEx4AMJXRITQ5XEVHD+mMaPfr3mg=="], 250 + 228 251 "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], 229 252 230 253 "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], 231 254 232 255 "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], 256 + 257 + "@optique/core": ["@optique/core@0.6.11", "", {}, "sha512-GVLFihzBA1j78NFlkU5N1Lu0jRqET0k6Z66WK8VQKG/a3cxmCInVGSKMIdQG8i6pgC8wD5OizF6Y3QMztmhAxg=="], 258 + 259 + "@optique/run": ["@optique/run@0.6.11", "", { "dependencies": { "@optique/core": "0.6.11" } }, "sha512-tsXBEygGSzNpFK2gjsRlXBn7FiScUeLFWIZNpoAZ8iG85Km0/3K9xgqlQAXoQ+uEZBe4XplnzyCDvmEgbyNT8w=="], 233 260 234 261 "@oxc-parser/binding-android-arm64": ["@oxc-parser/binding-android-arm64@0.97.0", "", { "os": "android", "cpu": "arm64" }, "sha512-oLCGuX+1zqTIUjTfCxiZO/Ad4p4wo2MksBSpjdgOC7htyfIg/Se9PK2xU2jzSXlIyzBivwK6AJFqJpcbzJlmsQ=="], 235 262 ··· 1401 1428 1402 1429 "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], 1403 1430 1431 + "@atcute/cbor/@atcute/multibase": ["@atcute/multibase@1.1.8", "", { "dependencies": { "@atcute/uint8array": "^1.1.1" } }, "sha512-pJgtImMZKCjqwRbu+2GzB+4xQjKBXDwdZOzeqe0u97zYKRGftpGYGvYv3+pMe2xXe+msDyu7Nv8iJp+U14otTA=="], 1432 + 1433 + "@atcute/cid/@atcute/multibase": ["@atcute/multibase@1.1.8", "", { "dependencies": { "@atcute/uint8array": "^1.1.1" } }, "sha512-pJgtImMZKCjqwRbu+2GzB+4xQjKBXDwdZOzeqe0u97zYKRGftpGYGvYv3+pMe2xXe+msDyu7Nv8iJp+U14otTA=="], 1434 + 1435 + "@atcute/crypto/@atcute/multibase": ["@atcute/multibase@1.1.8", "", { "dependencies": { "@atcute/uint8array": "^1.1.1" } }, "sha512-pJgtImMZKCjqwRbu+2GzB+4xQjKBXDwdZOzeqe0u97zYKRGftpGYGvYv3+pMe2xXe+msDyu7Nv8iJp+U14otTA=="], 1436 + 1404 1437 "@atcute/identity/@atcute/lexicons": ["@atcute/lexicons@1.2.5", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "esm-env": "^1.2.2" } }, "sha512-9yO9WdgxW8jZ7SbzUycH710z+JmsQ9W9n5S6i6eghYju32kkluFmgBeS47r8e8p2+Dv4DemS7o/3SUGsX9FR5Q=="], 1438 + 1439 + "@atcute/lex-cli/prettier": ["prettier@3.8.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg=="], 1405 1440 1406 1441 "@atcute/multibase/@atcute/uint8array": ["@atcute/uint8array@1.0.6", "", {}, "sha512-ucfRBQc7BFT8n9eCyGOzDHEMKF/nZwhS2pPao4Xtab1ML3HdFYcX2DM1tadCzas85QTGxHe5urnUAAcNKGRi9A=="], 1407 1442
+7
lex.config.ts
··· 1 + import { defineLexiconConfig } from '@atcute/lex-cli' 2 + 3 + export default defineLexiconConfig({ 4 + files: ['./lexicons/**/*.json'], 5 + outdir: './src/lex/', 6 + imports: ['@atcute/atproto'], 7 + })
+36
lexicons/host/plural/front/annotation.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "host.plural.front.annotation", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "Mutable sidecar annotation for a front log entry. Uses TID as rkey. Always encrypted for privacy.", 8 + "key": "tid", 9 + "record": { 10 + "type": "object", 11 + "properties": { 12 + "subject": { 13 + "type": "ref", 14 + "ref": "com.atproto.repo.strongRef", 15 + "description": "Reference to the front log entry being annotated." 16 + }, 17 + "note": { 18 + "type": "bytes", 19 + "description": "Encrypted note content (always encrypted for privacy)." 20 + }, 21 + "createdAt": { 22 + "type": "string", 23 + "format": "datetime", 24 + "description": "When the annotation was created (ISO 8601)." 25 + }, 26 + "updatedAt": { 27 + "type": "string", 28 + "format": "datetime", 29 + "description": "When the annotation was last updated (ISO 8601)." 30 + } 31 + }, 32 + "required": ["subject", "createdAt"] 33 + } 34 + } 35 + } 36 + }
+39
lexicons/host/plural/front/log.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "host.plural.front.log", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "Immutable front log entry. Uses CID (content hash) as rkey for cryptographic immutability. Always public. The most recent entry by startedAt is the current front status.", 8 + "key": "tid", 9 + "record": { 10 + "type": "object", 11 + "properties": { 12 + "fronters": { 13 + "type": "array", 14 + "items": { 15 + "type": "string" 16 + }, 17 + "description": "TIDs of members who were fronting." 18 + }, 19 + "status": { 20 + "type": "string", 21 + "maxLength": 500, 22 + "description": "Optional public status message." 23 + }, 24 + "startedAt": { 25 + "type": "string", 26 + "format": "datetime", 27 + "description": "When this front period started (ISO 8601)." 28 + }, 29 + "createdAt": { 30 + "type": "string", 31 + "format": "datetime", 32 + "description": "When this record was created (ISO 8601)." 33 + } 34 + }, 35 + "required": ["startedAt", "createdAt"] 36 + } 37 + } 38 + } 39 + }
+40
lexicons/host/plural/system/key.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "host.plural.system.key", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "Encrypted master key for client-side encryption. Singleton record (rkey: 'self').", 8 + "key": "literal:self", 9 + "record": { 10 + "type": "object", 11 + "properties": { 12 + "encryptedKey": { 13 + "type": "bytes", 14 + "description": "Encrypted master key." 15 + }, 16 + "salt": { 17 + "type": "bytes", 18 + "description": "Salt used for key derivation." 19 + }, 20 + "algorithm": { 21 + "type": "string", 22 + "knownValues": ["argon2id-aes256gcm"], 23 + "description": "Algorithm identifier." 24 + }, 25 + "createdAt": { 26 + "type": "string", 27 + "format": "datetime", 28 + "description": "When the key was created (ISO 8601)." 29 + }, 30 + "updatedAt": { 31 + "type": "string", 32 + "format": "datetime", 33 + "description": "When the key was last updated (ISO 8601)." 34 + } 35 + }, 36 + "required": ["encryptedKey", "salt", "algorithm", "createdAt"] 37 + } 38 + } 39 + } 40 + }
+32
lexicons/host/plural/system/link.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "host.plural.system.link", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "Declares that a secondary DID is linked to this system. Both this record and a corresponding host.plural.system.reference on the secondary DID must exist for the link to be valid.", 8 + "key": "tid", 9 + "record": { 10 + "type": "object", 11 + "required": ["did", "createdAt"], 12 + "properties": { 13 + "did": { 14 + "type": "string", 15 + "maxLength": 2048, 16 + "description": "The secondary DID being linked to this system." 17 + }, 18 + "memberTid": { 19 + "type": "string", 20 + "maxLength": 50, 21 + "description": "Optional TID of the member this DID belongs to." 22 + }, 23 + "createdAt": { 24 + "type": "string", 25 + "format": "datetime", 26 + "description": "When this link was created (ISO 8601)." 27 + } 28 + } 29 + } 30 + } 31 + } 32 + }
+125
lexicons/host/plural/system/member.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "host.plural.system.member", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "A system member. Uses TID as rkey. Can be public (plaintext) or private (encrypted).", 8 + "key": "tid", 9 + "record": { 10 + "type": "object", 11 + "properties": { 12 + "visibility": { 13 + "type": "string", 14 + "knownValues": ["public", "private"], 15 + "description": "Visibility setting. Private members store data in ciphertext only." 16 + }, 17 + "name": { 18 + "type": "string", 19 + "maxLength": 200, 20 + "description": "Member name/identifier. Only present for public members." 21 + }, 22 + "displayName": { 23 + "type": "string", 24 + "maxLength": 640, 25 + "description": "Display name. Only present for public members." 26 + }, 27 + "pronouns": { 28 + "type": "string", 29 + "maxLength": 100, 30 + "description": "Member pronouns. Only present for public members." 31 + }, 32 + "avatar": { 33 + "type": "blob", 34 + "accept": [ 35 + "image/png", 36 + "image/jpeg", 37 + "image/webp", 38 + "image/gif", 39 + "application/octet-stream" 40 + ], 41 + "maxSize": 1000000, 42 + "description": "Avatar image blob (plaintext for public, encrypted for private)." 43 + }, 44 + "bio": { 45 + "type": "string", 46 + "maxLength": 2560, 47 + "description": "Member bio/description. Only present for public members." 48 + }, 49 + "colour": { 50 + "type": "string", 51 + "maxLength": 7, 52 + "description": "Member colour (hex format). Only present for public members." 53 + }, 54 + "proxyTags": { 55 + "type": "array", 56 + "maxLength": 10, 57 + "items": { 58 + "type": "ref", 59 + "ref": "#proxyTag" 60 + }, 61 + "description": "Proxy tags for message proxying. Only present for public members." 62 + }, 63 + "customFields": { 64 + "type": "array", 65 + "maxLength": 25, 66 + "items": { 67 + "type": "ref", 68 + "ref": "#customField" 69 + }, 70 + "description": "Custom profile fields. Only present for public members." 71 + }, 72 + "did": { 73 + "type": "string", 74 + "maxLength": 2048, 75 + "description": "Optional DID associated with this member. Must match a host.plural.system.link record for the link to be valid. Only set on public members." 76 + }, 77 + "ciphertext": { 78 + "type": "bytes", 79 + "description": "Encrypted member data (IV + AES-256-GCM ciphertext). Only present for private members." 80 + }, 81 + "createdAt": { 82 + "type": "string", 83 + "format": "datetime", 84 + "description": "When the member was created (ISO 8601)." 85 + }, 86 + "updatedAt": { 87 + "type": "string", 88 + "format": "datetime", 89 + "description": "When the member was last updated (ISO 8601)." 90 + } 91 + }, 92 + "required": ["visibility", "createdAt"] 93 + } 94 + }, 95 + "proxyTag": { 96 + "type": "object", 97 + "description": "Proxy tag for message proxying. At least one of prefix or suffix should be defined.", 98 + "properties": { 99 + "prefix": { 100 + "type": "string", 101 + "maxLength": 50 102 + }, 103 + "suffix": { 104 + "type": "string", 105 + "maxLength": 50 106 + } 107 + } 108 + }, 109 + "customField": { 110 + "type": "object", 111 + "description": "Custom field on a member profile.", 112 + "properties": { 113 + "name": { 114 + "type": "string", 115 + "maxLength": 100 116 + }, 117 + "value": { 118 + "type": "string", 119 + "maxLength": 500 120 + } 121 + }, 122 + "required": ["name", "value"] 123 + } 124 + } 125 + }
+48
lexicons/host/plural/system/profile.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "host.plural.system.profile", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "System profile. Singleton record (rkey: 'self'). Always public.", 8 + "key": "literal:self", 9 + "record": { 10 + "type": "object", 11 + "properties": { 12 + "displayName": { 13 + "type": "string", 14 + "maxLength": 640, 15 + "description": "Display name for the system." 16 + }, 17 + "description": { 18 + "type": "string", 19 + "maxLength": 2560, 20 + "description": "System description/bio." 21 + }, 22 + "avatar": { 23 + "type": "blob", 24 + "accept": ["image/png", "image/jpeg", "image/webp", "image/gif"], 25 + "maxSize": 1000000, 26 + "description": "Avatar image blob." 27 + }, 28 + "colour": { 29 + "type": "string", 30 + "maxLength": 7, 31 + "description": "System colour (hex format, e.g. '#ff6b6b')." 32 + }, 33 + "pronouns": { 34 + "type": "string", 35 + "maxLength": 100, 36 + "description": "System pronouns." 37 + }, 38 + "createdAt": { 39 + "type": "string", 40 + "format": "datetime", 41 + "description": "When the record was created (ISO 8601)." 42 + } 43 + }, 44 + "required": ["createdAt"] 45 + } 46 + } 47 + } 48 + }
+27
lexicons/host/plural/system/reference.json
··· 1 + { 2 + "lexicon": 1, 3 + "id": "host.plural.system.reference", 4 + "defs": { 5 + "main": { 6 + "type": "record", 7 + "description": "Points back to the primary DID where this system's data lives. Singleton record (rkey: 'self'). Both this record and a corresponding host.plural.system.link on the primary DID must exist for the link to be valid.", 8 + "key": "literal:self", 9 + "record": { 10 + "type": "object", 11 + "required": ["primaryDid", "createdAt"], 12 + "properties": { 13 + "primaryDid": { 14 + "type": "string", 15 + "maxLength": 2048, 16 + "description": "The primary DID where this system's data lives." 17 + }, 18 + "createdAt": { 19 + "type": "string", 20 + "format": "datetime", 21 + "description": "When this reference was created (ISO 8601)." 22 + } 23 + } 24 + } 25 + } 26 + } 27 + }
+1
package.json
··· 41 41 "vue": "^3.5.28" 42 42 }, 43 43 "devDependencies": { 44 + "@atcute/lex-cli": "^2.5.3", 44 45 "@capacitor/cli": "^8.1.0", 45 46 "@prettier/plugin-oxc": "^0.0.5", 46 47 "@tsconfig/node24": "^24.0.4",
+7
src/lex/index.ts
··· 1 + export * as HostPluralFrontAnnotation from './types/host/plural/front/annotation.js' 2 + export * as HostPluralFrontLog from './types/host/plural/front/log.js' 3 + export * as HostPluralSystemKey from './types/host/plural/system/key.js' 4 + export * as HostPluralSystemLink from './types/host/plural/system/link.js' 5 + export * as HostPluralSystemMember from './types/host/plural/system/member.js' 6 + export * as HostPluralSystemProfile from './types/host/plural/system/profile.js' 7 + export * as HostPluralSystemReference from './types/host/plural/system/reference.js'
+43
src/lex/types/host/plural/front/annotation.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + import * as ComAtprotoRepoStrongRef from "@atcute/atproto/types/repo/strongRef"; 5 + 6 + const _mainSchema = /*#__PURE__*/ v.record( 7 + /*#__PURE__*/ v.tidString(), 8 + /*#__PURE__*/ v.object({ 9 + $type: /*#__PURE__*/ v.literal("host.plural.front.annotation"), 10 + /** 11 + * When the annotation was created (ISO 8601). 12 + */ 13 + createdAt: /*#__PURE__*/ v.datetimeString(), 14 + /** 15 + * Encrypted note content (always encrypted for privacy). 16 + */ 17 + note: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.bytes()), 18 + /** 19 + * Reference to the front log entry being annotated. 20 + */ 21 + get subject() { 22 + return ComAtprotoRepoStrongRef.mainSchema; 23 + }, 24 + /** 25 + * When the annotation was last updated (ISO 8601). 26 + */ 27 + updatedAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 28 + }), 29 + ); 30 + 31 + type main$schematype = typeof _mainSchema; 32 + 33 + export interface mainSchema extends main$schematype {} 34 + 35 + export const mainSchema = _mainSchema as mainSchema; 36 + 37 + export interface Main extends v.InferInput<typeof mainSchema> {} 38 + 39 + declare module "@atcute/lexicons/ambient" { 40 + interface Records { 41 + "host.plural.front.annotation": mainSchema; 42 + } 43 + }
+47
src/lex/types/host/plural/front/log.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + 5 + const _mainSchema = /*#__PURE__*/ v.record( 6 + /*#__PURE__*/ v.tidString(), 7 + /*#__PURE__*/ v.object({ 8 + $type: /*#__PURE__*/ v.literal("host.plural.front.log"), 9 + /** 10 + * When this record was created (ISO 8601). 11 + */ 12 + createdAt: /*#__PURE__*/ v.datetimeString(), 13 + /** 14 + * TIDs of members who were fronting. 15 + */ 16 + fronters: /*#__PURE__*/ v.optional( 17 + /*#__PURE__*/ v.array(/*#__PURE__*/ v.string()), 18 + ), 19 + /** 20 + * When this front period started (ISO 8601). 21 + */ 22 + startedAt: /*#__PURE__*/ v.datetimeString(), 23 + /** 24 + * Optional public status message. 25 + * @maxLength 500 26 + */ 27 + status: /*#__PURE__*/ v.optional( 28 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 29 + /*#__PURE__*/ v.stringLength(0, 500), 30 + ]), 31 + ), 32 + }), 33 + ); 34 + 35 + type main$schematype = typeof _mainSchema; 36 + 37 + export interface mainSchema extends main$schematype {} 38 + 39 + export const mainSchema = _mainSchema as mainSchema; 40 + 41 + export interface Main extends v.InferInput<typeof mainSchema> {} 42 + 43 + declare module "@atcute/lexicons/ambient" { 44 + interface Records { 45 + "host.plural.front.log": mainSchema; 46 + } 47 + }
+44
src/lex/types/host/plural/system/key.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + 5 + const _mainSchema = /*#__PURE__*/ v.record( 6 + /*#__PURE__*/ v.literal("self"), 7 + /*#__PURE__*/ v.object({ 8 + $type: /*#__PURE__*/ v.literal("host.plural.system.key"), 9 + /** 10 + * Algorithm identifier. 11 + */ 12 + algorithm: /*#__PURE__*/ v.string<"argon2id-aes256gcm" | (string & {})>(), 13 + /** 14 + * When the key was created (ISO 8601). 15 + */ 16 + createdAt: /*#__PURE__*/ v.datetimeString(), 17 + /** 18 + * Encrypted master key. 19 + */ 20 + encryptedKey: /*#__PURE__*/ v.bytes(), 21 + /** 22 + * Salt used for key derivation. 23 + */ 24 + salt: /*#__PURE__*/ v.bytes(), 25 + /** 26 + * When the key was last updated (ISO 8601). 27 + */ 28 + updatedAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 29 + }), 30 + ); 31 + 32 + type main$schematype = typeof _mainSchema; 33 + 34 + export interface mainSchema extends main$schematype {} 35 + 36 + export const mainSchema = _mainSchema as mainSchema; 37 + 38 + export interface Main extends v.InferInput<typeof mainSchema> {} 39 + 40 + declare module "@atcute/lexicons/ambient" { 41 + interface Records { 42 + "host.plural.system.key": mainSchema; 43 + } 44 + }
+44
src/lex/types/host/plural/system/link.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + 5 + const _mainSchema = /*#__PURE__*/ v.record( 6 + /*#__PURE__*/ v.tidString(), 7 + /*#__PURE__*/ v.object({ 8 + $type: /*#__PURE__*/ v.literal("host.plural.system.link"), 9 + /** 10 + * When this link was created (ISO 8601). 11 + */ 12 + createdAt: /*#__PURE__*/ v.datetimeString(), 13 + /** 14 + * The secondary DID being linked to this system. 15 + * @maxLength 2048 16 + */ 17 + did: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 18 + /*#__PURE__*/ v.stringLength(0, 2048), 19 + ]), 20 + /** 21 + * Optional TID of the member this DID belongs to. 22 + * @maxLength 50 23 + */ 24 + memberTid: /*#__PURE__*/ v.optional( 25 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 26 + /*#__PURE__*/ v.stringLength(0, 50), 27 + ]), 28 + ), 29 + }), 30 + ); 31 + 32 + type main$schematype = typeof _mainSchema; 33 + 34 + export interface mainSchema extends main$schematype {} 35 + 36 + export const mainSchema = _mainSchema as mainSchema; 37 + 38 + export interface Main extends v.InferInput<typeof mainSchema> {} 39 + 40 + declare module "@atcute/lexicons/ambient" { 41 + interface Records { 42 + "host.plural.system.link": mainSchema; 43 + } 44 + }
+168
src/lex/types/host/plural/system/member.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + 5 + const _customFieldSchema = /*#__PURE__*/ v.object({ 6 + $type: /*#__PURE__*/ v.optional( 7 + /*#__PURE__*/ v.literal("host.plural.system.member#customField"), 8 + ), 9 + /** 10 + * @maxLength 100 11 + */ 12 + name: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 13 + /*#__PURE__*/ v.stringLength(0, 100), 14 + ]), 15 + /** 16 + * @maxLength 500 17 + */ 18 + value: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 19 + /*#__PURE__*/ v.stringLength(0, 500), 20 + ]), 21 + }); 22 + const _mainSchema = /*#__PURE__*/ v.record( 23 + /*#__PURE__*/ v.tidString(), 24 + /*#__PURE__*/ v.object({ 25 + $type: /*#__PURE__*/ v.literal("host.plural.system.member"), 26 + /** 27 + * Avatar image blob (plaintext for public, encrypted for private). 28 + * @accept image/png, image/jpeg, image/webp, image/gif, application/octet-stream 29 + * @maxSize 1000000 30 + */ 31 + avatar: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.blob()), 32 + /** 33 + * Member bio/description. Only present for public members. 34 + * @maxLength 2560 35 + */ 36 + bio: /*#__PURE__*/ v.optional( 37 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 38 + /*#__PURE__*/ v.stringLength(0, 2560), 39 + ]), 40 + ), 41 + /** 42 + * Encrypted member data (IV + AES-256-GCM ciphertext). Only present for private members. 43 + */ 44 + ciphertext: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.bytes()), 45 + /** 46 + * Member colour (hex format). Only present for public members. 47 + * @maxLength 7 48 + */ 49 + colour: /*#__PURE__*/ v.optional( 50 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 51 + /*#__PURE__*/ v.stringLength(0, 7), 52 + ]), 53 + ), 54 + /** 55 + * When the member was created (ISO 8601). 56 + */ 57 + createdAt: /*#__PURE__*/ v.datetimeString(), 58 + /** 59 + * Custom profile fields. Only present for public members. 60 + * @maxLength 25 61 + */ 62 + get customFields() { 63 + return /*#__PURE__*/ v.optional( 64 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.array(customFieldSchema), [ 65 + /*#__PURE__*/ v.arrayLength(0, 25), 66 + ]), 67 + ); 68 + }, 69 + /** 70 + * Optional DID associated with this member. Must match a host.plural.system.link record for the link to be valid. Only set on public members. 71 + * @maxLength 2048 72 + */ 73 + did: /*#__PURE__*/ v.optional( 74 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 75 + /*#__PURE__*/ v.stringLength(0, 2048), 76 + ]), 77 + ), 78 + /** 79 + * Display name. Only present for public members. 80 + * @maxLength 640 81 + */ 82 + displayName: /*#__PURE__*/ v.optional( 83 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 84 + /*#__PURE__*/ v.stringLength(0, 640), 85 + ]), 86 + ), 87 + /** 88 + * Member name/identifier. Only present for public members. 89 + * @maxLength 200 90 + */ 91 + name: /*#__PURE__*/ v.optional( 92 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 93 + /*#__PURE__*/ v.stringLength(0, 200), 94 + ]), 95 + ), 96 + /** 97 + * Member pronouns. Only present for public members. 98 + * @maxLength 100 99 + */ 100 + pronouns: /*#__PURE__*/ v.optional( 101 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 102 + /*#__PURE__*/ v.stringLength(0, 100), 103 + ]), 104 + ), 105 + /** 106 + * Proxy tags for message proxying. Only present for public members. 107 + * @maxLength 10 108 + */ 109 + get proxyTags() { 110 + return /*#__PURE__*/ v.optional( 111 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.array(proxyTagSchema), [ 112 + /*#__PURE__*/ v.arrayLength(0, 10), 113 + ]), 114 + ); 115 + }, 116 + /** 117 + * When the member was last updated (ISO 8601). 118 + */ 119 + updatedAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), 120 + /** 121 + * Visibility setting. Private members store data in ciphertext only. 122 + */ 123 + visibility: /*#__PURE__*/ v.string<"private" | "public" | (string & {})>(), 124 + }), 125 + ); 126 + const _proxyTagSchema = /*#__PURE__*/ v.object({ 127 + $type: /*#__PURE__*/ v.optional( 128 + /*#__PURE__*/ v.literal("host.plural.system.member#proxyTag"), 129 + ), 130 + /** 131 + * @maxLength 50 132 + */ 133 + prefix: /*#__PURE__*/ v.optional( 134 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 135 + /*#__PURE__*/ v.stringLength(0, 50), 136 + ]), 137 + ), 138 + /** 139 + * @maxLength 50 140 + */ 141 + suffix: /*#__PURE__*/ v.optional( 142 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 143 + /*#__PURE__*/ v.stringLength(0, 50), 144 + ]), 145 + ), 146 + }); 147 + 148 + type customField$schematype = typeof _customFieldSchema; 149 + type main$schematype = typeof _mainSchema; 150 + type proxyTag$schematype = typeof _proxyTagSchema; 151 + 152 + export interface customFieldSchema extends customField$schematype {} 153 + export interface mainSchema extends main$schematype {} 154 + export interface proxyTagSchema extends proxyTag$schematype {} 155 + 156 + export const customFieldSchema = _customFieldSchema as customFieldSchema; 157 + export const mainSchema = _mainSchema as mainSchema; 158 + export const proxyTagSchema = _proxyTagSchema as proxyTagSchema; 159 + 160 + export interface CustomField extends v.InferInput<typeof customFieldSchema> {} 161 + export interface Main extends v.InferInput<typeof mainSchema> {} 162 + export interface ProxyTag extends v.InferInput<typeof proxyTagSchema> {} 163 + 164 + declare module "@atcute/lexicons/ambient" { 165 + interface Records { 166 + "host.plural.system.member": mainSchema; 167 + } 168 + }
+70
src/lex/types/host/plural/system/profile.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + 5 + const _mainSchema = /*#__PURE__*/ v.record( 6 + /*#__PURE__*/ v.literal("self"), 7 + /*#__PURE__*/ v.object({ 8 + $type: /*#__PURE__*/ v.literal("host.plural.system.profile"), 9 + /** 10 + * Avatar image blob. 11 + * @accept image/png, image/jpeg, image/webp, image/gif 12 + * @maxSize 1000000 13 + */ 14 + avatar: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.blob()), 15 + /** 16 + * System colour (hex format, e.g. '#ff6b6b'). 17 + * @maxLength 7 18 + */ 19 + colour: /*#__PURE__*/ v.optional( 20 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 21 + /*#__PURE__*/ v.stringLength(0, 7), 22 + ]), 23 + ), 24 + /** 25 + * When the record was created (ISO 8601). 26 + */ 27 + createdAt: /*#__PURE__*/ v.datetimeString(), 28 + /** 29 + * System description/bio. 30 + * @maxLength 2560 31 + */ 32 + description: /*#__PURE__*/ v.optional( 33 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 34 + /*#__PURE__*/ v.stringLength(0, 2560), 35 + ]), 36 + ), 37 + /** 38 + * Display name for the system. 39 + * @maxLength 640 40 + */ 41 + displayName: /*#__PURE__*/ v.optional( 42 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 43 + /*#__PURE__*/ v.stringLength(0, 640), 44 + ]), 45 + ), 46 + /** 47 + * System pronouns. 48 + * @maxLength 100 49 + */ 50 + pronouns: /*#__PURE__*/ v.optional( 51 + /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 52 + /*#__PURE__*/ v.stringLength(0, 100), 53 + ]), 54 + ), 55 + }), 56 + ); 57 + 58 + type main$schematype = typeof _mainSchema; 59 + 60 + export interface mainSchema extends main$schematype {} 61 + 62 + export const mainSchema = _mainSchema as mainSchema; 63 + 64 + export interface Main extends v.InferInput<typeof mainSchema> {} 65 + 66 + declare module "@atcute/lexicons/ambient" { 67 + interface Records { 68 + "host.plural.system.profile": mainSchema; 69 + } 70 + }
+35
src/lex/types/host/plural/system/reference.ts
··· 1 + import type {} from "@atcute/lexicons"; 2 + import * as v from "@atcute/lexicons/validations"; 3 + import type {} from "@atcute/lexicons/ambient"; 4 + 5 + const _mainSchema = /*#__PURE__*/ v.record( 6 + /*#__PURE__*/ v.literal("self"), 7 + /*#__PURE__*/ v.object({ 8 + $type: /*#__PURE__*/ v.literal("host.plural.system.reference"), 9 + /** 10 + * When this reference was created (ISO 8601). 11 + */ 12 + createdAt: /*#__PURE__*/ v.datetimeString(), 13 + /** 14 + * The primary DID where this system's data lives. 15 + * @maxLength 2048 16 + */ 17 + primaryDid: /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.string(), [ 18 + /*#__PURE__*/ v.stringLength(0, 2048), 19 + ]), 20 + }), 21 + ); 22 + 23 + type main$schematype = typeof _mainSchema; 24 + 25 + export interface mainSchema extends main$schematype {} 26 + 27 + export const mainSchema = _mainSchema as mainSchema; 28 + 29 + export interface Main extends v.InferInput<typeof mainSchema> {} 30 + 31 + declare module "@atcute/lexicons/ambient" { 32 + interface Records { 33 + "host.plural.system.reference": mainSchema; 34 + } 35 + }