diff --git a/.gitignore b/.gitignore index 5923e07..030d2ff 100644 --- a/.gitignore +++ b/.gitignore @@ -53,3 +53,5 @@ dcider.db # Python __pycache__ +pyrightconfig.json +schema/schema-generated.graphql diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..9f56173 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "deps/atproto"] + path = deps/atproto + url = https://github.com/bluesky-social/atproto.git diff --git a/.rules b/.rules new file mode 100644 index 0000000..1e8f7ed --- /dev/null +++ b/.rules @@ -0,0 +1,33 @@ +# ATProto <=> GraphQL Bridge Rules + +## General +- This project bridges ATProto (server-side) and GraphQL (client-side) for efficient UI development in the ATmosphere. +- Familiarize yourself with both ATProto (Lexicon) and GraphQL concepts. + +## Schema Generation +- Use `schema/generate_lexicon_schema.py` to generate GraphQL schemas from Lexicon definitions. +- Initialize standard ATProto definitions in `deps/atproto`. +- Example: `pipenv run python schema/generate_lexicon_schema.py app.bsky.actor.getProfile com.atproto.server.getSession -o schema/schema-generated.graphql` +- Generated schemas include recursive type references (e.g., `Lexicon_app_bsky_actor_defs_profileViewDetailed`). + +## Server Development +- The Rust-based GraphQL server serves as a reference implementation. +- API endpoint: `/graphql` +- Interactive interface: GraphiQL (for development) +- Build with: `cd server && cargo run --release` +- Default host: `0.0.0.0`, port: `8080` +- Configure via `.env` (copy from `.env.example`) + +## Development Workflow +1. Initialize submodules: `git submodule update --init --recursive` +2. Install dependencies: `pipenv install` +3. Generate schemas as needed +4. Develop server features + +## Best Practices +- Maintain clear separation between ATProto (server) and GraphQL (client) concerns. +- Document schema generation steps for new procedures. +- Keep server configuration environment-aware. + +## License +MIT - Follow open-source best practices. \ No newline at end of file diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..eb6d541 --- /dev/null +++ b/Pipfile @@ -0,0 +1,13 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +atproto = "==0.0.65" +typer = "==0.21.1" + +[dev-packages] + +[requires] +python_version = "3.14" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000..82b1fa6 --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,633 @@ +{ + "_meta": { + "hash": { + "sha256": "204ebf487e17d6ae381b0885d39cd6c68300389f052f09031e610ca4163b2b07" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.14" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "annotated-types": { + "hashes": [ + "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", + "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89" + ], + "markers": "python_version >= '3.8'", + "version": "==0.7.0" + }, + "anyio": { + "hashes": [ + "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708", + "sha256:334b70e641fd2221c1505b3890c69882fe4a2df910cba14d97019b90b24439dc" + ], + "markers": "python_version >= '3.10'", + "version": "==4.13.0" + }, + "atproto": { + "hashes": [ + "sha256:027c6ed98746a9e6f1bb24bc18db84b80b386037709ff3af9ef927dce3dd4938", + "sha256:ea53dea57454c9e56318b5d25ceb35854d60ba238b38b0e5ca79aa1a2df85846" + ], + "index": "pypi", + "markers": "python_version < '3.15' and python_version >= '3.9'", + "version": "==0.0.65" + }, + "certifi": { + "hashes": [ + "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", + "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7" + ], + "markers": "python_version >= '3.7'", + "version": "==2026.2.25" + }, + "cffi": { + "hashes": [ + "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", + "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", + "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", + "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", + "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44", + "sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2", + "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", + "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", + "sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65", + "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", + "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a", + "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", + "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", + "sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a", + "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", + "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", + "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", + "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", + "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", + "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", + "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", + "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", + "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", + "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb", + "sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165", + "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", + "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", + "sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c", + "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", + "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c", + "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0", + "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", + "sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63", + "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", + "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", + "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", + "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", + "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", + "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", + "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", + "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", + "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", + "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", + "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", + "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", + "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", + "sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322", + "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb", + "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", + "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", + "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4", + "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", + "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", + "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", + "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", + "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", + "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739", + "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", + "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", + "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", + "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9", + "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", + "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", + "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", + "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", + "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", + "sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f", + "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495", + "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", + "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", + "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", + "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", + "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", + "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", + "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", + "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", + "sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7", + "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5", + "sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534", + "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49", + "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", + "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", + "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", + "sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf" + ], + "markers": "python_version >= '3.9'", + "version": "==2.0.0" + }, + "click": { + "hashes": [ + "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", + "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6" + ], + "markers": "python_version >= '3.10'", + "version": "==8.3.1" + }, + "cryptography": { + "hashes": [ + "sha256:02fad249cb0e090b574e30b276a3da6a149e04ee2f049725b1f69e7b8351ec70", + "sha256:063b67749f338ca9c5a0b7fe438a52c25f9526b851e24e6c9310e7195aad3b4d", + "sha256:12cae594e9473bca1a7aceb90536060643128bb274fcea0fc459ab90f7d1ae7a", + "sha256:12f0fa16cc247b13c43d56d7b35287ff1569b5b1f4c5e87e92cc4fcc00cd10c0", + "sha256:22259338084d6ae497a19bae5d4c66b7ca1387d3264d1c2c0e72d9e9b6a77b97", + "sha256:26031f1e5ca62fcb9d1fcb34b2b60b390d1aacaa15dc8b895a9ed00968b97b30", + "sha256:27550628a518c5c6c903d84f637fbecf287f6cb9ced3804838a1295dc1fd0759", + "sha256:2b417edbe8877cda9022dde3a008e2deb50be9c407eef034aeeb3a8b11d9db3c", + "sha256:2ea0f37e9a9cf0df2952893ad145fd9627d326a59daec9b0802480fa3bcd2ead", + "sha256:2ef9e69886cbb137c2aef9772c2e7138dc581fad4fcbcf13cc181eb5a3ab6275", + "sha256:341359d6c9e68834e204ceaf25936dffeafea3829ab80e9503860dcc4f4dac58", + "sha256:380343e0653b1c9d7e1f55b52aaa2dbb2fdf2730088d48c43ca1c7c0abb7cc2f", + "sha256:3c21d92ed15e9cfc6eb64c1f5a0326db22ca9c2566ca46d845119b45b4400361", + "sha256:3dfa6567f2e9e4c5dceb8ccb5a708158a2a871052fa75c8b78cb0977063f1507", + "sha256:456b3215172aeefb9284550b162801d62f5f264a081049a3e94307fe20792cfa", + "sha256:4668298aef7cddeaf5c6ecc244c2302a2b8e40f384255505c22875eebb47888b", + "sha256:50575a76e2951fe7dbd1f56d181f8c5ceeeb075e9ff88e7ad997d2f42af06e7b", + "sha256:639301950939d844a9e1c4464d7e07f902fe9a7f6b215bb0d4f28584729935d8", + "sha256:64235194bad039a10bb6d2d930ab3323baaec67e2ce36215fd0952fad0930ca8", + "sha256:6617f67b1606dfd9fe4dbfa354a9508d4a6d37afe30306fe6c101b7ce3274b72", + "sha256:67177e8a9f421aa2d3a170c3e56eca4e0128883cf52a071a7cbf53297f18b175", + "sha256:6728c49e3b2c180ef26f8e9f0a883a2c585638db64cf265b49c9ba10652d430e", + "sha256:6739d56300662c468fddb0e5e291f9b4d084bead381667b9e654c7dd81705124", + "sha256:69cf0056d6947edc6e6760e5f17afe4bea06b56a9ac8a06de9d2bd6b532d4f3a", + "sha256:760997a4b950ff00d418398ad73fbc91aa2894b5c1db7ccb45b4f68b42a63b3c", + "sha256:79e865c642cfc5c0b3eb12af83c35c5aeff4fa5c672dc28c43721c2c9fdd2f0f", + "sha256:7e6142674f2a9291463e5e150090b95a8519b2fb6e6aaec8917dd8d094ce750d", + "sha256:7f417f034f91dcec1cb6c5c35b07cdbb2ef262557f701b4ecd803ee8cefed4f4", + "sha256:7f6690b6c55e9c5332c0b59b9c8a3fb232ebf059094c17f9019a51e9827df91c", + "sha256:8927ccfbe967c7df312ade694f987e7e9e22b2425976ddbf28271d7e58845290", + "sha256:8ce35b77aaf02f3b59c90b2c8a05c73bac12cea5b4e8f3fbece1f5fddea5f0ca", + "sha256:8e7304c4f4e9490e11efe56af6713983460ee0780f16c63f219984dab3af9d2d", + "sha256:90e5f0a7b3be5f40c3a0a0eafb32c681d8d2c181fc2a1bdabe9b3f611d9f6b1a", + "sha256:97c8115b27e19e592a05c45d0dd89c57f81f841cc9880e353e0d3bf25b2139ed", + "sha256:9a693028b9cbe51b5a1136232ee8f2bc242e4e19d456ded3fa7c86e43c713b4a", + "sha256:9a9c42a2723999a710445bc0d974e345c32adfd8d2fac6d8a251fa829ad31cfb", + "sha256:a3e84d5ec9ba01f8fd03802b2147ba77f0c8f2617b2aff254cedd551844209c8", + "sha256:aad75154a7ac9039936d50cf431719a2f8d4ed3d3c277ac03f3339ded1a5e707", + "sha256:b12c6b1e1651e42ab5de8b1e00dc3b6354fdfd778e7fa60541ddacc27cd21410", + "sha256:b928a3ca837c77a10e81a814a693f2295200adb3352395fad024559b7be7a736", + "sha256:bcb87663e1f7b075e48c3be3ecb5f0b46c8fc50b50a97cf264e7f60242dca3f2", + "sha256:c797e2517cb7880f8297e2c0f43bb910e91381339336f75d2c1c2cbf811b70b4", + "sha256:c89eb37fae9216985d8734c1afd172ba4927f5a05cfd9bf0e4863c6d5465b013", + "sha256:cdcd3edcbc5d55757e5f5f3d330dd00007ae463a7e7aa5bf132d1f22a4b62b19", + "sha256:d24c13369e856b94892a89ddf70b332e0b70ad4a5c43cf3e9cb71d6d7ffa1f7b", + "sha256:d4e4aadb7fc1f88687f47ca20bb7227981b03afaae69287029da08096853b738", + "sha256:d9528b535a6c4f8ff37847144b8986a9a143585f0540fbcb1a98115b543aa463", + "sha256:ed3775295fb91f70b4027aeba878d79b3e55c0b3e97eaa4de71f8f23a9f2eb77", + "sha256:ed418c37d095aeddf5336898a132fba01091f0ac5844e3e8018506f014b6d2c4" + ], + "markers": "python_version >= '3.8' and python_full_version not in '3.9.0, 3.9.1'", + "version": "==46.0.6" + }, + "dnspython": { + "hashes": [ + "sha256:01d9bbc4a2d76bf0db7c1f729812ded6d912bd318d3b1cf81d30c0f845dbf3af", + "sha256:181d3c6996452cb1189c4046c61599b84a5a86e099562ffde77d26984ff26d0f" + ], + "markers": "python_version >= '3.10'", + "version": "==2.8.0" + }, + "h11": { + "hashes": [ + "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", + "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86" + ], + "markers": "python_version >= '3.8'", + "version": "==0.16.0" + }, + "httpcore": { + "hashes": [ + "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", + "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8" + ], + "markers": "python_version >= '3.8'", + "version": "==1.0.9" + }, + "httpx": { + "hashes": [ + "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", + "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad" + ], + "markers": "python_version >= '3.8'", + "version": "==0.28.1" + }, + "idna": { + "hashes": [ + "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", + "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902" + ], + "markers": "python_version >= '3.8'", + "version": "==3.11" + }, + "libipld": { + "hashes": [ + "sha256:02f00a19e6a557bfed2ce6911d541f96708d73ca457b709793885336adf91431", + "sha256:047d95641c95360adb6627447d6cbc048fcd9768f4a827078842d7d99cb79b77", + "sha256:06f766cec75f3d78339caa3ce3c6977e290e1a97f37e5f4ba358da2e77340196", + "sha256:071de5acf902e9a21d761572755afc8403cbaadd4b8199e7504ad52ee45b6b5e", + "sha256:082321d5ba84d9bb4e9f2577278040db2b4f624b131402735ea7eca13febedec", + "sha256:08261503b7307c6d9acbd3b2a221da9294b457204dcefce446f627893abb077e", + "sha256:08c8aadfebf9db9a547bd14ab4e5d438ee3f0a003eb4554bbecedaebbaaa0bbe", + "sha256:0dc2db1485703f7c6cf4ff9da0fe7a7d4ee883f92a35d68197c2294a3c3efd17", + "sha256:0fae0158971bf97aa6662e5f9cb5f497c35d5196336047ca4a9ebc6492b1f582", + "sha256:13cb6c68ec55a8802704241210cca44e09eaf4c0e9bd6823e191e56f7f038f05", + "sha256:1767f287c4137521f6b2dfa30583030b128174515dc4ddc481598b570de72ca4", + "sha256:196a8fcd86ae0c8096cea85ff308edf315d77fbb677ef3dd9eff0be9da526499", + "sha256:1a7de390a3eb897d3194f6c96067c21338fbe6e0fc1145ab6b51af276aa7a08e", + "sha256:1d791227d505a3aab9f5bc0df9baafacae825f9fd4cd01f157252efe15536b10", + "sha256:1d7f564d13a6983a20baef873a7966df28aa27a86ccc574456b4ebc7d31fdd2d", + "sha256:249b74fcd3ae8bb6d0c9b3e0ec23a75db60f7b40f8b07ef378dfc9227c921ef5", + "sha256:2ac45e3aef416fe2eccbe84e562d81714416790bfd0756a1aa49ba895d4c7010", + "sha256:2e8608367317210baa57caa89b504db05c1623d8418e5a94276bcf36059cef65", + "sha256:3344f30d47dcab9cba41dd8f2243874af91939e38e3c31f20d586383ca74296e", + "sha256:36be4ce9cb417eedec253eda9f55b92f29a35cbfcb24d108b496c72934fea7a2", + "sha256:36fe9cd1b5a75a315cab30091579242d05df39692f773f7d8221250503753e3a", + "sha256:37ea7cb7afb94277e4e095bcc0ae888ed4b6e0fe8082c41dccd6e9487ccfd729", + "sha256:3aa8ae124db8fe724199e7fd16c2bd72dcdd2f10572be28dcacf0eb7613af026", + "sha256:3dbed6b1f2559c4ba8b898043a96c763a16063a1810cc1378cfdc92bcbdbb7e6", + "sha256:3f033e98c9e95e8448c97bbc904271908076974d790a895abade2ae89433715e", + "sha256:4140f030eb3cfff17d04b9481f13aaed0b2910d1371fe7489394120ed1d09ae5", + "sha256:435643314f8a11d207c5e25536d3f6876a3efa337886faea7e5116e1d8b67bc6", + "sha256:4402e21ac3b5c754e1562b448175d35113fb39d7bb938dfa4e095a9629ebb8dd", + "sha256:4443d047fd1a9679534a87a6ee35c3a10793d4453801281341bb1e8390087c69", + "sha256:4446cae7584a446b58de66942f89f155d95c2cbfb9ad215af359086824d4e3b9", + "sha256:44ca1ba44cb801686557e9544d248e013a2d5d1ab9fed796f090bb0d51d8f4ef", + "sha256:4596509ef4c2f00df2d0914e8efc632e4eb84bf837e57a8f53036dcf4d0d3169", + "sha256:499345f7ce4ec6da1d35c4bf5c9f8aab9324f5c9e508db3065073fec2d4e4bde", + "sha256:5393886a7e387751904681ecfa7e5912471b46043f044baa041a2b4772e4f839", + "sha256:57ec5b9ffc608a438f41f359996982291382365c4a593b1bce30bbec7a63771a", + "sha256:5947e99b40e923170094a3313c9f3629c6ed475465ba95eadce6cdcf08f1f65a", + "sha256:5a50cbf5b3b73164fbb88169573ed3e824024c12fbc5f9efd87fb5c8f236ccc1", + "sha256:5c9f6e91da0f7dcdd3276eefe3f31b2ec659ed279f5e595e6f44efa337a18b2b", + "sha256:5e3e9be4bdeb90dbc537a53f8d06e8b2c703f4b7868f9316958e1bbde526a143", + "sha256:5f0929edbbd283a203e0a74d1794ad171cf4f5fc11453bddc366615c4b97043c", + "sha256:627035693460bae559d2e7f46bc577a27504d6e38e8715fcf9a8d905f6b1c72d", + "sha256:634d176664cf295360712157b5c5a83539da2f4416f3e0491340064d49e74fd8", + "sha256:63bc6858d73c324e29d74155bdb339e14330a88bb1a8cc8fdc295048337dca09", + "sha256:67c2e2a6604fe8b5aa8960c31989dfb84275693ba411d5139cdb87b2855bf009", + "sha256:6979074fd5bfeeda75653df39875f566fefc5d9f3bb6e786742f55d7a7f9bf38", + "sha256:6c2817982506d1ccda516da7d6cc2662b58a363fc84a163bea297ff61b789106", + "sha256:6f09281bebc3c4d397a58606663ee915290702db0323366f9f1bd30b8b4a3fc1", + "sha256:717c4630c4b1ad81c6896291cd93bcaca4ddc3f66412d81459e2641a505ec04a", + "sha256:72b59693a1ac0962ef24c660e8d34dc25c41a1f1da1da54badb7442a498fc9a4", + "sha256:76731ebebd824fa45e51cc85506b108aa5da7322e43864909895f1779e9e4b41", + "sha256:7b8e7100bffbe579b7c92a3c6a8852ce333e0de171e696a2063e1e39ec9cc50a", + "sha256:7e85ccd9136110e63943d95232b193c893e369c406273d235160e5cc4b39c9ce", + "sha256:829772d79337fc330c9c129295309d27c86785b78d947e3561e45ccfe67c519d", + "sha256:847d6f481f8e8e10347479490db824cc568689e7bc1a9f5e5aa67235494dcdf6", + "sha256:8494fe4235b053883209aa9c6a5d128f18efde7d6d0eceb51d2dcb029dffbc33", + "sha256:88ac549eb6c56287785ad20d0e7785d3e8b153b6a322fd5d7edf0e7fda2b182e", + "sha256:8be484f1dc5525453e17f07f02202180c708213f2b6ea06d3b9247a5702e0229", + "sha256:8d7cd1e7e88b0fbc8f4aa267bdea2d10452c9dd0e1aafa82a5e0751427f222b0", + "sha256:8db7127528af6393c02da6317a9188fb05dd13feb7557ec5be320208402f6537", + "sha256:908630dc28b16a517cf323293f0843f481b0872649cba7d4cfdbc6eb258f5674", + "sha256:91b02da059a6ae7f783efa826f640ab1ca5eb5dd370bfd3f41071693a363c4fb", + "sha256:95a2c4f507c88c01a797ec97ce10603bea684c03208227703e007485dc631971", + "sha256:981f870427c6f2ece983825b439c18718e5aaf8121a1659624e896ee905ab18e", + "sha256:9a1d84c630961cff188deaa2129c86d69f5779c8d02046fbe0c629ef162bc3df", + "sha256:9cb4e0cd56d66c2b751eef7288aba919a8a73f320c8f8b7060d522fdffb3cd5b", + "sha256:a48bc2f7845825143a36f6a305680823a2816488593024803064d0803e3cee35", + "sha256:a81fbf42a8edf094c7f8ebd77eb14d8cc7c3d6b3b51d786d47ecb4c6763da2fe", + "sha256:ad07c8574d59088ed8bcec7cd21544a50f51a324290e77b0b042a0e4c1ed1b07", + "sha256:ad6f8fd51a4472a8c2ae8e5c2b3fb274ea29876b9284d86456a203e41793952c", + "sha256:b040dab7eb04b0ff730e68840f40eb225c9f14e73ad21238b76c7b8ded3ad99d", + "sha256:b155c02626b194439f4b519a53985aedc8637ae56cf640ea6acf6172a37465de", + "sha256:b3404a11e7e7803f7bc87a819e694e2568828c1f13a5f7fce74d3240d5a07aba", + "sha256:b3d16a2d3588244702ea671373de2984e20d44936c9d6d457570e4d8b33dddcf", + "sha256:b438d42efc857768db97f2a5ca8114b933e73b827d91344ec9dac6734687f060", + "sha256:b69f2accac94f2599e4c012d9b53fa786863156d9a9401000edf148af81e5be5", + "sha256:bf0c82b53b595cd91c3920081acd73b287c5aeb81e756e6b1a636a10e01eaaa3", + "sha256:bf7f553e13916b67572c8ae8ea1b3227d709dfc4d98699a0451027174dc3739a", + "sha256:c17ae8593e33bbb3c377974cd046be03453e0a317b5c723b9375fc00491ac5dd", + "sha256:c1f3ed8f70b215a294b5c6830e91af48acde96b3c8a6cae13304291f8240b939", + "sha256:c4a0538187b8a2dfc9507d83ff6e9de150802f81c67d22c043e4036653ca048e", + "sha256:c8957b49c946d4ddd70f37bfe289494fab9088529db452f1cfcce31501369917", + "sha256:ca53a59670b113be3b57910c3132d003fd4571f2c83f75bbfc758f5ff3288708", + "sha256:d1549bfab54a1f422ec48d3141c9ec643444d8e80135b2a6e8ec8e109df05ff3", + "sha256:d5cd74d2e17435869c21400cb587e788785bf7f565897c0e651f82e69bc0da27", + "sha256:d689891c00251c22439ccfa4a445cee77cfa68b9e703fdf7ffe7abe4de56da86", + "sha256:d6ed1bbdd5380a23ca84d4460c65f46d85f12ca860ef801212806ffe5ad497fa", + "sha256:d9433e7c0ee73f30bc6849363660f8e7fda97fae5e3f0cf261e54af86dfa681d", + "sha256:d9f8849acfb2e13d10aa4e8095c6eb65db7f431d3a38c60760de0f0abebcd58d", + "sha256:e35a8735b8a4bdd09b9edfbf1ae36e9ba9a804de50c99352c9a06aa3da109a62", + "sha256:e52f5111d7d06838993d7c35256cb3e19143239c602cda177273788b0cb5ffc5", + "sha256:e7627f371682160cae818f817eb846bc8c267a5daa028748a7c73103d8df00eb", + "sha256:edbfe93ae92609436471a83a80219e3ab07d79496d39ef161d4111eb47ea8184", + "sha256:f11e053f954fe8efc37ee1d71ff3c20844551d1b2468388612876ecac500ccc3", + "sha256:f46179c722baf74c627c01c0bf85be7fcbde66bbf7c5f8c1bbb57bd3a17b861b", + "sha256:f78507f2f458239e4e7fe2f984c59c5f5060f1ec401e8f38cd2b59fc85d7d8fb", + "sha256:fa67924c14b481f3f2c3d8a173d755955c2363d889ffc78dadb8d6abcaa7fe3c", + "sha256:fd0877ef4a1bd6e42ba52659769b5b766583c67b3cfb4e7143f9d10b81fb7a74" + ], + "markers": "python_version >= '3.8'", + "version": "==3.3.2" + }, + "markdown-it-py": { + "hashes": [ + "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", + "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3" + ], + "markers": "python_version >= '3.10'", + "version": "==4.0.0" + }, + "mdurl": { + "hashes": [ + "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", + "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba" + ], + "markers": "python_version >= '3.7'", + "version": "==0.1.2" + }, + "pycparser": { + "hashes": [ + "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", + "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992" + ], + "markers": "python_version >= '3.10'", + "version": "==3.0" + }, + "pydantic": { + "hashes": [ + "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", + "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d" + ], + "markers": "python_version >= '3.9'", + "version": "==2.12.5" + }, + "pydantic-core": { + "hashes": [ + "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90", + "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", + "sha256:0384e2e1021894b1ff5a786dbf94771e2986ebe2869533874d7e43bc79c6f504", + "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84", + "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", + "sha256:05a2c8852530ad2812cb7914dc61a1125dc4e06252ee98e5638a12da6cc6fb6c", + "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", + "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", + "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", + "sha256:100baa204bb412b74fe285fb0f3a385256dad1d1879f0a5cb1499ed2e83d132a", + "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", + "sha256:16f80f7abe3351f8ea6858914ddc8c77e02578544a0ebc15b4c2e1a0e813b0b2", + "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", + "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", + "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14", + "sha256:1f8d33a7f4d5a7889e60dc39856d76d09333d8a6ed0f5f1190635cbec70ec4ba", + "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375", + "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf", + "sha256:242a206cd0318f95cd21bdacff3fcc3aab23e79bba5cac3db5a841c9ef9c6963", + "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1", + "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", + "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553", + "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1", + "sha256:29452c56df2ed968d18d7e21f4ab0ac55e71dc59524872f6fc57dcf4a3249ed2", + "sha256:299e0a22e7ae2b85c1a57f104538b2656e8ab1873511fd718a1c1c6f149b77b5", + "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470", + "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2", + "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b", + "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660", + "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c", + "sha256:33cb885e759a705b426baada1fe68cbb0a2e68e34c5d0d0289a364cf01709093", + "sha256:346285d28e4c8017da95144c7f3acd42740d637ff41946af5ce6e5e420502dd5", + "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594", + "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", + "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", + "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a", + "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd", + "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284", + "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", + "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869", + "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", + "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f", + "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66", + "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51", + "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", + "sha256:5921a4d3ca3aee735d9fd163808f5e8dd6c6972101e4adbda9a4667908849b97", + "sha256:5a4e67afbc95fa5c34cf27d9089bca7fcab4e51e57278d710320a70b956d1b9a", + "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d", + "sha256:62de39db01b8d593e45871af2af9e497295db8d73b085f6bfd0b18c83c70a8f9", + "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c", + "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07", + "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36", + "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", + "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", + "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e", + "sha256:6f52298fbd394f9ed112d56f3d11aabd0d5bd27beb3084cc3d8ad069483b8941", + "sha256:707625ef0983fcfb461acfaf14de2067c5942c6bb0f3b4c99158bed6fedd3cf3", + "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612", + "sha256:753e230374206729bf0a807954bcc6c150d3743928a73faffee51ac6557a03c3", + "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", + "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe", + "sha256:77b63866ca88d804225eaa4af3e664c5faf3568cea95360d21f4725ab6e07146", + "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11", + "sha256:7b93a4d08587e2b7e7882de461e82b6ed76d9026ce91ca7915e740ecc7855f60", + "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", + "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", + "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", + "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a", + "sha256:873e0d5b4fb9b89ef7c2d2a963ea7d02879d9da0da8d9d4933dee8ee86a8b460", + "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1", + "sha256:8bfeaf8735be79f225f3fefab7f941c712aaca36f1128c9d7e2352ee1aa87bdf", + "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf", + "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", + "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2", + "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", + "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", + "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3", + "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6", + "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770", + "sha256:a75dafbf87d6276ddc5b2bf6fae5254e3d0876b626eb24969a574fff9149ee5d", + "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", + "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23", + "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26", + "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", + "sha256:b5819cd790dbf0c5eb9f82c73c16b39a65dd6dd4d1439dcdea7816ec9adddab8", + "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", + "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3", + "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", + "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034", + "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9", + "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", + "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", + "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b", + "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", + "sha256:c8d8b4eb992936023be7dee581270af5c6e0697a8559895f527f5b7105ecd36a", + "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e", + "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9", + "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", + "sha256:d3a978c4f57a597908b7e697229d996d77a6d3c94901e9edee593adada95ce1a", + "sha256:d5160812ea7a8a2ffbe233d8da666880cad0cbaf5d4de74ae15c313213d62556", + "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", + "sha256:df3959765b553b9440adfd3c795617c352154e497a4eaf3752555cfb5da8fc49", + "sha256:dfa8a0c812ac681395907e71e1274819dec685fec28273a28905df579ef137e2", + "sha256:e25c479382d26a2a41b7ebea1043564a937db462816ea07afa8a44c0866d52f9", + "sha256:e4f4a984405e91527a0d62649ee21138f8e3d0ef103be488c1dc11a80d7f184b", + "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", + "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb", + "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0", + "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8", + "sha256:e8465ab91a4bd96d36dde3263f06caa6a8a6019e4113f24dc753d79a8b3a3f82", + "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", + "sha256:ece5c59f0ce7d001e017643d8d24da587ea1f74f6993467d85ae8a5ef9d4f42b", + "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", + "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", + "sha256:f0cd744688278965817fd0839c4a4116add48d23890d468bc436f78beb28abf5", + "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f", + "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad", + "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b", + "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", + "sha256:f41eb9797986d6ebac5e8edff36d5cef9de40def462311b3eb3eeded1431e425", + "sha256:f547144f2966e1e16ae626d8ce72b4cfa0caedc7fa28052001c94fb2fcaa1c52" + ], + "markers": "python_version >= '3.9'", + "version": "==2.41.5" + }, + "pygments": { + "hashes": [ + "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", + "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b" + ], + "markers": "python_version >= '3.8'", + "version": "==2.19.2" + }, + "rich": { + "hashes": [ + "sha256:793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d", + "sha256:b8daa0b9e4eef54dd8cf7c86c03713f53241884e814f4e2f5fb342fe520f639b" + ], + "markers": "python_full_version >= '3.8.0'", + "version": "==14.3.3" + }, + "shellingham": { + "hashes": [ + "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", + "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de" + ], + "markers": "python_version >= '3.7'", + "version": "==1.5.4" + }, + "typer": { + "hashes": [ + "sha256:7985e89081c636b88d172c2ee0cfe33c253160994d47bdfdc302defd7d1f1d01", + "sha256:ea835607cd752343b6b2b7ce676893e5a0324082268b48f27aa058bdb7d2145d" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==0.21.1" + }, + "typing-extensions": { + "hashes": [ + "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", + "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548" + ], + "markers": "python_version >= '3.9'", + "version": "==4.15.0" + }, + "typing-inspection": { + "hashes": [ + "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", + "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464" + ], + "markers": "python_version >= '3.9'", + "version": "==0.4.2" + }, + "websockets": { + "hashes": [ + "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", + "sha256:0a34631031a8f05657e8e90903e656959234f3a04552259458aac0b0f9ae6fd9", + "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5", + "sha256:0c9e74d766f2818bb95f84c25be4dea09841ac0f734d1966f415e4edfc4ef1c3", + "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", + "sha256:0fdfe3e2a29e4db3659dbd5bbf04560cea53dd9610273917799f1cde46aa725e", + "sha256:1009ee0c7739c08a0cd59de430d6de452a55e42d6b522de7aa15e6f67db0b8e1", + "sha256:1234d4ef35db82f5446dca8e35a7da7964d02c127b095e172e54397fb6a6c256", + "sha256:16b6c1b3e57799b9d38427dda63edcbe4926352c47cf88588c0be4ace18dac85", + "sha256:2034693ad3097d5355bfdacfffcbd3ef5694f9718ab7f29c29689a9eae841880", + "sha256:21c1fa28a6a7e3cbdc171c694398b6df4744613ce9b36b1a498e816787e28123", + "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", + "sha256:27ccee0071a0e75d22cb35849b1db43f2ecd3e161041ac1ee9d2352ddf72f065", + "sha256:363c6f671b761efcb30608d24925a382497c12c506b51661883c3e22337265ed", + "sha256:39c1fec2c11dc8d89bba6b2bf1556af381611a173ac2b511cf7231622058af41", + "sha256:3b1ac0d3e594bf121308112697cf4b32be538fb1444468fb0a6ae4feebc83411", + "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", + "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", + "sha256:3d00075aa65772e7ce9e990cab3ff1de702aa09be3940d1dc88d5abf1ab8a09c", + "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", + "sha256:47819cea040f31d670cc8d324bb6435c6f133b8c7a19ec3d61634e62f8d8f9eb", + "sha256:47b099e1f4fbc95b701b6e85768e1fcdaf1630f3cbe4765fa216596f12310e2e", + "sha256:4a9fac8e469d04ce6c25bb2610dc535235bd4aa14996b4e6dbebf5e007eba5ee", + "sha256:4b826973a4a2ae47ba357e4e82fa44a463b8f168e1ca775ac64521442b19e87f", + "sha256:4c2529b320eb9e35af0fa3016c187dffb84a3ecc572bcee7c3ce302bfeba52bf", + "sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf", + "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", + "sha256:5756779642579d902eed757b21b0164cd6fe338506a8083eb58af5c372e39d9a", + "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", + "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", + "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", + "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4", + "sha256:5df592cd503496351d6dc14f7cdad49f268d8e618f80dce0cd5a36b93c3fc08d", + "sha256:5f4c04ead5aed67c8a1a20491d54cdfba5884507a48dd798ecaf13c74c4489f5", + "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", + "sha256:66dd88c918e3287efc22409d426c8f729688d89a0c587c88971a0faa2c2f3792", + "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57", + "sha256:67f2b6de947f8c757db2db9c71527933ad0019737ec374a8a6be9a956786aaf9", + "sha256:693f0192126df6c2327cce3baa7c06f2a117575e32ab2308f7f8216c29d9e2e3", + "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", + "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", + "sha256:76d1f20b1c7a2fa82367e04982e708723ba0e7b8d43aa643d3dcd404d74f1475", + "sha256:7f493881579c90fc262d9cdbaa05a6b54b3811c2f300766748db79f098db9940", + "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431", + "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", + "sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413", + "sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8", + "sha256:a625e06551975f4b7ea7102bc43895b90742746797e2e14b70ed61c43a90f09b", + "sha256:abdc0c6c8c648b4805c5eacd131910d2a7f6455dfd3becab248ef108e89ab16a", + "sha256:ac017dd64572e5c3bd01939121e4d16cf30e5d7e110a119399cf3133b63ad054", + "sha256:ac1e5c9054fe23226fb11e05a6e630837f074174c4c2f0fe442996112a6de4fb", + "sha256:ac60e3b188ec7574cb761b08d50fcedf9d77f1530352db4eef1707fe9dee7205", + "sha256:b359ed09954d7c18bbc1680f380c7301f92c60bf924171629c5db97febb12f04", + "sha256:b7643a03db5c95c799b89b31c036d5f27eeb4d259c798e878d6937d71832b1e4", + "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", + "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9", + "sha256:cad21560da69f4ce7658ca2cb83138fb4cf695a2ba3e475e0559e05991aa8122", + "sha256:d08eb4c2b7d6c41da6ca0600c077e93f5adcfd979cd777d747e9ee624556da4b", + "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905", + "sha256:d591f8de75824cbb7acad4e05d2d710484f15f29d4a915092675ad3456f11770", + "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", + "sha256:d63efaa0cd96cf0c5fe4d581521d9fa87744540d4bc999ae6e08595a1014b45b", + "sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562", + "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", + "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", + "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", + "sha256:f29d80eb9a9263b8d109135351caf568cc3f80b9928bccde535c235de55c22d9", + "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", + "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7" + ], + "markers": "python_version >= '3.9'", + "version": "==15.0.1" + } + }, + "develop": {} +} diff --git a/README.md b/README.md index a0e475b..21f75d4 100644 --- a/README.md +++ b/README.md @@ -1,102 +1,87 @@ -# Mothball GraphQL Server +# ATProto <=> GraphQL Bridge -A simple GraphQL server for the Mothball application, built with Rust, Actix Web, and Juniper. +A bridge between ATProto (server-side) and GraphQL (client-side) for developing efficient UIs for the ATmosphere. -## Features +**Installation:** -- GraphQL API endpoint at `/graphql` -- Interactive GraphiQL interface for development -- Health check endpoint at `/health` -- Environment-based configuration -- Ready for deployment to Fly.io - -## Installation - -### Prerequisites - -- Rust (latest stable version) -- Cargo -- Fly.io CLI (for deployment) - -### Building - -```bash -cd mothball-server -cargo build --release ``` - -### Running Locally - -```bash -# Copy the example environment file -cp .env.example .env - -# Run the server -cargo run +git submodule update --init --recursive +pipenv install ``` -The server will start on `http://localhost:8080` by default. - -## Development +## Schema Generation -### GraphQL Schema +The `schema/` folder contains scripts to generate a GraphQL schema from Lexicon. Standard ATProto definitions are initialized in the `deps/atproto` folder. -The server provides basic queries: -- `hello`: Returns a greeting message -- `health`: Returns server health status +Example usage: -### Extending the Schema +``` +pipenv run python schema/generate_lexicon_schema.py \ + app.bsky.actor.getProfile \ + com.atproto.server.getSession \ + -o schema/schema-generated.graphql +``` -To add new GraphQL types and queries: -1. Add new types to the `Query` struct in `src/main.rs` -2. Use the `#[juniper::graphql_object]` attribute -3. Add async functions for each query/mutation +This will generate schema definitions for the `getProfile` and `getSession` procedures and recursively import all their referenced types, e.g. -## Deployment to Fly.io +``` +type Lexicon_app_bsky_actor { + getProfile(actor: ID!): Lexicon_app_bsky_actor_defs_profileViewDetailed +} + +# app.bsky.actor.defs#profileViewDetailed +type Lexicon_app_bsky_actor_defs_profileViewDetailed { + did: ID! + handle: ID! + displayName: String + description: String + pronouns: String + website: String + avatar: String + banner: String + followersCount: Int + followsCount: Int + postsCount: Int + associated: Lexicon_app_bsky_actor_defs_profileAssociated + joinedViaStarterPack: Lexicon_app_bsky_graph_defs_starterPackViewBasic + indexedAt: String + createdAt: String + viewer: Lexicon_app_bsky_actor_defs_viewerState + labels: [Lexicon_com_atproto_label_defs_label!] + pinnedPost: Lexicon_com_atproto_repo_strongRef + verification: Lexicon_app_bsky_actor_defs_verificationState + status: Lexicon_app_bsky_actor_defs_statusView +} + +# ... +``` -### Prerequisites -- Fly.io account -- Fly.io CLI installed -### Deployment Steps +## Example GraphQL Server -1. **Install Fly.io CLI** (if not already installed): - ```bash - curl -L https://fly.io/install.sh | sh - ``` +This repo also contains a Rust GraphQL server that can bridge an exported schema to the AT protocol. You can use this as a reference or even expand it to include non-AT GraphQL types. -2. **Login to Fly.io**: - ```bash - fly auth login - ``` +- GraphQL API endpoint at `/graphql` +- Interactive GraphiQL interface for development -3. **Create a new Fly.io app**: - ```bash - fly launch - ``` +### Building -4. **Set up PostgreSQL (if needed)**: - ```bash - fly postgres create - ``` +```bash +cd server +cargo run --release +``` -5. **Deploy**: - ```bash - fly deploy - ``` +The server will start on `http://localhost:8080` by default. ### Environment Configuration Copy `.env.example` to `.env` and configure as needed for your deployment. -## Configuration - | Variable | Default | Description | |----------|---------|-------------| | `HOST` | `0.0.0.0` | Host to bind the server to | | `PORT` | `8080` | Port to listen on | -| `DATABASE_URL` | (none) | Database connection string | ## License -MIT \ No newline at end of file +MIT diff --git a/schema/copy_to_json.py b/schema/copy_to_json.py deleted file mode 100644 index d8860ac..0000000 --- a/schema/copy_to_json.py +++ /dev/null @@ -1,16 +0,0 @@ -import json -import os - -# Get the absolute path of the script's directory -script_dir = os.path.dirname(os.path.abspath(__file__)) - -# Load the GraphQL schema from file -with open(os.path.join(script_dir, "schema-generated.graphql"), "r") as graphql_file: - graphql_schema = graphql_file.read() - -# Encode the GraphQL schema as JSON -graphql_json = json.dumps(graphql_schema) - -# Save the JSON-encoded schema to a new file -with open(os.path.join(script_dir, "schema-generated.graphql.json"), "w") as json_file: - _ = json_file.write(graphql_json) diff --git a/schema/generate_lexicon_schema.py b/schema/generate_lexicon_schema.py index 19f8faa..57a7b46 100644 --- a/schema/generate_lexicon_schema.py +++ b/schema/generate_lexicon_schema.py @@ -424,14 +424,6 @@ def main( help="List of lexicon identifiers to generate definitions for", ), ], - append_schema: Annotated[ - list[str], - Option( - "--append-schema", - "-a", - help="Additional GraphQL schema files or folders to append. Can be used multiple times.", - ), - ], output: Annotated[ str, Option( @@ -440,6 +432,14 @@ def main( help="Output file path (default: stdout)", ), ], + append_schema: Annotated[ + list[str] | None, + Option( + "--append-schema", + "-a", + help="Additional GraphQL schema files or folders to append. Can be used multiple times.", + ), + ] = None, ) -> None: """Generate GraphQL schema from lexicon_ids and source files.""" diff --git a/schema/schema-generated.graphql b/schema/schema-generated.graphql deleted file mode 100644 index 2b3b985..0000000 --- a/schema/schema-generated.graphql +++ /dev/null @@ -1,402 +0,0 @@ - -type AuthSession { - did: String! -} - -type AuthStatus { - success: Boolean! - session: AuthSession -} - -type InventoryItem { - id: ID! - title: String! - cost: String! - images: [String!]! - description: String! - location: String - condition: String - category: String - postedAt: String - owner: ID! - owner_profile: Lexicon_app_bsky_actor_defs_profileViewDetailed -} - -type PageInfo { - hasNextPage: Boolean! - hasPreviousPage: Boolean! - startCursor: String - endCursor: String -} - -type InventoryEdge { - cursor: String! - node: InventoryItem! -} - -type InventoryConnection { - edges: [InventoryEdge!]! - pageInfo: PageInfo! -} - -enum Sender { - them - me -} - -type Message { - id: ID! - sender: Sender! - text: String! - time: String! -} - -type Chat { - id: ID! - unread: Boolean! - sender: String! - avatar: String - messages: [Message!]! -} - -############# -# Notifications -############# - -type Notification { - id: ID! - title: String! - message: String! - time: String! - read: Boolean! -} - -############# -# Root object -############# - -type Query { - inventory( - first: Int - after: String - last: Int - before: String - category: String - location: String - condition: String - search: String - minPrice: Float - maxPrice: Float - ): InventoryConnection! - notifications: [Notification!]! - chats: [Chat!]! - user_notification_settings: UserNotificationSettings! - lexicon: Lexicon! -} - -type SessionDestroyResult { - success: Boolean! -} - -type Mutation { - session_retrieve: AuthSession - session_destroy: SessionDestroyResult - update_user_notification_settings( - enableAll: Boolean - listingUpdates: Boolean - userRequests: Boolean - messages: Boolean - promotions: Boolean - news: Boolean - ): UserNotificationSettings! - create_inventory( - title: String! - cost: String! - description: String! - location: String - condition: String - category: String - images: [String!]! - ): CreateInventoryResult! - authenticate(code: String!, state: String!, iss: String!, redirect_uri: String!): AuthStatus - trigger_session_deleted(did: String!): SessionDeletedTriggerResult! -} - -type SessionDeletedTriggerResult { - success: Boolean! - message: String! -} - -type CreateInventoryResult { - edge: InventoryEdge -} - -type UserNotificationSettings { - id: ID! - enableAll: Boolean! - listingUpdates: Boolean! - userRequests: Boolean! - messages: Boolean! - promotions: Boolean! - news: Boolean! -} - -type SessionDeletedPayload { - did: String! -} - -type Subscription { - session_deleted: SessionDeletedPayload! -} - -############# -# ATProto Lexicon -############# - -# app.bsky.actor.defs#profileViewDetailed -type Lexicon_app_bsky_actor_defs_profileViewDetailed { - did: ID! - handle: ID! - displayName: String - description: String - pronouns: String - website: String - avatar: String - banner: String - followersCount: Int - followsCount: Int - postsCount: Int - associated: Lexicon_app_bsky_actor_defs_profileAssociated - joinedViaStarterPack: Lexicon_app_bsky_graph_defs_starterPackViewBasic - indexedAt: String - createdAt: String - viewer: Lexicon_app_bsky_actor_defs_viewerState - labels: [Lexicon_com_atproto_label_defs_label!] - pinnedPost: Lexicon_com_atproto_repo_strongRef - verification: Lexicon_app_bsky_actor_defs_verificationState - status: Lexicon_app_bsky_actor_defs_statusView -} - - - -# com.atproto.server.getSessionOutput -type Lexicon_com_atproto_server_getSessionOutput { - handle: ID! - did: ID! - email: String - emailConfirmed: Boolean - emailAuthFactor: Boolean - active: Boolean - status: String -} - - - -# app.bsky.actor.defs#profileAssociated -type Lexicon_app_bsky_actor_defs_profileAssociated { - lists: Int - feedgens: Int - starterPacks: Int - labeler: Boolean - chat: Lexicon_app_bsky_actor_defs_profileAssociatedChat - activitySubscription: Lexicon_app_bsky_actor_defs_profileAssociatedActivitySubscription -} - - - -# app.bsky.graph.defs#starterPackViewBasic -type Lexicon_app_bsky_graph_defs_starterPackViewBasic { - uri: String! - cid: String! - creator: Lexicon_app_bsky_actor_defs_profileViewBasic! - listItemCount: Int - joinedWeekCount: Int - joinedAllTimeCount: Int - labels: [Lexicon_com_atproto_label_defs_label!] - indexedAt: String! -} - - - -# app.bsky.actor.defs#viewerState -type Lexicon_app_bsky_actor_defs_viewerState { - muted: Boolean - mutedByList: Lexicon_app_bsky_graph_defs_listViewBasic - blockedBy: Boolean - blocking: String - blockingByList: Lexicon_app_bsky_graph_defs_listViewBasic - following: String - followedBy: String - knownFollowers: Lexicon_app_bsky_actor_defs_knownFollowers - activitySubscription: Lexicon_app_bsky_notification_defs_activitySubscription -} - - - -# com.atproto.label.defs#label -type Lexicon_com_atproto_label_defs_label { - ver: Int - src: ID! - uri: String! - cid: String - val: String! - neg: Boolean - cts: String! - exp: String - sig: String -} - - - -# com.atproto.repo.strongRef -type Lexicon_com_atproto_repo_strongRef { - uri: String! - cid: String! -} - - - -# app.bsky.actor.defs#verificationState -type Lexicon_app_bsky_actor_defs_verificationState { - verifications: [Lexicon_app_bsky_actor_defs_verificationView!]! - verifiedStatus: String! - trustedVerifierStatus: String! -} - - - -# app.bsky.actor.defs#statusView -type Lexicon_app_bsky_actor_defs_statusView { - uri: String - cid: String - status: String! - expiresAt: String - isActive: Boolean - isDisabled: Boolean -} - - - -# app.bsky.actor.defs#profileAssociatedChat -type Lexicon_app_bsky_actor_defs_profileAssociatedChat { - allowIncoming: String! -} - - - -# app.bsky.actor.defs#profileAssociatedActivitySubscription -type Lexicon_app_bsky_actor_defs_profileAssociatedActivitySubscription { - allowSubscriptions: String! -} - - - -# app.bsky.actor.defs#profileViewBasic -type Lexicon_app_bsky_actor_defs_profileViewBasic { - did: ID! - handle: ID! - displayName: String - pronouns: String - avatar: String - associated: Lexicon_app_bsky_actor_defs_profileAssociated - viewer: Lexicon_app_bsky_actor_defs_viewerState - labels: [Lexicon_com_atproto_label_defs_label!] - createdAt: String - verification: Lexicon_app_bsky_actor_defs_verificationState - status: Lexicon_app_bsky_actor_defs_statusView -} - - - -# app.bsky.graph.defs#listViewBasic -type Lexicon_app_bsky_graph_defs_listViewBasic { - uri: String! - cid: String! - name: String! - purpose: Lexicon_app_bsky_graph_defs_listPurpose! - avatar: String - listItemCount: Int - labels: [Lexicon_com_atproto_label_defs_label!] - viewer: Lexicon_app_bsky_graph_defs_listViewerState - indexedAt: String -} - - - -# app.bsky.actor.defs#knownFollowers -type Lexicon_app_bsky_actor_defs_knownFollowers { - count: Int! - followers: [Lexicon_app_bsky_actor_defs_profileViewBasic!]! -} - - - -# app.bsky.notification.defs#activitySubscription -type Lexicon_app_bsky_notification_defs_activitySubscription { - post: Boolean! - reply: Boolean! -} - - - -# app.bsky.actor.defs#verificationView -type Lexicon_app_bsky_actor_defs_verificationView { - issuer: ID! - uri: String! - isValid: Boolean! - createdAt: String! -} - - - -# app.bsky.graph.defs#listPurpose -enum Lexicon_app_bsky_graph_defs_listPurpose { - APP_BSKY_GRAPH_DEFS_MODLIST - APP_BSKY_GRAPH_DEFS_CURATELIST - APP_BSKY_GRAPH_DEFS_REFERENCELIST -} - - - -# app.bsky.graph.defs#listViewerState -type Lexicon_app_bsky_graph_defs_listViewerState { - muted: Boolean - blocked: String -} - - - -type Lexicon_app_bsky_actor { - getProfile(actor: ID!): Lexicon_app_bsky_actor_defs_profileViewDetailed -} - - -type Lexicon_app_bsky { - actor: Lexicon_app_bsky_actor! -} - - -type Lexicon_app { - bsky: Lexicon_app_bsky! -} - - -type Lexicon_com_atproto_server { - getSession: Lexicon_com_atproto_server_getSessionOutput -} - - -type Lexicon_com_atproto { - server: Lexicon_com_atproto_server! -} - - -type Lexicon_com { - atproto: Lexicon_com_atproto! -} - - -type Lexicon { - app: Lexicon_app! - com: Lexicon_com! -} diff --git a/schema/schema-generated.graphql.json b/schema/schema-generated.graphql.json deleted file mode 100644 index 3cf3be7..0000000 --- a/schema/schema-generated.graphql.json +++ /dev/null @@ -1 +0,0 @@ -"\ntype AuthSession {\n did: String!\n}\n\ntype AuthStatus {\n success: Boolean!\n session: AuthSession\n}\n\ntype InventoryItem {\n id: ID!\n title: String!\n cost: String!\n images: [String!]!\n description: String!\n location: String\n condition: String\n category: String\n postedAt: String\n owner: ID!\n owner_profile: Lexicon_app_bsky_actor_defs_profileViewDetailed\n}\n\ntype PageInfo {\n hasNextPage: Boolean!\n hasPreviousPage: Boolean!\n startCursor: String\n endCursor: String\n}\n\ntype InventoryEdge {\n cursor: String!\n node: InventoryItem!\n}\n\ntype InventoryConnection {\n edges: [InventoryEdge!]!\n pageInfo: PageInfo!\n}\n\nenum Sender {\n them\n me\n}\n\ntype Message {\n id: ID!\n sender: Sender!\n text: String!\n time: String!\n}\n\ntype Chat {\n id: ID!\n unread: Boolean!\n sender: String!\n avatar: String\n messages: [Message!]!\n}\n\n#############\n# Notifications\n#############\n\ntype Notification {\n id: ID!\n title: String!\n message: String!\n time: String!\n read: Boolean!\n}\n\n#############\n# Root object\n#############\n\ntype Query {\n inventory(\n first: Int\n after: String\n last: Int\n before: String\n category: String\n location: String\n condition: String\n search: String\n minPrice: Float\n maxPrice: Float\n ): InventoryConnection!\n notifications: [Notification!]!\n chats: [Chat!]!\n user_notification_settings: UserNotificationSettings!\n lexicon: Lexicon!\n}\n\ntype SessionDestroyResult {\n success: Boolean!\n}\n\ntype Mutation {\n session_retrieve: AuthSession\n session_destroy: SessionDestroyResult\n update_user_notification_settings(\n enableAll: Boolean\n listingUpdates: Boolean\n userRequests: Boolean\n messages: Boolean\n promotions: Boolean\n news: Boolean\n ): UserNotificationSettings!\n create_inventory(\n title: String!\n cost: String!\n description: String!\n location: String\n condition: String\n category: String\n images: [String!]!\n ): CreateInventoryResult!\n authenticate(code: String!, state: String!, iss: String!, redirect_uri: String!): AuthStatus\n trigger_session_deleted(did: String!): SessionDeletedTriggerResult!\n}\n\ntype SessionDeletedTriggerResult {\n success: Boolean!\n message: String!\n}\n\ntype CreateInventoryResult {\n edge: InventoryEdge\n}\n\ntype UserNotificationSettings {\n id: ID!\n enableAll: Boolean!\n listingUpdates: Boolean!\n userRequests: Boolean!\n messages: Boolean!\n promotions: Boolean!\n news: Boolean!\n}\n\ntype SessionDeletedPayload {\n did: String!\n}\n\ntype Subscription {\n session_deleted: SessionDeletedPayload!\n}\n\n#############\n# ATProto Lexicon\n#############\n\n# app.bsky.actor.defs#profileViewDetailed\ntype Lexicon_app_bsky_actor_defs_profileViewDetailed {\n did: ID!\n handle: ID!\n displayName: String\n description: String\n pronouns: String\n website: String\n avatar: String\n banner: String\n followersCount: Int\n followsCount: Int\n postsCount: Int\n associated: Lexicon_app_bsky_actor_defs_profileAssociated\n joinedViaStarterPack: Lexicon_app_bsky_graph_defs_starterPackViewBasic\n indexedAt: String\n createdAt: String\n viewer: Lexicon_app_bsky_actor_defs_viewerState\n labels: [Lexicon_com_atproto_label_defs_label!]\n pinnedPost: Lexicon_com_atproto_repo_strongRef\n verification: Lexicon_app_bsky_actor_defs_verificationState\n status: Lexicon_app_bsky_actor_defs_statusView\n}\n\n\n\n# com.atproto.server.getSessionOutput\ntype Lexicon_com_atproto_server_getSessionOutput {\n handle: ID!\n did: ID!\n email: String\n emailConfirmed: Boolean\n emailAuthFactor: Boolean\n active: Boolean\n status: String\n}\n\n\n\n# app.bsky.actor.defs#profileAssociated\ntype Lexicon_app_bsky_actor_defs_profileAssociated {\n lists: Int\n feedgens: Int\n starterPacks: Int\n labeler: Boolean\n chat: Lexicon_app_bsky_actor_defs_profileAssociatedChat\n activitySubscription: Lexicon_app_bsky_actor_defs_profileAssociatedActivitySubscription\n}\n\n\n\n# app.bsky.graph.defs#starterPackViewBasic\ntype Lexicon_app_bsky_graph_defs_starterPackViewBasic {\n uri: String!\n cid: String!\n creator: Lexicon_app_bsky_actor_defs_profileViewBasic!\n listItemCount: Int\n joinedWeekCount: Int\n joinedAllTimeCount: Int\n labels: [Lexicon_com_atproto_label_defs_label!]\n indexedAt: String!\n}\n\n\n\n# app.bsky.actor.defs#viewerState\ntype Lexicon_app_bsky_actor_defs_viewerState {\n muted: Boolean\n mutedByList: Lexicon_app_bsky_graph_defs_listViewBasic\n blockedBy: Boolean\n blocking: String\n blockingByList: Lexicon_app_bsky_graph_defs_listViewBasic\n following: String\n followedBy: String\n knownFollowers: Lexicon_app_bsky_actor_defs_knownFollowers\n activitySubscription: Lexicon_app_bsky_notification_defs_activitySubscription\n}\n\n\n\n# com.atproto.label.defs#label\ntype Lexicon_com_atproto_label_defs_label {\n ver: Int\n src: ID!\n uri: String!\n cid: String\n val: String!\n neg: Boolean\n cts: String!\n exp: String\n sig: String\n}\n\n\n\n# com.atproto.repo.strongRef\ntype Lexicon_com_atproto_repo_strongRef {\n uri: String!\n cid: String!\n}\n\n\n\n# app.bsky.actor.defs#verificationState\ntype Lexicon_app_bsky_actor_defs_verificationState {\n verifications: [Lexicon_app_bsky_actor_defs_verificationView!]!\n verifiedStatus: String!\n trustedVerifierStatus: String!\n}\n\n\n\n# app.bsky.actor.defs#statusView\ntype Lexicon_app_bsky_actor_defs_statusView {\n uri: String\n cid: String\n status: String!\n expiresAt: String\n isActive: Boolean\n isDisabled: Boolean\n}\n\n\n\n# app.bsky.actor.defs#profileAssociatedChat\ntype Lexicon_app_bsky_actor_defs_profileAssociatedChat {\n allowIncoming: String!\n}\n\n\n\n# app.bsky.actor.defs#profileAssociatedActivitySubscription\ntype Lexicon_app_bsky_actor_defs_profileAssociatedActivitySubscription {\n allowSubscriptions: String!\n}\n\n\n\n# app.bsky.actor.defs#profileViewBasic\ntype Lexicon_app_bsky_actor_defs_profileViewBasic {\n did: ID!\n handle: ID!\n displayName: String\n pronouns: String\n avatar: String\n associated: Lexicon_app_bsky_actor_defs_profileAssociated\n viewer: Lexicon_app_bsky_actor_defs_viewerState\n labels: [Lexicon_com_atproto_label_defs_label!]\n createdAt: String\n verification: Lexicon_app_bsky_actor_defs_verificationState\n status: Lexicon_app_bsky_actor_defs_statusView\n}\n\n\n\n# app.bsky.graph.defs#listViewBasic\ntype Lexicon_app_bsky_graph_defs_listViewBasic {\n uri: String!\n cid: String!\n name: String!\n purpose: Lexicon_app_bsky_graph_defs_listPurpose!\n avatar: String\n listItemCount: Int\n labels: [Lexicon_com_atproto_label_defs_label!]\n viewer: Lexicon_app_bsky_graph_defs_listViewerState\n indexedAt: String\n}\n\n\n\n# app.bsky.actor.defs#knownFollowers\ntype Lexicon_app_bsky_actor_defs_knownFollowers {\n count: Int!\n followers: [Lexicon_app_bsky_actor_defs_profileViewBasic!]!\n}\n\n\n\n# app.bsky.notification.defs#activitySubscription\ntype Lexicon_app_bsky_notification_defs_activitySubscription {\n post: Boolean!\n reply: Boolean!\n}\n\n\n\n# app.bsky.actor.defs#verificationView\ntype Lexicon_app_bsky_actor_defs_verificationView {\n issuer: ID!\n uri: String!\n isValid: Boolean!\n createdAt: String!\n}\n\n\n\n# app.bsky.graph.defs#listPurpose\nenum Lexicon_app_bsky_graph_defs_listPurpose {\n APP_BSKY_GRAPH_DEFS_MODLIST\n APP_BSKY_GRAPH_DEFS_CURATELIST\n APP_BSKY_GRAPH_DEFS_REFERENCELIST\n}\n\n\n\n# app.bsky.graph.defs#listViewerState\ntype Lexicon_app_bsky_graph_defs_listViewerState {\n muted: Boolean\n blocked: String\n}\n\n\n\ntype Lexicon_app_bsky_actor {\n getProfile(actor: ID!): Lexicon_app_bsky_actor_defs_profileViewDetailed\n}\n\n\ntype Lexicon_app_bsky {\n actor: Lexicon_app_bsky_actor!\n}\n\n\ntype Lexicon_app {\n bsky: Lexicon_app_bsky!\n}\n\n\ntype Lexicon_com_atproto_server {\n getSession: Lexicon_com_atproto_server_getSessionOutput\n}\n\n\ntype Lexicon_com_atproto {\n server: Lexicon_com_atproto_server!\n}\n\n\ntype Lexicon_com {\n atproto: Lexicon_com_atproto!\n}\n\n\ntype Lexicon {\n app: Lexicon_app!\n com: Lexicon_com!\n}\n" \ No newline at end of file diff --git a/schema/sources/types.graphql b/schema/sources/types.graphql deleted file mode 100644 index aa94800..0000000 --- a/schema/sources/types.graphql +++ /dev/null @@ -1,153 +0,0 @@ -type AuthSession { - did: String! -} - -type AuthStatus { - success: Boolean! - session: AuthSession -} - -type InventoryItem { - id: ID! - title: String! - cost: String! - images: [String!]! - description: String! - location: String - condition: String - category: String - postedAt: String - owner: ID! - owner_profile: Lexicon_app_bsky_actor_defs_profileViewDetailed -} - -type PageInfo { - hasNextPage: Boolean! - hasPreviousPage: Boolean! - startCursor: String - endCursor: String -} - -type InventoryEdge { - cursor: String! - node: InventoryItem! -} - -type InventoryConnection { - edges: [InventoryEdge!]! - pageInfo: PageInfo! -} - -enum Sender { - them - me -} - -type Message { - id: ID! - sender: Sender! - text: String! - time: String! -} - -type Chat { - id: ID! - unread: Boolean! - sender: String! - avatar: String - messages: [Message!]! -} - -############# -# Notifications -############# - -type Notification { - id: ID! - title: String! - message: String! - time: String! - read: Boolean! -} - -############# -# Root object -############# - -type Query { - inventory( - first: Int - after: String - last: Int - before: String - category: String - location: String - condition: String - search: String - minPrice: Float - maxPrice: Float - ): InventoryConnection! - notifications: [Notification!]! - chats: [Chat!]! - user_notification_settings: UserNotificationSettings! - lexicon: Lexicon! -} - -type SessionDestroyResult { - success: Boolean! -} - -type Mutation { - session_retrieve: AuthSession - session_destroy: SessionDestroyResult - update_user_notification_settings( - enableAll: Boolean - listingUpdates: Boolean - userRequests: Boolean - messages: Boolean - promotions: Boolean - news: Boolean - ): UserNotificationSettings! - create_inventory( - title: String! - cost: String! - description: String! - location: String - condition: String - category: String - images: [String!]! - ): CreateInventoryResult! - authenticate(code: String!, state: String!, iss: String!, redirect_uri: String!): AuthStatus - trigger_session_deleted(did: String!): SessionDeletedTriggerResult! -} - -type SessionDeletedTriggerResult { - success: Boolean! - message: String! -} - -type CreateInventoryResult { - edge: InventoryEdge -} - -type UserNotificationSettings { - id: ID! - enableAll: Boolean! - listingUpdates: Boolean! - userRequests: Boolean! - messages: Boolean! - promotions: Boolean! - news: Boolean! -} - -type SessionDeletedPayload { - did: String! -} - -type Subscription { - session_deleted: SessionDeletedPayload! -} - -############# -# ATProto Lexicon -#############