diff --git a/Cargo.lock b/Cargo.lock
index 34d6987c..7db6fe16 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -174,6 +174,12 @@ dependencies = [
"syn 2.0.112",
]
+[[package]]
+name = "arrayvec"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
+
[[package]]
name = "arrayvec"
version = "0.7.6"
@@ -249,7 +255,7 @@ dependencies = [
"aligned",
"anyhow",
"arg_enum_proc_macro",
- "arrayvec",
+ "arrayvec 0.7.6",
"log",
"num-rational",
"num-traits",
@@ -267,7 +273,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8"
dependencies = [
"anyhow",
- "arrayvec",
+ "arrayvec 0.7.6",
"log",
"nom",
"num-rational",
@@ -280,7 +286,7 @@ version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "47c8fbc0f831f4519fe8b810b6a7a91410ec83031b8233f730a0480029f6a23f"
dependencies = [
- "arrayvec",
+ "arrayvec 0.7.6",
]
[[package]]
@@ -313,7 +319,7 @@ dependencies = [
"tower",
"tower-layer",
"tower-service",
- "tracing",
+ "tracing 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -332,7 +338,7 @@ dependencies = [
"sync_wrapper",
"tower-layer",
"tower-service",
- "tracing",
+ "tracing 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -439,6 +445,21 @@ version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0e050f626429857a27ddccb31e0aca21356bfa709c04041aefddac081a8f068a"
+[[package]]
+name = "bit-set"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3"
+dependencies = [
+ "bit-vec",
+]
+
+[[package]]
+name = "bit-vec"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7"
+
[[package]]
name = "bit_field"
version = "0.10.3"
@@ -534,6 +555,16 @@ dependencies = [
"safemem",
]
+[[package]]
+name = "buffer"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aab7228d32b5d95be40adeba1d9461c8547b5dadf5f9cbfba09b6d578991df28"
+dependencies = [
+ "arrayvec 0.5.2",
+ "mac 0.0.2",
+]
+
[[package]]
name = "built"
version = "0.8.0"
@@ -833,7 +864,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "688d7fbb8092b8de775ef2536f36c8c31f2bc4006ece2e8d8ad2d17d00ce0a2a"
dependencies = [
"loom",
- "tracing",
+ "tracing 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -1253,6 +1284,26 @@ version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d"
+[[package]]
+name = "embedded-io-adapters"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90ccf22c3feffc79593914c0b4be9a2ed6b11e44cf1f84fd6b77d2ee92de0077"
+dependencies = [
+ "embedded-io 0.6.1",
+ "embedded-io-async",
+ "tokio",
+]
+
+[[package]]
+name = "embedded-io-async"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ff09972d4073aa8c299395be75161d582e7629cd663171d62af73c8d50dba3f"
+dependencies = [
+ "embedded-io 0.6.1",
+]
+
[[package]]
name = "encode_unicode"
version = "1.0.0"
@@ -1477,7 +1528,7 @@ version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843"
dependencies = [
- "mac",
+ "mac 0.1.1",
"new_debug_unreachable",
]
@@ -1735,7 +1786,7 @@ dependencies = [
"slab",
"tokio",
"tokio-util",
- "tracing",
+ "tracing 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -1758,6 +1809,15 @@ dependencies = [
"byteorder",
]
+[[package]]
+name = "hash32"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606"
+dependencies = [
+ "byteorder",
+]
+
[[package]]
name = "hashbrown"
version = "0.14.5"
@@ -1788,13 +1848,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f"
dependencies = [
"atomic-polyfill",
- "hash32",
+ "hash32 0.2.1",
"rustc_version",
"serde",
"spin 0.9.8",
"stable_deref_trait",
]
+[[package]]
+name = "heapless"
+version = "0.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2af2455f757db2b292a9b1768c4b70186d443bcb3b316252d6b540aec1cd89ed"
+dependencies = [
+ "hash32 0.3.1",
+ "stable_deref_trait",
+]
+
[[package]]
name = "heck"
version = "0.4.1"
@@ -1839,7 +1909,7 @@ dependencies = [
"thiserror 1.0.69",
"tinyvec",
"tokio",
- "tracing",
+ "tracing 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)",
"url",
]
@@ -1861,7 +1931,7 @@ dependencies = [
"smallvec",
"thiserror 1.0.69",
"tokio",
- "tracing",
+ "tracing 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -1880,7 +1950,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c13771afe0e6e846f1e67d038d4cb29998a6779f93c809212e4e9c32efd244d4"
dependencies = [
"log",
- "mac",
+ "mac 0.1.1",
"markup5ever",
"proc-macro2",
"quote",
@@ -1994,7 +2064,7 @@ dependencies = [
"system-configuration",
"tokio",
"tower-service",
- "tracing",
+ "tracing 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)",
"windows-registry",
]
@@ -2310,7 +2380,7 @@ dependencies = [
"thiserror 2.0.17",
"tiff 0.6.1",
"tokio",
- "tracing",
+ "tracing 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)",
"trait-variant",
"url",
"viuer",
@@ -2361,8 +2431,8 @@ dependencies = [
"tokio",
"tower",
"tower-http",
- "tracing",
- "tracing-subscriber",
+ "tracing 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tracing-subscriber 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -2385,7 +2455,7 @@ dependencies = [
"http",
"ipld-core",
"k256",
- "maitake-sync",
+ "maitake-sync 0.1.2",
"miette",
"multibase",
"multihash",
@@ -2411,7 +2481,7 @@ dependencies = [
"tokio",
"tokio-tungstenite-wasm",
"tokio-util",
- "tracing",
+ "tracing 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)",
"trait-variant",
"url",
"zstd",
@@ -2454,7 +2524,7 @@ dependencies = [
"serde_json",
"thiserror 2.0.17",
"tokio",
- "tracing",
+ "tracing 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)",
"trait-variant",
"url",
"urlencoding",
@@ -2542,7 +2612,7 @@ dependencies = [
"smol_str",
"thiserror 2.0.17",
"tokio",
- "tracing",
+ "tracing 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)",
"trait-variant",
"url",
"webbrowser",
@@ -2688,6 +2758,35 @@ dependencies = [
"winnow 0.6.24",
]
+[[package]]
+name = "lazy-collections"
+version = "0.9.5"
+dependencies = [
+ "buffer",
+ "bytes",
+ "chrono",
+ "embedded-io 0.6.1",
+ "embedded-io-adapters",
+ "embedded-io-async",
+ "heapless 0.9.2",
+ "lock_api",
+ "loom",
+ "maitake-sync 0.2.2",
+ "managed",
+ "miette",
+ "n0-future",
+ "pin-project",
+ "postcard",
+ "proptest",
+ "serde",
+ "serde_bytes",
+ "tokio",
+ "tracing 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tracing 0.1.44 (git+https://github.com/tokio-rs/tracing)",
+ "tracing-subscriber 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tracing-subscriber 0.3.22 (git+https://github.com/tokio-rs/tracing)",
+]
+
[[package]]
name = "lazy_static"
version = "1.5.0"
@@ -2784,8 +2883,8 @@ dependencies = [
"cfg-if",
"generator",
"scoped-tls",
- "tracing",
- "tracing-subscriber",
+ "tracing 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tracing-subscriber 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -2812,6 +2911,12 @@ version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154"
+[[package]]
+name = "mac"
+version = "0.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b1db08c0d0ddbb591e65f1da58d1cefccc94a2faa0c55bf979ce215a3e04d5e"
+
[[package]]
name = "mac"
version = "0.1.1"
@@ -2831,6 +2936,27 @@ dependencies = [
"portable-atomic",
]
+[[package]]
+name = "maitake-sync"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "748f86d9befd480b602c3bebc9ef30dbf2f3dfc8acc4a73d07b90f0117e6de3f"
+dependencies = [
+ "cordyceps",
+ "loom",
+ "mutex-traits",
+ "mycelium-bitfield",
+ "pin-project",
+ "portable-atomic",
+ "tracing 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "managed"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ca88d725a0a943b096803bd34e73a4437208b6077654cc4ecb2947a5f91618d"
+
[[package]]
name = "markup5ever"
version = "0.12.1"
@@ -3055,6 +3181,12 @@ dependencies = [
"twoway",
]
+[[package]]
+name = "mutex-traits"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3929f2b5633d29cf7b6624992e5f3c1e9334f1193423e12d17be4faf678cde3f"
+
[[package]]
name = "mycelium-bitfield"
version = "0.1.5"
@@ -3544,7 +3676,7 @@ dependencies = [
"cobs",
"embedded-io 0.4.0",
"embedded-io 0.6.1",
- "heapless",
+ "heapless 0.7.17",
"serde",
]
@@ -3648,6 +3780,25 @@ dependencies = [
"syn 2.0.112",
]
+[[package]]
+name = "proptest"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bee689443a2bd0a16ab0348b52ee43e3b2d1b1f931c8aa5c9f8de4c86fbe8c40"
+dependencies = [
+ "bit-set",
+ "bit-vec",
+ "bitflags",
+ "num-traits",
+ "rand 0.9.2",
+ "rand_chacha 0.9.0",
+ "rand_xorshift",
+ "regex-syntax",
+ "rusty-fork",
+ "tempfile",
+ "unarray",
+]
+
[[package]]
name = "pxfm"
version = "0.1.27"
@@ -3694,7 +3845,7 @@ dependencies = [
"socket2 0.6.1",
"thiserror 2.0.17",
"tokio",
- "tracing",
+ "tracing 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)",
"web-time",
]
@@ -3715,7 +3866,7 @@ dependencies = [
"slab",
"thiserror 2.0.17",
"tinyvec",
- "tracing",
+ "tracing 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)",
"web-time",
]
@@ -3729,7 +3880,7 @@ dependencies = [
"libc",
"once_cell",
"socket2 0.6.1",
- "tracing",
+ "tracing 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)",
"windows-sys 0.60.2",
]
@@ -3807,6 +3958,15 @@ dependencies = [
"getrandom 0.3.4",
]
+[[package]]
+name = "rand_xorshift"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a"
+dependencies = [
+ "rand_core 0.9.3",
+]
+
[[package]]
name = "rav1e"
version = "0.8.1"
@@ -3816,7 +3976,7 @@ dependencies = [
"aligned-vec",
"arbitrary",
"arg_enum_proc_macro",
- "arrayvec",
+ "arrayvec 0.7.6",
"av-scenechange",
"av1-grain",
"bitstream-io",
@@ -4187,6 +4347,18 @@ version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
+[[package]]
+name = "rusty-fork"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2"
+dependencies = [
+ "fnv",
+ "quick-error 1.2.3",
+ "tempfile",
+ "wait-timeout",
+]
+
[[package]]
name = "ryu"
version = "1.0.22"
@@ -4762,7 +4934,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0"
dependencies = [
"futf",
- "mac",
+ "mac 0.1.1",
"utf-8",
]
@@ -5128,7 +5300,7 @@ dependencies = [
"tokio",
"tower-layer",
"tower-service",
- "tracing",
+ "tracing 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -5152,7 +5324,7 @@ dependencies = [
"tower",
"tower-layer",
"tower-service",
- "tracing",
+ "tracing 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
@@ -5175,8 +5347,18 @@ checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
dependencies = [
"log",
"pin-project-lite",
- "tracing-attributes",
- "tracing-core",
+ "tracing-attributes 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tracing-core 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "tracing"
+version = "0.1.44"
+source = "git+https://github.com/tokio-rs/tracing#efc690fa6bd1d9c3a57528b9bc8ac80504a7a6ed"
+dependencies = [
+ "pin-project-lite",
+ "tracing-attributes 0.1.31 (git+https://github.com/tokio-rs/tracing)",
+ "tracing-core 0.1.36 (git+https://github.com/tokio-rs/tracing)",
]
[[package]]
@@ -5190,6 +5372,16 @@ dependencies = [
"syn 2.0.112",
]
+[[package]]
+name = "tracing-attributes"
+version = "0.1.31"
+source = "git+https://github.com/tokio-rs/tracing#efc690fa6bd1d9c3a57528b9bc8ac80504a7a6ed"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.112",
+]
+
[[package]]
name = "tracing-core"
version = "0.1.36"
@@ -5200,6 +5392,14 @@ dependencies = [
"valuable",
]
+[[package]]
+name = "tracing-core"
+version = "0.1.36"
+source = "git+https://github.com/tokio-rs/tracing#efc690fa6bd1d9c3a57528b9bc8ac80504a7a6ed"
+dependencies = [
+ "valuable",
+]
+
[[package]]
name = "tracing-log"
version = "0.2.0"
@@ -5208,7 +5408,17 @@ checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
dependencies = [
"log",
"once_cell",
- "tracing-core",
+ "tracing-core 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "tracing-log"
+version = "0.2.0"
+source = "git+https://github.com/tokio-rs/tracing#efc690fa6bd1d9c3a57528b9bc8ac80504a7a6ed"
+dependencies = [
+ "log",
+ "once_cell",
+ "tracing-core 0.1.36 (git+https://github.com/tokio-rs/tracing)",
]
[[package]]
@@ -5225,9 +5435,26 @@ dependencies = [
"smallvec",
"thread_local",
"time",
- "tracing",
- "tracing-core",
- "tracing-log",
+ "tracing 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tracing-core 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)",
+ "tracing-log 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
+[[package]]
+name = "tracing-subscriber"
+version = "0.3.22"
+source = "git+https://github.com/tokio-rs/tracing#efc690fa6bd1d9c3a57528b9bc8ac80504a7a6ed"
+dependencies = [
+ "matchers",
+ "nu-ansi-term",
+ "once_cell",
+ "regex-automata",
+ "sharded-slab",
+ "smallvec",
+ "thread_local",
+ "tracing 0.1.44 (git+https://github.com/tokio-rs/tracing)",
+ "tracing-core 0.1.36 (git+https://github.com/tokio-rs/tracing)",
+ "tracing-log 0.2.0 (git+https://github.com/tokio-rs/tracing)",
]
[[package]]
@@ -5333,6 +5560,12 @@ dependencies = [
"syn 2.0.112",
]
+[[package]]
+name = "unarray"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94"
+
[[package]]
name = "unicase"
version = "2.8.1"
@@ -5478,6 +5711,15 @@ dependencies = [
"termcolor",
]
+[[package]]
+name = "wait-timeout"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11"
+dependencies = [
+ "libc",
+]
+
[[package]]
name = "walkdir"
version = "2.5.0"
@@ -6129,7 +6371,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9bbb26405d8e919bc1547a5aa9abc95cbfa438f04844f5fdd9dc7596b748bf69"
dependencies = [
"log",
- "mac",
+ "mac 0.1.1",
"markup5ever",
]
diff --git a/crates/jacquard-api/Cargo.toml b/crates/jacquard-api/Cargo.toml
index ce3de493..6dfdbde5 100644
--- a/crates/jacquard-api/Cargo.toml
+++ b/crates/jacquard-api/Cargo.toml
@@ -49,19 +49,25 @@ streaming = ["jacquard-common/websocket"]
app_blebbit = []
app_bsky = ["com_atproto"]
app_dropanchor = []
+app_juttu = ["com_atproto"]
app_ocho = []
+app_offprint = []
app_rocksky = ["com_atproto"]
art_cllctv = ["app_bsky", "com_atproto"]
beauty_cybernetic = []
blog_pckt = ["com_atproto"]
blue__2048 = []
blue_atplane = []
+blue_atplay = []
blue_linkat = []
blue_recipes = []
blue_rito = []
+blue_skytalk = []
blue_zio = []
buzz_bookhive = ["com_atproto"]
+cat_vt3e = []
chat_bsky = ["app_bsky"]
+city_yoyle = []
club_stellz = []
com__5jiji = []
com_atproto = []
@@ -77,6 +83,9 @@ dev_baileytownsend = []
dev_fudgeu = []
dev_ocbwoy3 = []
dev_regnault = []
+dev_tsunagite = []
+dev_vielle = []
+events_smokesignal = ["community_lexicon"]
fm_teal = []
fyi_frontpage = ["com_atproto"]
fyi_questionable = ["com_atproto"]
@@ -104,6 +113,7 @@ org_devcon = []
org_farmapps = []
org_okazu_diary = ["com_atproto"]
org_robocracy = []
+org_stormlightlabs = []
org_user_intents = []
place_atwork = []
place_stream = ["app_bsky", "com_atproto"]
@@ -115,11 +125,13 @@ site_standard = ["com_atproto"]
social_clippr = []
social_flockfeeds = []
social_grain = ["com_atproto"]
+social_pace = []
social_pmsky = []
social_psky = ["com_atproto"]
social_sket = []
+social_tophhie = []
tech_manos = ["com_atproto"]
-tech_tokimeki = ["com_atproto"]
+tech_tokimeki = ["app_bsky", "com_atproto"]
tools_ozone = ["app_bsky", "chat_bsky", "com_atproto"]
tools_smokesignal = []
uk_ewancroft = []
diff --git a/crates/jacquard-api/lexicons/app_bsky_actor_defs.json b/crates/jacquard-api/lexicons/app_bsky_actor_defs.json
index b482859e..02bb6199 100644
--- a/crates/jacquard-api/lexicons/app_bsky_actor_defs.json
+++ b/crates/jacquard-api/lexicons/app_bsky_actor_defs.json
@@ -731,6 +731,10 @@
"record"
],
"properties": {
+ "cid": {
+ "type": "string",
+ "format": "cid"
+ },
"embed": {
"type": "union",
"description": "An optional embed associated with the status.",
@@ -747,6 +751,10 @@
"type": "boolean",
"description": "True if the status is not expired, false if it is expired. Only present if expiration was set."
},
+ "isDisabled": {
+ "type": "boolean",
+ "description": "True if the user's go-live access has been disabled by a moderator, false otherwise."
+ },
"record": {
"type": "unknown"
},
@@ -756,6 +764,10 @@
"knownValues": [
"app.bsky.actor.status#live"
]
+ },
+ "uri": {
+ "type": "string",
+ "format": "at-uri"
}
}
},
diff --git a/crates/jacquard-api/lexicons/app_bsky_ageassurance_defs.json b/crates/jacquard-api/lexicons/app_bsky_ageassurance_defs.json
index cddd57c7..d20daf11 100644
--- a/crates/jacquard-api/lexicons/app_bsky_ageassurance_defs.json
+++ b/crates/jacquard-api/lexicons/app_bsky_ageassurance_defs.json
@@ -34,6 +34,7 @@
"description": "The Age Assurance configuration for a specific region.",
"required": [
"countryCode",
+ "minAccessAge",
"rules"
],
"properties": {
@@ -41,6 +42,10 @@
"type": "string",
"description": "The ISO 3166-1 alpha-2 country code this configuration applies to."
},
+ "minAccessAge": {
+ "type": "integer",
+ "description": "The minimum age (as a whole integer) required to use Bluesky in this region."
+ },
"regionCode": {
"type": "string",
"description": "The ISO 3166-2 region code this configuration applies to. If omitted, the configuration applies to the entire country."
diff --git a/crates/jacquard-api/lexicons/app_bsky_unspecced_getSuggestedUsers.json b/crates/jacquard-api/lexicons/app_bsky_unspecced_getSuggestedUsers.json
index bc653c8f..305ee88e 100644
--- a/crates/jacquard-api/lexicons/app_bsky_unspecced_getSuggestedUsers.json
+++ b/crates/jacquard-api/lexicons/app_bsky_unspecced_getSuggestedUsers.json
@@ -34,6 +34,10 @@
"type": "ref",
"ref": "app.bsky.actor.defs#profileView"
}
+ },
+ "recId": {
+ "type": "integer",
+ "description": "Snowflake for this recommendation, use when submitting recommendation events."
}
}
}
diff --git a/crates/jacquard-api/lexicons/app_bsky_unspecced_getSuggestedUsersSkeleton.json b/crates/jacquard-api/lexicons/app_bsky_unspecced_getSuggestedUsersSkeleton.json
index 118a8bcb..d5fe6914 100644
--- a/crates/jacquard-api/lexicons/app_bsky_unspecced_getSuggestedUsersSkeleton.json
+++ b/crates/jacquard-api/lexicons/app_bsky_unspecced_getSuggestedUsersSkeleton.json
@@ -39,6 +39,10 @@
"type": "string",
"format": "did"
}
+ },
+ "recId": {
+ "type": "integer",
+ "description": "Snowflake for this recommendation, use when submitting recommendation events."
}
}
}
diff --git a/crates/jacquard-api/lexicons/app_juttu_articleLink.json b/crates/jacquard-api/lexicons/app_juttu_articleLink.json
new file mode 100644
index 00000000..48ec8171
--- /dev/null
+++ b/crates/jacquard-api/lexicons/app_juttu_articleLink.json
@@ -0,0 +1,41 @@
+{
+ "lexicon": 1,
+ "id": "app.juttu.articleLink",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "Maps a unique article ID to its Bluesky comments thread, preserving original creation time.",
+ "key": "any",
+ "record": {
+ "type": "object",
+ "required": [
+ "articleId",
+ "commentsThread",
+ "createdAt"
+ ],
+ "properties": {
+ "articleId": {
+ "type": "string",
+ "description": "The site-specific unique identifier for the article (e.g., slug).",
+ "maxLength": 300
+ },
+ "articleUrl": {
+ "type": "string",
+ "description": "The URL of the article.",
+ "format": "uri"
+ },
+ "commentsThread": {
+ "type": "ref",
+ "description": "A strong reference to the root post (e.g., app.bsky.feed.post) of the comments thread.",
+ "ref": "com.atproto.repo.strongRef"
+ },
+ "createdAt": {
+ "type": "string",
+ "description": "The original publication timestamp of the article.",
+ "format": "datetime"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/app_offprint_content.json b/crates/jacquard-api/lexicons/app_offprint_content.json
new file mode 100644
index 00000000..d39291a1
--- /dev/null
+++ b/crates/jacquard-api/lexicons/app_offprint_content.json
@@ -0,0 +1,38 @@
+{
+ "lexicon": 1,
+ "id": "app.offprint.content",
+ "defs": {
+ "main": {
+ "type": "object",
+ "required": [
+ "items"
+ ],
+ "properties": {
+ "items": {
+ "type": "array",
+ "description": "Required array of `app.offprint.block.*` unions.",
+ "items": {
+ "type": "union",
+ "refs": [
+ "app.offprint.block.text",
+ "app.offprint.block.heading",
+ "app.offprint.block.blockquote",
+ "app.offprint.block.callout",
+ "app.offprint.block.unorderedList",
+ "app.offprint.block.orderedList",
+ "app.offprint.block.todoList",
+ "app.offprint.block.image",
+ "app.offprint.block.imageGrid",
+ "app.offprint.block.button",
+ "app.offprint.block.codeBlock",
+ "app.offprint.block.horizontalRule",
+ "app.offprint.block.bskyPost",
+ "app.offprint.block.iframeEmbed",
+ "app.offprint.block.linkEmbed"
+ ]
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/app_offprint_document_article.json b/crates/jacquard-api/lexicons/app_offprint_document_article.json
new file mode 100644
index 00000000..38ed6772
--- /dev/null
+++ b/crates/jacquard-api/lexicons/app_offprint_document_article.json
@@ -0,0 +1,23 @@
+{
+ "lexicon": 1,
+ "id": "app.offprint.document.article",
+ "defs": {
+ "main": {
+ "type": "record",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [
+ "document"
+ ],
+ "properties": {
+ "document": {
+ "type": "string",
+ "description": "Required AT-URI to a `site.standard.document` compatible record. Used to display articles with-in a publication.",
+ "format": "at-uri"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/app_offprint_publication.json b/crates/jacquard-api/lexicons/app_offprint_publication.json
new file mode 100644
index 00000000..27fad369
--- /dev/null
+++ b/crates/jacquard-api/lexicons/app_offprint_publication.json
@@ -0,0 +1,23 @@
+{
+ "lexicon": 1,
+ "id": "app.offprint.publication",
+ "defs": {
+ "main": {
+ "type": "record",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [
+ "publication"
+ ],
+ "properties": {
+ "publication": {
+ "type": "string",
+ "description": "Required AT-URI to a `site.standard.publication` compatible record.",
+ "format": "at-uri"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/blog_pckt_content.json b/crates/jacquard-api/lexicons/blog_pckt_content.json
new file mode 100644
index 00000000..007fbc58
--- /dev/null
+++ b/crates/jacquard-api/lexicons/blog_pckt_content.json
@@ -0,0 +1,23 @@
+{
+ "lexicon": 1,
+ "id": "blog.pckt.content",
+ "defs": {
+ "main": {
+ "type": "object",
+ "required": [
+ "items"
+ ],
+ "properties": {
+ "items": {
+ "type": "array",
+ "description": "Array of content blocks",
+ "items": {
+ "type": "union",
+ "refs": [],
+ "closed": false
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/blue_atplay_score_defs.json b/crates/jacquard-api/lexicons/blue_atplay_score_defs.json
new file mode 100644
index 00000000..263c1b5d
--- /dev/null
+++ b/crates/jacquard-api/lexicons/blue_atplay_score_defs.json
@@ -0,0 +1,31 @@
+{
+ "lexicon": 1,
+ "id": "blue.atplay.score.defs",
+ "defs": {
+ "attestation": {
+ "type": "object",
+ "description": "Attestation signature proving a score was submitted through ATPlay SDK",
+ "required": [
+ "key",
+ "signature"
+ ],
+ "properties": {
+ "attestedAt": {
+ "type": "string",
+ "description": "Timestamp when the attestation was created (optional)",
+ "format": "datetime"
+ },
+ "key": {
+ "type": "string",
+ "description": "DID key reference for verifying the signature",
+ "maxLength": 512
+ },
+ "signature": {
+ "type": "bytes",
+ "description": "ES256 signature over the score record CID",
+ "maxLength": 8192
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/blue_skytalk_talk_thread.json b/crates/jacquard-api/lexicons/blue_skytalk_talk_thread.json
new file mode 100644
index 00000000..86767c30
--- /dev/null
+++ b/crates/jacquard-api/lexicons/blue_skytalk_talk_thread.json
@@ -0,0 +1,42 @@
+{
+ "lexicon": 1,
+ "id": "blue.skytalk.talk.thread",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "A thread in a channel",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [
+ "channelId",
+ "title",
+ "createdAt"
+ ],
+ "properties": {
+ "channelId": {
+ "type": "string",
+ "description": "The channel this thread belongs to"
+ },
+ "createdAt": {
+ "type": "string",
+ "description": "Timestamp of thread creation",
+ "format": "datetime"
+ },
+ "text": {
+ "type": "string",
+ "description": "The text content of the thread",
+ "maxLength": 4000,
+ "maxGraphemes": 40000
+ },
+ "title": {
+ "type": "string",
+ "description": "The title of the thread",
+ "maxLength": 300,
+ "maxGraphemes": 3000
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/cat_vt3e_gallery_group.json b/crates/jacquard-api/lexicons/cat_vt3e_gallery_group.json
new file mode 100644
index 00000000..b5845fd7
--- /dev/null
+++ b/crates/jacquard-api/lexicons/cat_vt3e_gallery_group.json
@@ -0,0 +1,31 @@
+{
+ "lexicon": 1,
+ "id": "cat.vt3e.gallery.group",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "defines a group of images in the gallery",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [
+ "createdAt"
+ ],
+ "properties": {
+ "createdAt": {
+ "type": "string",
+ "format": "datetime"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 1000
+ },
+ "title": {
+ "type": "string",
+ "maxLength": 300
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/cat_vt3e_gallery_groupItem.json b/crates/jacquard-api/lexicons/cat_vt3e_gallery_groupItem.json
new file mode 100644
index 00000000..e5559236
--- /dev/null
+++ b/crates/jacquard-api/lexicons/cat_vt3e_gallery_groupItem.json
@@ -0,0 +1,38 @@
+{
+ "lexicon": 1,
+ "id": "cat.vt3e.gallery.groupItem",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "defines an item in a gallery group",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [
+ "group",
+ "image",
+ "addedAt"
+ ],
+ "properties": {
+ "addedAt": {
+ "type": "string",
+ "format": "datetime"
+ },
+ "group": {
+ "type": "string",
+ "description": "uri of the group that the image belongs to",
+ "format": "at-uri"
+ },
+ "image": {
+ "type": "string",
+ "description": "uri of the image that this item represents",
+ "format": "at-uri"
+ },
+ "note": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/cat_vt3e_gallery_image.json b/crates/jacquard-api/lexicons/cat_vt3e_gallery_image.json
new file mode 100644
index 00000000..89871d9e
--- /dev/null
+++ b/crates/jacquard-api/lexicons/cat_vt3e_gallery_image.json
@@ -0,0 +1,65 @@
+{
+ "lexicon": 1,
+ "id": "cat.vt3e.gallery.image",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "defines an image in the gallery",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [
+ "image",
+ "createdAt"
+ ],
+ "properties": {
+ "alt": {
+ "type": "string",
+ "maxLength": 2000
+ },
+ "aspectRatio": {
+ "type": "integer"
+ },
+ "blurhash": {
+ "type": "string",
+ "description": "provides a blurred preview of the image for use while loading, see github.com/woltapp/blurhash"
+ },
+ "caption": {
+ "type": "string",
+ "maxLength": 2000
+ },
+ "checksum": {
+ "type": "string"
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "datetime"
+ },
+ "dominantColour": {
+ "type": "string"
+ },
+ "height": {
+ "type": "integer"
+ },
+ "image": {
+ "type": "blob",
+ "accept": [
+ "image/*"
+ ],
+ "maxSize": 32000000
+ },
+ "sizeInBytes": {
+ "type": "integer"
+ },
+ "title": {
+ "type": "string",
+ "maxLength": 512
+ },
+ "width": {
+ "type": "integer"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/city_yoyle_status.json b/crates/jacquard-api/lexicons/city_yoyle_status.json
new file mode 100644
index 00000000..4cde4039
--- /dev/null
+++ b/crates/jacquard-api/lexicons/city_yoyle_status.json
@@ -0,0 +1,28 @@
+{
+ "lexicon": 1,
+ "id": "city.yoyle.status",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "Short status update",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [
+ "text"
+ ],
+ "properties": {
+ "createdAt": {
+ "type": "string",
+ "format": "datetime"
+ },
+ "text": {
+ "type": "string",
+ "maxLength": 3000,
+ "maxGraphemes": 300
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/community_lexicon_calendar_getEvent.json b/crates/jacquard-api/lexicons/community_lexicon_calendar_getEvent.json
new file mode 100644
index 00000000..1b2d7593
--- /dev/null
+++ b/crates/jacquard-api/lexicons/community_lexicon_calendar_getEvent.json
@@ -0,0 +1,71 @@
+{
+ "lexicon": 1,
+ "id": "community.lexicon.calendar.getEvent",
+ "defs": {
+ "eventView": {
+ "type": "object",
+ "description": "An event record with RSVP counts and URL.",
+ "required": [
+ "countGoing",
+ "countInterested",
+ "countNotGoing",
+ "url"
+ ],
+ "properties": {
+ "countGoing": {
+ "type": "integer",
+ "description": "Number of users who have RSVP'd as going."
+ },
+ "countInterested": {
+ "type": "integer",
+ "description": "Number of users who have RSVP'd as interested."
+ },
+ "countNotGoing": {
+ "type": "integer",
+ "description": "Number of users who have RSVP'd as not going."
+ },
+ "url": {
+ "type": "string",
+ "description": "The canonical URL for this event on Smoke Signal.",
+ "format": "uri"
+ }
+ }
+ },
+ "main": {
+ "type": "query",
+ "description": "Get a single event by repository and record key.",
+ "parameters": {
+ "type": "params",
+ "required": [
+ "repository",
+ "recordKey"
+ ],
+ "properties": {
+ "recordKey": {
+ "type": "string",
+ "description": "The record key (rkey) of the event.",
+ "maxLength": 150,
+ "maxGraphemes": 150
+ },
+ "repository": {
+ "type": "string",
+ "description": "The DID of the repository containing the event.",
+ "format": "did"
+ }
+ }
+ },
+ "output": {
+ "encoding": "application/json",
+ "schema": {
+ "type": "ref",
+ "ref": "#eventView"
+ }
+ },
+ "errors": [
+ {
+ "name": "NotFound"
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/community_lexicon_calendar_searchEvents.json b/crates/jacquard-api/lexicons/community_lexicon_calendar_searchEvents.json
new file mode 100644
index 00000000..da2d162d
--- /dev/null
+++ b/crates/jacquard-api/lexicons/community_lexicon_calendar_searchEvents.json
@@ -0,0 +1,99 @@
+{
+ "lexicon": 1,
+ "id": "community.lexicon.calendar.searchEvents",
+ "defs": {
+ "eventView": {
+ "type": "object",
+ "description": "An event record with RSVP counts and URL.",
+ "required": [
+ "countGoing",
+ "countInterested",
+ "countNotGoing",
+ "url"
+ ],
+ "properties": {
+ "countGoing": {
+ "type": "integer",
+ "description": "Number of users who have RSVP'd as going."
+ },
+ "countInterested": {
+ "type": "integer",
+ "description": "Number of users who have RSVP'd as interested."
+ },
+ "countNotGoing": {
+ "type": "integer",
+ "description": "Number of users who have RSVP'd as not going."
+ },
+ "url": {
+ "type": "string",
+ "description": "The canonical web URL for this event.",
+ "format": "uri"
+ }
+ }
+ },
+ "main": {
+ "type": "query",
+ "description": "Search for events. Supports full-text search, filtering by repository, and filtering by location CIDs.",
+ "parameters": {
+ "type": "params",
+ "properties": {
+ "limit": {
+ "type": "integer",
+ "description": "Maximum number of results to return.",
+ "default": 10,
+ "minimum": 1,
+ "maximum": 100
+ },
+ "location": {
+ "type": "array",
+ "description": "Filter events by location CIDs. Can be specified multiple times.",
+ "items": {
+ "type": "string",
+ "format": "cid"
+ }
+ },
+ "query": {
+ "type": "string",
+ "description": "Full-text search query.",
+ "maxLength": 150,
+ "maxGraphemes": 150
+ },
+ "repository": {
+ "type": "string",
+ "description": "Filter events by DID.",
+ "format": "did"
+ }
+ }
+ },
+ "output": {
+ "encoding": "application/json",
+ "schema": {
+ "type": "object",
+ "required": [
+ "results"
+ ],
+ "properties": {
+ "results": {
+ "type": "array",
+ "items": {
+ "type": "ref",
+ "ref": "#eventView"
+ }
+ }
+ }
+ }
+ },
+ "errors": [
+ {
+ "name": "InvalidRepository"
+ },
+ {
+ "name": "SearchUnavailable"
+ },
+ {
+ "name": "SearchError"
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/dev_baileytownsend_demo_example.json b/crates/jacquard-api/lexicons/dev_baileytownsend_demo_example.json
new file mode 100644
index 00000000..e2469b64
--- /dev/null
+++ b/crates/jacquard-api/lexicons/dev_baileytownsend_demo_example.json
@@ -0,0 +1,31 @@
+{
+ "lexicon": 1,
+ "id": "dev.baileytownsend.demo.example",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "An example record for showing permissions ets",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [
+ "name",
+ "createdAt"
+ ],
+ "properties": {
+ "createdAt": {
+ "type": "string",
+ "format": "datetime"
+ },
+ "name": {
+ "type": "string",
+ "description": "A name of something",
+ "minLength": 1,
+ "maxLength": 640,
+ "maxGraphemes": 64
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/dev_tsunagite_difficulty.json b/crates/jacquard-api/lexicons/dev_tsunagite_difficulty.json
new file mode 100644
index 00000000..5491c822
--- /dev/null
+++ b/crates/jacquard-api/lexicons/dev_tsunagite_difficulty.json
@@ -0,0 +1,29 @@
+{
+ "lexicon": 1,
+ "id": "dev.tsunagite.difficulty",
+ "description": "Definitions related to difficulty slots in games hosting leaderboards via Tsunagite.",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "A difficulty slot in a game hosting leaderboards via Tsunagite.",
+ "key": "any",
+ "record": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "color": {
+ "type": "string",
+ "description": "The hex code color of the difficulty slot."
+ },
+ "name": {
+ "type": "ref",
+ "description": "The human-readable name of the difficulty slot for use in UI.",
+ "ref": "dev.tsunagite.translatable"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/dev_tsunagite_game.json b/crates/jacquard-api/lexicons/dev_tsunagite_game.json
new file mode 100644
index 00000000..aae17393
--- /dev/null
+++ b/crates/jacquard-api/lexicons/dev_tsunagite_game.json
@@ -0,0 +1,204 @@
+{
+ "lexicon": 1,
+ "id": "dev.tsunagite.game",
+ "description": "Definitions related to games hosting leaderboards via Tunagite.",
+ "defs": {
+ "enum": {
+ "type": "object",
+ "description": "A closed set of indexable named values.",
+ "required": [
+ "name",
+ "id",
+ "values"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The internal ID of this component, limited to the RecordKey characterset.",
+ "format": "record-key",
+ "minLength": 1,
+ "maxLength": 32
+ },
+ "name": {
+ "type": "ref",
+ "description": "The human-readable name of this component in UI.",
+ "ref": "dev.tsunagite.translatable"
+ },
+ "values": {
+ "type": "array",
+ "description": "The allowed values for this enum to take.",
+ "items": {
+ "type": "ref",
+ "ref": "dev.tsunagite.types#indexable"
+ }
+ }
+ }
+ },
+ "main": {
+ "type": "record",
+ "description": "A record describing a game hosting leaderboards via Tsunagite.",
+ "key": "any",
+ "record": {
+ "type": "object",
+ "required": [
+ "name",
+ "judgments",
+ "scoreComponents",
+ "defaultComponent"
+ ],
+ "properties": {
+ "defaultComponent": {
+ "type": "string",
+ "description": "The default component for leaderboard sorting.",
+ "format": "record-key"
+ },
+ "inputMethods": {
+ "type": "array",
+ "description": "An array of usable input methods for the game. Optional if the game only has one input method or doesn't separate leaderboards by method.",
+ "items": {
+ "type": "string",
+ "description": "Can be tokens or raw strings.",
+ "knownValues": [
+ "dev.tsunagite.keyboard",
+ "dev.tsunagite.gamepad"
+ ]
+ }
+ },
+ "judgments": {
+ "type": "array",
+ "description": "The obtainable judgments during gameplay.",
+ "items": {
+ "type": "ref",
+ "description": "Indices will be displayed in ascending order.",
+ "ref": "dev.tsunagite.types#indexable"
+ }
+ },
+ "logo": {
+ "type": "blob",
+ "description": "The logo of the game, for display in UI.",
+ "accept": [
+ "image/png",
+ "image/jpeg",
+ "image/jxl",
+ "image/webp"
+ ],
+ "maxSize": 8000000
+ },
+ "modes": {
+ "type": "array",
+ "description": "An array of playable game modes with different gameplay configurations. Optional if the game only has one mode.",
+ "items": {
+ "type": "string",
+ "description": "Can be tokens or raw strings.",
+ "knownValues": [
+ "dev.tsunagite.singles",
+ "dev.tsunagite.doubles"
+ ]
+ }
+ },
+ "name": {
+ "type": "ref",
+ "description": "The human-readable name of the game, for display in UI.",
+ "ref": "dev.tsunagite.translatable"
+ },
+ "scoreComponents": {
+ "type": "array",
+ "description": "All the components of a score in the game, including grades, lamps, EX score, and whatever other constructs are used.",
+ "items": {
+ "type": "union",
+ "description": "If you need a component type that doesn't exist yet, contact @lemmaeof.gay",
+ "refs": [
+ "#enum",
+ "#points",
+ "#percentage",
+ "#text"
+ ]
+ }
+ }
+ }
+ }
+ },
+ "percentage": {
+ "type": "object",
+ "description": "A percentage score with customizable precision.",
+ "required": [
+ "name",
+ "id",
+ "maximum",
+ "precision"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The internal ID of this component, limited to the RecordKey characterset.",
+ "format": "record-key",
+ "minLength": 1,
+ "maxLength": 32
+ },
+ "maximum": {
+ "type": "integer",
+ "description": "The maximum allowed percentage for this score.",
+ "default": 100
+ },
+ "name": {
+ "type": "ref",
+ "description": "The human-readable name of this component in UI.",
+ "ref": "dev.tsunagite.translatable"
+ },
+ "precision": {
+ "type": "integer",
+ "description": "The number of decimal places to include in the percentage.",
+ "default": 2
+ }
+ }
+ },
+ "points": {
+ "type": "object",
+ "description": "An integer point score, with or without a cap.",
+ "required": [
+ "name",
+ "id"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The internal ID of this component, limited to the RecordKey characterset.",
+ "format": "record-key",
+ "minLength": 1,
+ "maxLength": 32
+ },
+ "maximum": {
+ "type": "integer",
+ "description": "The maximum allowed value for this score."
+ },
+ "name": {
+ "type": "ref",
+ "description": "The human-readable name of this component in UI.",
+ "ref": "dev.tsunagite.translatable"
+ }
+ }
+ },
+ "text": {
+ "type": "object",
+ "description": "A fallback component for displaying arbitrary text.",
+ "required": [
+ "name",
+ "id"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The internal ID of this component, limited to the RecordKey characterset.",
+ "format": "record-key",
+ "minLength": 1,
+ "maxLength": 32
+ },
+ "name": {
+ "type": "ref",
+ "description": "The human-readable name of this component in UI.",
+ "ref": "dev.tsunagite.translatable"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/dev_tsunagite_song.json b/crates/jacquard-api/lexicons/dev_tsunagite_song.json
new file mode 100644
index 00000000..cfd8b046
--- /dev/null
+++ b/crates/jacquard-api/lexicons/dev_tsunagite_song.json
@@ -0,0 +1,72 @@
+{
+ "lexicon": 1,
+ "id": "dev.tsunagite.song",
+ "description": "Definitions related to songs included in games hosting leaderboards via Tsunagite.",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "A song included in a game hosting leaderboards via Tsunagite.",
+ "key": "any",
+ "record": {
+ "type": "object",
+ "required": [
+ "game",
+ "title",
+ "composer"
+ ],
+ "properties": {
+ "composer": {
+ "type": "ref",
+ "description": "The name of the composer of this song. Translations will typically be listed alongside the default.",
+ "ref": "dev.tsunagite.translatable"
+ },
+ "game": {
+ "type": "array",
+ "description": "The game(s) this song is included in.",
+ "items": {
+ "type": "string",
+ "description": "All URIs must point to records of type `dev.tsunagite.game`.",
+ "format": "at-uri"
+ }
+ },
+ "genre": {
+ "type": "ref",
+ "description": "The genre this song belongs to.",
+ "ref": "dev.tsunagite.translatable"
+ },
+ "jacket": {
+ "type": "blob",
+ "description": "The jacket or banner art of this song, for display in UI.",
+ "accept": [
+ "image/png",
+ "image/jpeg",
+ "image/jxl",
+ "image/webp"
+ ],
+ "maxSize": 8000000
+ },
+ "jacketArtist": {
+ "type": "ref",
+ "description": "The name of the jacket artist for this song.",
+ "ref": "dev.tsunagite.translatable"
+ },
+ "source": {
+ "type": "ref",
+ "description": "The source this song is from - an album, competition, other game, etc.",
+ "ref": "dev.tsunagite.translatable"
+ },
+ "subtitle": {
+ "type": "ref",
+ "description": "The human-readable subtitle of this song.",
+ "ref": "dev.tsunagite.translatable"
+ },
+ "title": {
+ "type": "ref",
+ "description": "The human-readable title of this song in UI. Translations will typically be listed alongside the default.",
+ "ref": "dev.tsunagite.translatable"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/dev_tsunagite_types.json b/crates/jacquard-api/lexicons/dev_tsunagite_types.json
new file mode 100644
index 00000000..95d73be8
--- /dev/null
+++ b/crates/jacquard-api/lexicons/dev_tsunagite_types.json
@@ -0,0 +1,50 @@
+{
+ "lexicon": 1,
+ "id": "dev.tsunagite.types",
+ "description": "Assistant data types for Tsunagite lexicons.",
+ "defs": {
+ "indexable": {
+ "type": "object",
+ "description": "A named value with a numeric index for sorting.",
+ "required": [
+ "id",
+ "name",
+ "index"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "The internal ID for the value, limited to the RecordKey character set.",
+ "format": "record-key",
+ "minLength": 1,
+ "maxLength": 32
+ },
+ "index": {
+ "type": "integer",
+ "description": "The numeric index used for sorting."
+ },
+ "name": {
+ "type": "ref",
+ "description": "The human-readable name of the value for displaying in UIs.",
+ "ref": "dev.tsunagite.translatable"
+ }
+ }
+ },
+ "typedRef": {
+ "type": "object",
+ "description": "A typed record reference that does not require a CID hash.",
+ "properties": {
+ "ref": {
+ "type": "string",
+ "description": "The AT URI of the record this object references.",
+ "format": "at-uri"
+ },
+ "type": {
+ "type": "string",
+ "description": "The type of the record this object references.",
+ "format": "record-key"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/dev_vielle_guestbook_book.json b/crates/jacquard-api/lexicons/dev_vielle_guestbook_book.json
new file mode 100644
index 00000000..c6384609
--- /dev/null
+++ b/crates/jacquard-api/lexicons/dev_vielle_guestbook_book.json
@@ -0,0 +1,26 @@
+{
+ "lexicon": 1,
+ "id": "dev.vielle.guestbook.book",
+ "description": "Book for guesbook signing. dev.vielle.guestbook.entry records will refer to this. The rkey should be nsid (reverse dns) for the domain this is a guestbook for",
+ "defs": {
+ "main": {
+ "type": "record",
+ "key": "nsid",
+ "record": {
+ "type": "object",
+ "required": [
+ "site"
+ ],
+ "properties": {
+ "site": {
+ "type": "string",
+ "format": "uri"
+ },
+ "title": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/dev_vielle_guestbook_entry.json b/crates/jacquard-api/lexicons/dev_vielle_guestbook_entry.json
new file mode 100644
index 00000000..a6ce7099
--- /dev/null
+++ b/crates/jacquard-api/lexicons/dev_vielle_guestbook_entry.json
@@ -0,0 +1,27 @@
+{
+ "lexicon": 1,
+ "id": "dev.vielle.guestbook.entry",
+ "description": "Signature for a guestbook. This references the dev.vielle.guestbook.book record for the given website. The rkey should be nsid (reverse dns) for the domain this is a signature for",
+ "defs": {
+ "main": {
+ "type": "record",
+ "key": "nsid",
+ "record": {
+ "type": "object",
+ "required": [
+ "book",
+ "contents"
+ ],
+ "properties": {
+ "book": {
+ "type": "string",
+ "format": "at-uri"
+ },
+ "contents": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/events_smokesignal_calendar_acceptance.json b/crates/jacquard-api/lexicons/events_smokesignal_calendar_acceptance.json
new file mode 100644
index 00000000..a1baba3c
--- /dev/null
+++ b/crates/jacquard-api/lexicons/events_smokesignal_calendar_acceptance.json
@@ -0,0 +1,24 @@
+{
+ "lexicon": 1,
+ "id": "events.smokesignal.calendar.acceptance",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "A cryptographic proof record that contains RSVP acceptance data.",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [
+ "cid"
+ ],
+ "properties": {
+ "cid": {
+ "type": "string",
+ "description": "The CID (Content Identifier) of the rsvp that this proof validates.",
+ "format": "cid"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/events_smokesignal_lfg.json b/crates/jacquard-api/lexicons/events_smokesignal_lfg.json
new file mode 100644
index 00000000..a4c24f31
--- /dev/null
+++ b/crates/jacquard-api/lexicons/events_smokesignal_lfg.json
@@ -0,0 +1,59 @@
+{
+ "lexicon": 1,
+ "id": "events.smokesignal.lfg",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "A Looking For Group record that broadcasts interest in finding activity partners within a geographic area.",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [
+ "location",
+ "tags",
+ "startsAt",
+ "endsAt",
+ "createdAt",
+ "active"
+ ],
+ "properties": {
+ "active": {
+ "type": "boolean",
+ "description": "Whether the LFG is currently active and visible to others."
+ },
+ "createdAt": {
+ "type": "string",
+ "description": "Record creation timestamp.",
+ "format": "datetime"
+ },
+ "endsAt": {
+ "type": "string",
+ "description": "When the LFG expires and is no longer visible.",
+ "format": "datetime"
+ },
+ "location": {
+ "type": "ref",
+ "description": "The geographic location for activity partner matching.",
+ "ref": "community.lexicon.location#geo"
+ },
+ "startsAt": {
+ "type": "string",
+ "description": "When the LFG becomes active.",
+ "format": "datetime"
+ },
+ "tags": {
+ "type": "array",
+ "description": "Interest tags for matching with events and other users.",
+ "items": {
+ "type": "string",
+ "maxLength": 64,
+ "maxGraphemes": 64
+ },
+ "minLength": 1,
+ "maxLength": 10
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/events_smokesignal_profile.json b/crates/jacquard-api/lexicons/events_smokesignal_profile.json
new file mode 100644
index 00000000..42bf5c14
--- /dev/null
+++ b/crates/jacquard-api/lexicons/events_smokesignal_profile.json
@@ -0,0 +1,73 @@
+{
+ "lexicon": 1,
+ "id": "events.smokesignal.profile",
+ "defs": {
+ "forhire": {
+ "type": "token",
+ "description": "Indicates the identity is available for hire"
+ },
+ "hiring": {
+ "type": "token",
+ "description": "Indicates the identity is actively hiring"
+ },
+ "main": {
+ "type": "record",
+ "description": "A user profile for Smoke Signal",
+ "key": "literal:self",
+ "record": {
+ "type": "object",
+ "properties": {
+ "avatar": {
+ "type": "blob",
+ "description": "Small image to be displayed next to events. AKA, 'profile picture'",
+ "accept": [
+ "image/png",
+ "image/jpeg"
+ ],
+ "maxSize": 3000000
+ },
+ "banner": {
+ "type": "blob",
+ "description": "Larger horizontal image to display behind profile view.",
+ "accept": [
+ "image/png",
+ "image/jpeg"
+ ],
+ "maxSize": 3000000
+ },
+ "description": {
+ "type": "string",
+ "description": "A free text description of the identity.",
+ "maxLength": 2000,
+ "maxGraphemes": 2000
+ },
+ "displayName": {
+ "type": "string",
+ "description": "The display name of the identity.",
+ "maxLength": 200,
+ "maxGraphemes": 200
+ },
+ "facets": {
+ "type": "array",
+ "description": "Annotations of text (mentions, URLs, hashtags, etc) in the description.",
+ "items": {
+ "type": "ref",
+ "ref": "app.bsky.richtext.facet"
+ }
+ },
+ "profileHost": {
+ "type": "string",
+ "description": "The format used for profile links",
+ "maxLength": 60,
+ "maxGraphemes": 60,
+ "knownValues": [
+ "bsky.app",
+ "blacksky.community",
+ "aturi"
+ ]
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/fyi_questionable_actor_profile.json b/crates/jacquard-api/lexicons/fyi_questionable_actor_profile.json
index d14dab2f..c15e68fc 100644
--- a/crates/jacquard-api/lexicons/fyi_questionable_actor_profile.json
+++ b/crates/jacquard-api/lexicons/fyi_questionable_actor_profile.json
@@ -13,6 +13,11 @@
"type": "string",
"format": "datetime"
},
+ "description": {
+ "type": "string",
+ "maxLength": 2560,
+ "maxGraphemes": 256
+ },
"displayName": {
"type": "string",
"maxLength": 640,
diff --git a/crates/jacquard-api/lexicons/garden_lexicon_conquering-wolfhound_example.json b/crates/jacquard-api/lexicons/garden_lexicon_conquering-wolfhound_example.json
new file mode 100644
index 00000000..681465fd
--- /dev/null
+++ b/crates/jacquard-api/lexicons/garden_lexicon_conquering-wolfhound_example.json
@@ -0,0 +1,16 @@
+{
+ "lexicon": 1,
+ "id": "garden.lexicon.conquering-wolfhound.example",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "The Conquering Wolfhound!!!!!!",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [],
+ "properties": {}
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/garden_lexicon_example.json b/crates/jacquard-api/lexicons/garden_lexicon_example.json
new file mode 100644
index 00000000..3d21ea5a
--- /dev/null
+++ b/crates/jacquard-api/lexicons/garden_lexicon_example.json
@@ -0,0 +1,39 @@
+{
+ "lexicon": 1,
+ "id": "garden.lexicon.example",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "An example value for a lexicon schema",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [
+ "lexicon",
+ "value",
+ "createdAt"
+ ],
+ "properties": {
+ "createdAt": {
+ "type": "string",
+ "description": "The user-supplied date and time the example was created.",
+ "format": "datetime"
+ },
+ "description": {
+ "type": "string",
+ "description": "A description of the example."
+ },
+ "lexicon": {
+ "type": "string",
+ "description": "The NSID that the example is of.",
+ "format": "nsid"
+ },
+ "value": {
+ "type": "unknown",
+ "description": "The example itself."
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/garden_lexicon_joyous-grackle_example.json b/crates/jacquard-api/lexicons/garden_lexicon_joyous-grackle_example.json
new file mode 100644
index 00000000..1e7559e1
--- /dev/null
+++ b/crates/jacquard-api/lexicons/garden_lexicon_joyous-grackle_example.json
@@ -0,0 +1,16 @@
+{
+ "lexicon": 1,
+ "id": "garden.lexicon.joyous-grackle.example",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "My lexicon description",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [],
+ "properties": {}
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/garden_lexicon_lawyerlike-deangelo_example.json b/crates/jacquard-api/lexicons/garden_lexicon_lawyerlike-deangelo_example.json
new file mode 100644
index 00000000..bf0664d4
--- /dev/null
+++ b/crates/jacquard-api/lexicons/garden_lexicon_lawyerlike-deangelo_example.json
@@ -0,0 +1,16 @@
+{
+ "lexicon": 1,
+ "id": "garden.lexicon.lawyerlike-deangelo.example",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "My lexicon description",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [],
+ "properties": {}
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/garden_lexicon_service.json b/crates/jacquard-api/lexicons/garden_lexicon_service.json
new file mode 100644
index 00000000..5e750ab3
--- /dev/null
+++ b/crates/jacquard-api/lexicons/garden_lexicon_service.json
@@ -0,0 +1,103 @@
+{
+ "lexicon": 1,
+ "id": "garden.lexicon.service",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "Declares XRPC methods available on a DID document service. The rkey is the service fragment ID without the # prefix (e.g., 'atproto_pds' for '#atproto_pds').",
+ "key": "any",
+ "record": {
+ "type": "object",
+ "required": [
+ "serviceType"
+ ],
+ "properties": {
+ "description": {
+ "type": "string",
+ "description": "Description of what this service provides.",
+ "maxLength": 1000
+ },
+ "methods": {
+ "type": "array",
+ "description": "Methods available on this service.",
+ "items": {
+ "type": "ref",
+ "ref": "#method"
+ }
+ },
+ "serviceType": {
+ "type": "string",
+ "description": "The type of service being declared.",
+ "maxLength": 100
+ },
+ "urlTemplates": {
+ "type": "array",
+ "description": "URL templates for constructing web URLs from AT-URIs or record data. Useful for linking to web views of records.",
+ "items": {
+ "type": "ref",
+ "ref": "#urlTemplate"
+ }
+ }
+ }
+ }
+ },
+ "method": {
+ "type": "object",
+ "required": [
+ "lexicon"
+ ],
+ "properties": {
+ "authMethods": {
+ "type": "array",
+ "description": "Authentication methods supported by this method.",
+ "items": {
+ "type": "string",
+ "maxLength": 50,
+ "knownValues": [
+ "none",
+ "atproto.admin",
+ "atproto.bearer",
+ "atproto.oauth",
+ "atproto.inter-service"
+ ]
+ }
+ },
+ "deprecated": {
+ "type": "boolean",
+ "description": "Whether this method is deprecated and should no longer be used."
+ },
+ "lexicon": {
+ "type": "string",
+ "description": "AT-URI pointing to a lexicon schema that defines this method.",
+ "format": "at-uri"
+ }
+ }
+ },
+ "urlTemplate": {
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "properties": {
+ "collections": {
+ "type": "array",
+ "description": "NSIDs of collections this URL template applies to.",
+ "items": {
+ "type": "string",
+ "format": "nsid"
+ }
+ },
+ "description": {
+ "type": "string",
+ "description": "Description of what this URL template is for.",
+ "maxLength": 1000
+ },
+ "url": {
+ "type": "string",
+ "description": "URI template with placeholders for record data",
+ "maxLength": 2000
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/garden_lexicon_stunning-leafcutter_example.json b/crates/jacquard-api/lexicons/garden_lexicon_stunning-leafcutter_example.json
new file mode 100644
index 00000000..fd1b462a
--- /dev/null
+++ b/crates/jacquard-api/lexicons/garden_lexicon_stunning-leafcutter_example.json
@@ -0,0 +1,16 @@
+{
+ "lexicon": 1,
+ "id": "garden.lexicon.stunning-leafcutter.example",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "My lexicon description",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [],
+ "properties": {}
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/garden_lexicon_unconquered-modesto_example.json b/crates/jacquard-api/lexicons/garden_lexicon_unconquered-modesto_example.json
new file mode 100644
index 00000000..dc7ed3bd
--- /dev/null
+++ b/crates/jacquard-api/lexicons/garden_lexicon_unconquered-modesto_example.json
@@ -0,0 +1,22 @@
+{
+ "lexicon": 1,
+ "id": "garden.lexicon.unconquered-modesto.example",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "My lexicon description",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [
+ "message2"
+ ],
+ "properties": {
+ "message2": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/io_atcr_hold_stats.json b/crates/jacquard-api/lexicons/io_atcr_hold_stats.json
new file mode 100644
index 00000000..ffd4bd68
--- /dev/null
+++ b/crates/jacquard-api/lexicons/io_atcr_hold_stats.json
@@ -0,0 +1,58 @@
+{
+ "lexicon": 1,
+ "id": "io.atcr.hold.stats",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "Repository statistics stored in the hold's embedded PDS. Tracks pull/push counts per owner+repository combination. Record key is deterministic: base32(sha256(ownerDID + \"/\" + repository)[:16]).",
+ "key": "any",
+ "record": {
+ "type": "object",
+ "required": [
+ "ownerDid",
+ "repository",
+ "pullCount",
+ "pushCount",
+ "updatedAt"
+ ],
+ "properties": {
+ "lastPull": {
+ "type": "string",
+ "description": "RFC3339 timestamp of last pull",
+ "format": "datetime"
+ },
+ "lastPush": {
+ "type": "string",
+ "description": "RFC3339 timestamp of last push",
+ "format": "datetime"
+ },
+ "ownerDid": {
+ "type": "string",
+ "description": "DID of the image owner (e.g., did:plc:xyz123)",
+ "format": "did"
+ },
+ "pullCount": {
+ "type": "integer",
+ "description": "Number of manifest downloads",
+ "minimum": 0
+ },
+ "pushCount": {
+ "type": "integer",
+ "description": "Number of manifest uploads",
+ "minimum": 0
+ },
+ "repository": {
+ "type": "string",
+ "description": "Repository name (e.g., myapp)",
+ "maxLength": 256
+ },
+ "updatedAt": {
+ "type": "string",
+ "description": "RFC3339 timestamp of when this record was last updated",
+ "format": "datetime"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/io_whiteley_ATlas_pin.json b/crates/jacquard-api/lexicons/io_whiteley_ATlas_pin.json
new file mode 100644
index 00000000..176d7108
--- /dev/null
+++ b/crates/jacquard-api/lexicons/io_whiteley_ATlas_pin.json
@@ -0,0 +1,47 @@
+{
+ "lexicon": 1,
+ "id": "io.whiteley.ATlas.pin",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "A user's geographical pin on the atlas",
+ "key": "literal:self",
+ "record": {
+ "type": "object",
+ "required": [
+ "did",
+ "longitude",
+ "latitude",
+ "description",
+ "placedAt"
+ ],
+ "properties": {
+ "description": {
+ "type": "string",
+ "maxLength": 256
+ },
+ "did": {
+ "type": "string",
+ "format": "did"
+ },
+ "latitude": {
+ "type": "string",
+ "maxLength": 32
+ },
+ "longitude": {
+ "type": "string",
+ "maxLength": 32
+ },
+ "placedAt": {
+ "type": "string",
+ "format": "datetime"
+ },
+ "website": {
+ "type": "string",
+ "maxLength": 256
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/net_asadaame5121_at-circle_request.json b/crates/jacquard-api/lexicons/net_asadaame5121_at-circle_request.json
new file mode 100644
index 00000000..20639855
--- /dev/null
+++ b/crates/jacquard-api/lexicons/net_asadaame5121_at-circle_request.json
@@ -0,0 +1,52 @@
+{
+ "lexicon": 1,
+ "id": "net.asadaame5121.at-circle.request",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "A request to join a webring",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [
+ "ring",
+ "siteUrl",
+ "siteTitle",
+ "createdAt"
+ ],
+ "properties": {
+ "createdAt": {
+ "type": "string",
+ "format": "datetime"
+ },
+ "message": {
+ "type": "string",
+ "description": "Introduction message",
+ "maxLength": 1000,
+ "maxGraphemes": 100
+ },
+ "ring": {
+ "type": "ref",
+ "ref": "net.asadaame5121.at-circle.defs#ringRef"
+ },
+ "rssUrl": {
+ "type": "string",
+ "description": "RSS feed URL of the site",
+ "format": "uri"
+ },
+ "siteTitle": {
+ "type": "string",
+ "description": "Title of the site",
+ "maxLength": 1000,
+ "maxGraphemes": 100
+ },
+ "siteUrl": {
+ "type": "string",
+ "description": "URL of the site to register",
+ "format": "uri"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/org_okazu-diary_feed_entry.json b/crates/jacquard-api/lexicons/org_okazu-diary_feed_entry.json
index c0070825..d7098a58 100644
--- a/crates/jacquard-api/lexicons/org_okazu-diary_feed_entry.json
+++ b/crates/jacquard-api/lexicons/org_okazu-diary_feed_entry.json
@@ -23,7 +23,7 @@
},
"labels": {
"type": "union",
- "description": "General-purpose self-label values primarily for consumption by generic AT clients who may not expect the sensitive nature of this Lexicon. Publishers of this record are strongly recommended to always include at least one of the protocol-global label values; namely, `porn`, `sexual`, `graphic-media`, and `nudity`, unless the subjects, tags, and the note are all known to be safe by themselves. It is the safest to unconditionally include the `sexual` value, which has the `adultOnly` semantics, but it is acceptable to use a stronger (`porn`/`graphic-media`) or more moderate (`nudity`) value instead if the user decides so. To put warnings on the subject even for explicit users of the Okazu-Diary.org application, put self-labels in the `labels` property value of individual `subject` values as well.",
+ "description": "Self-label values for this post. Effectively content warnings for the note and tags.",
"refs": [
"com.atproto.label.defs#selfLabels"
]
@@ -36,25 +36,25 @@
},
"subjects": {
"type": "array",
- "description": "Materials used for gratification. Leave the array empty if it is known that there is no applicable material. Omit the property if the materials are uncertain.",
+ "description": "References to `org.okazu-diary.material.external` records associated with the activity. Leave the array empty if it is known that there is no applicable material. Omit the property if the materials are uncertain. Although this property uses a `strongRef` to make a reference to an external repository reliable to some extent, it is recommended that you copy the record to your own repository if you want to reference a record from another repository.",
"items": {
"type": "ref",
- "ref": "org.okazu-diary.feed.defs#subject"
+ "ref": "com.atproto.repo.strongRef"
},
"maxLength": 16
},
"tags": {
"type": "array",
- "description": "User-specified tags for the entry.",
+ "description": "User-specified tags for the activity.",
"items": {
"type": "ref",
- "ref": "org.okazu-diary.feed.defs#tag"
+ "ref": "org.okazu-diary.material.defs#tag"
},
"maxLength": 64
},
"via": {
"type": "ref",
- "description": "Reference to another `org.okazu-diary.feed.entry` record or an `org.okazu-diary.feed.collectionItem` record whose `subjects` this collection item is derived from.",
+ "description": "Reference to another `org.okazu-diary.feed.entry` record or an `org.okazu-diary.material.collectionItem` record from this entry is derived.",
"ref": "com.atproto.repo.strongRef"
},
"visibility": {
diff --git a/crates/jacquard-api/lexicons/org_okazu-diary_material_collection.json b/crates/jacquard-api/lexicons/org_okazu-diary_material_collection.json
new file mode 100644
index 00000000..7e9b261f
--- /dev/null
+++ b/crates/jacquard-api/lexicons/org_okazu-diary_material_collection.json
@@ -0,0 +1,41 @@
+{
+ "lexicon": 1,
+ "id": "org.okazu-diary.material.collection",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "Record representing a user-curated colleciton of materials.",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [
+ "createdAt"
+ ],
+ "properties": {
+ "createdAt": {
+ "type": "string",
+ "format": "datetime"
+ },
+ "description": {
+ "type": "string",
+ "maxLength": 3000,
+ "maxGraphemes": 300
+ },
+ "labels": {
+ "type": "union",
+ "description": "General-purpose self-label values primarily for consumption by generic AT clients. See the `labels` property of `org.okazu-diary.feed.entry` for details.",
+ "refs": [
+ "com.atproto.label.defs#selfLabels"
+ ]
+ },
+ "name": {
+ "type": "string",
+ "description": "Display name for the collection.",
+ "minLength": 1,
+ "maxLength": 64
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/org_okazu-diary_material_collectionItem.json b/crates/jacquard-api/lexicons/org_okazu-diary_material_collectionItem.json
new file mode 100644
index 00000000..9558ba91
--- /dev/null
+++ b/crates/jacquard-api/lexicons/org_okazu-diary_material_collectionItem.json
@@ -0,0 +1,51 @@
+{
+ "lexicon": 1,
+ "id": "org.okazu-diary.material.collectionItem",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "Record declaring the inclusion of a single material or a set of materials in a specific collection.",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [
+ "collection",
+ "subjects",
+ "createdAt"
+ ],
+ "properties": {
+ "collection": {
+ "type": "string",
+ "description": "Reference to the collection record (`org.okazu-diary.feed.collection`).",
+ "format": "at-uri"
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "datetime"
+ },
+ "note": {
+ "type": "string",
+ "description": "Remarks on the collection item.",
+ "maxLength": 5000,
+ "maxGraphemes": 500
+ },
+ "subjects": {
+ "type": "array",
+ "description": "Reference(s) to a material or set of materials (`org.okazu-diary.material.external`) to be included in the collection.",
+ "items": {
+ "type": "string",
+ "format": "at-uri"
+ },
+ "minLength": 1,
+ "maxLength": 16
+ },
+ "via": {
+ "type": "ref",
+ "description": "Reference to an `org.okazu-diary.feed.entry` record or an `org.okazu-diary.material.collectionItem` of another collection from which this collection item is derived.",
+ "ref": "com.atproto.repo.strongRef"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/org_okazu-diary_material_defs.json b/crates/jacquard-api/lexicons/org_okazu-diary_material_defs.json
new file mode 100644
index 00000000..dda52007
--- /dev/null
+++ b/crates/jacquard-api/lexicons/org_okazu-diary_material_defs.json
@@ -0,0 +1,19 @@
+{
+ "lexicon": 1,
+ "id": "org.okazu-diary.material.defs",
+ "defs": {
+ "tag": {
+ "type": "object",
+ "required": [
+ "value"
+ ],
+ "properties": {
+ "value": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 256
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/org_okazu-diary_material_external.json b/crates/jacquard-api/lexicons/org_okazu-diary_material_external.json
new file mode 100644
index 00000000..dd086766
--- /dev/null
+++ b/crates/jacquard-api/lexicons/org_okazu-diary_material_external.json
@@ -0,0 +1,83 @@
+{
+ "lexicon": 1,
+ "id": "org.okazu-diary.material.external",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "A descriptor of a pornographic material.",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "properties": {
+ "description": {
+ "type": "string",
+ "description": "Description of the material, typically taken from the material's HTML metadata."
+ },
+ "genericLabels": {
+ "type": "union",
+ "description": "General-purpose self-label values primarily for consumption by generic AT clients who may not expect the sensitive nature of this Lexicon. Publishers of this record are strongly recommended to always include at least one of the protocol-global label values; namely, `porn`, `sexual`, `graphic-media`, and `nudity`, unless the material and tags are all known to be safe by themselves. It is the safest to unconditionally include the `sexual` value, which has the `adultOnly` semantics, but it is acceptable to use a stronger (`porn`/`graphic-media`) or more moderate (`nudity`) value instead if the user decides so.",
+ "refs": [
+ "com.atproto.label.defs#selfLabels"
+ ]
+ },
+ "labels": {
+ "type": "union",
+ "description": "User-specified self-label values for the material. While the Lexicon by its nature assumes the material to be possibly sensitive by default, these label values are intended to signal that a warning should be put on the material even for the explicit Okazu-Diary.org application users who are willing to see mature contents in general.",
+ "refs": [
+ "com.atproto.label.defs#selfLabels"
+ ]
+ },
+ "record": {
+ "type": "ref",
+ "description": "Reference to a record representing the material, such as a Bluesky post.",
+ "ref": "com.atproto.repo.strongRef"
+ },
+ "tags": {
+ "type": "array",
+ "description": "User-specified tags for the material.",
+ "items": {
+ "type": "ref",
+ "ref": "org.okazu-diary.material.defs#tag"
+ },
+ "maxLength": 64
+ },
+ "thumb": {
+ "type": "ref",
+ "description": "Link to a thumbnail of the material, typically taken from the material's HTML metadata.",
+ "ref": "#thumb"
+ },
+ "title": {
+ "type": "string",
+ "description": "Title of the material, typically taken from the material's HTML `
` element."
+ },
+ "uri": {
+ "type": "string",
+ "description": "URI of the material, typically an HTTP(S) URL. If the URL is of a Web interface for an AT resource (such as a `bsky.app` URL), the record should also include the `record` property referencing the AT resource.",
+ "format": "uri"
+ },
+ "via": {
+ "type": "ref",
+ "description": "Reference to an `org.okazu-diary.feed.material` record from another repository from which this collection item is derived. Clients can use this property to offer the user to update this record if the original record have updated from the referenced version.",
+ "ref": "com.atproto.repo.strongRef"
+ }
+ }
+ }
+ },
+ "thumb": {
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "properties": {
+ "cid": {
+ "type": "string",
+ "format": "cid"
+ },
+ "url": {
+ "type": "string",
+ "format": "uri"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/org_stormlightlabs_malfestio_deck.json b/crates/jacquard-api/lexicons/org_stormlightlabs_malfestio_deck.json
new file mode 100644
index 00000000..adc99fb2
--- /dev/null
+++ b/crates/jacquard-api/lexicons/org_stormlightlabs_malfestio_deck.json
@@ -0,0 +1,84 @@
+{
+ "lexicon": 1,
+ "id": "org.stormlightlabs.malfestio.deck",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "A collection of flashcards and sources.",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [
+ "title",
+ "createdAt"
+ ],
+ "properties": {
+ "cardRefs": {
+ "type": "array",
+ "description": "Ordered list of references to cards in this deck.",
+ "items": {
+ "type": "string",
+ "format": "at-uri"
+ }
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "datetime"
+ },
+ "description": {
+ "type": "string",
+ "description": "Description of the deck context.",
+ "maxLength": 3000
+ },
+ "language": {
+ "type": "string",
+ "description": "Language code for the deck content (e.g., 'en', 'es', 'fr').",
+ "maxLength": 20
+ },
+ "license": {
+ "type": "string",
+ "description": "License for the deck content.",
+ "maxLength": 500
+ },
+ "sourceRefs": {
+ "type": "array",
+ "description": "References to source materials (articles, lectures) used in this deck.",
+ "items": {
+ "type": "string",
+ "format": "at-uri"
+ }
+ },
+ "tags": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "maxLength": 100
+ },
+ "maxLength": 64
+ },
+ "title": {
+ "type": "string",
+ "description": "Title of the deck.",
+ "maxLength": 300
+ },
+ "updatedAt": {
+ "type": "string",
+ "description": "Timestamp of last update.",
+ "format": "datetime"
+ },
+ "visibility": {
+ "type": "string",
+ "description": "Visibility setting for the deck.",
+ "default": "public",
+ "maxLength": 100,
+ "knownValues": [
+ "private",
+ "unlisted",
+ "public"
+ ]
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/org_stormlightlabs_malfestio_thread_comment.json b/crates/jacquard-api/lexicons/org_stormlightlabs_malfestio_thread_comment.json
new file mode 100644
index 00000000..004e39b9
--- /dev/null
+++ b/crates/jacquard-api/lexicons/org_stormlightlabs_malfestio_thread_comment.json
@@ -0,0 +1,40 @@
+{
+ "lexicon": 1,
+ "id": "org.stormlightlabs.malfestio.thread.comment",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "A comment on a deck, card, or note.",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [
+ "subjectRef",
+ "body",
+ "createdAt"
+ ],
+ "properties": {
+ "body": {
+ "type": "string",
+ "description": "The comment text.",
+ "maxLength": 5000
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "datetime"
+ },
+ "replyTo": {
+ "type": "string",
+ "description": "The parent comment if this is a reply.",
+ "format": "at-uri"
+ },
+ "subjectRef": {
+ "type": "string",
+ "description": "The root subject being commented on.",
+ "format": "at-uri"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/place_stream_branding_deleteBlob.json b/crates/jacquard-api/lexicons/place_stream_branding_deleteBlob.json
new file mode 100644
index 00000000..9fc20c38
--- /dev/null
+++ b/crates/jacquard-api/lexicons/place_stream_branding_deleteBlob.json
@@ -0,0 +1,54 @@
+{
+ "lexicon": 1,
+ "id": "place.stream.branding.deleteBlob",
+ "defs": {
+ "main": {
+ "type": "procedure",
+ "description": "Delete a branding asset blob. Requires admin authorization.",
+ "input": {
+ "encoding": "application/json",
+ "schema": {
+ "type": "object",
+ "required": [
+ "key"
+ ],
+ "properties": {
+ "broadcaster": {
+ "type": "string",
+ "description": "DID of the broadcaster. If not provided, uses the server's default broadcaster.",
+ "format": "did"
+ },
+ "key": {
+ "type": "string",
+ "description": "Branding asset key (mainLogo, favicon, siteTitle, etc.)"
+ }
+ }
+ }
+ },
+ "output": {
+ "encoding": "application/json",
+ "schema": {
+ "type": "object",
+ "required": [
+ "success"
+ ],
+ "properties": {
+ "success": {
+ "type": "boolean"
+ }
+ }
+ }
+ },
+ "errors": [
+ {
+ "description": "The authenticated DID is not authorized to modify branding",
+ "name": "Unauthorized"
+ },
+ {
+ "description": "The requested branding asset does not exist",
+ "name": "BrandingNotFound"
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/place_stream_branding_getBlob.json b/crates/jacquard-api/lexicons/place_stream_branding_getBlob.json
new file mode 100644
index 00000000..fcf298ce
--- /dev/null
+++ b/crates/jacquard-api/lexicons/place_stream_branding_getBlob.json
@@ -0,0 +1,37 @@
+{
+ "lexicon": 1,
+ "id": "place.stream.branding.getBlob",
+ "defs": {
+ "main": {
+ "type": "query",
+ "description": "Get a specific branding asset blob by key.",
+ "parameters": {
+ "type": "params",
+ "required": [
+ "key"
+ ],
+ "properties": {
+ "broadcaster": {
+ "type": "string",
+ "description": "DID of the broadcaster. If not provided, uses the server's default broadcaster.",
+ "format": "did"
+ },
+ "key": {
+ "type": "string",
+ "description": "Branding asset key (mainLogo, favicon, siteTitle, etc.)"
+ }
+ }
+ },
+ "output": {
+ "description": "Raw blob data with appropriate content-type",
+ "encoding": "*/*"
+ },
+ "errors": [
+ {
+ "description": "The requested branding asset does not exist",
+ "name": "BrandingNotFound"
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/place_stream_branding_getBranding.json b/crates/jacquard-api/lexicons/place_stream_branding_getBranding.json
new file mode 100644
index 00000000..c8c5915e
--- /dev/null
+++ b/crates/jacquard-api/lexicons/place_stream_branding_getBranding.json
@@ -0,0 +1,74 @@
+{
+ "lexicon": 1,
+ "id": "place.stream.branding.getBranding",
+ "defs": {
+ "brandingAsset": {
+ "type": "object",
+ "required": [
+ "key",
+ "mimeType"
+ ],
+ "properties": {
+ "data": {
+ "type": "string",
+ "description": "Inline data for text assets"
+ },
+ "height": {
+ "type": "integer",
+ "description": "Image height in pixels (optional, for images only)"
+ },
+ "key": {
+ "type": "string",
+ "description": "Asset key identifier"
+ },
+ "mimeType": {
+ "type": "string",
+ "description": "MIME type of the asset"
+ },
+ "url": {
+ "type": "string",
+ "description": "URL to fetch the asset blob (for images)"
+ },
+ "width": {
+ "type": "integer",
+ "description": "Image width in pixels (optional, for images only)"
+ }
+ }
+ },
+ "main": {
+ "type": "query",
+ "description": "Get all branding configuration for the broadcaster.",
+ "parameters": {
+ "type": "params",
+ "required": [],
+ "properties": {
+ "broadcaster": {
+ "type": "string",
+ "description": "DID of the broadcaster. If not provided, uses the server's default broadcaster.",
+ "format": "did"
+ }
+ }
+ },
+ "output": {
+ "encoding": "application/json",
+ "schema": {
+ "type": "object",
+ "required": [
+ "assets"
+ ],
+ "properties": {
+ "assets": {
+ "type": "array",
+ "description": "List of available branding assets",
+ "items": {
+ "type": "ref",
+ "ref": "#brandingAsset"
+ }
+ }
+ }
+ }
+ },
+ "errors": []
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/place_stream_branding_updateBlob.json b/crates/jacquard-api/lexicons/place_stream_branding_updateBlob.json
new file mode 100644
index 00000000..3b86d8dc
--- /dev/null
+++ b/crates/jacquard-api/lexicons/place_stream_branding_updateBlob.json
@@ -0,0 +1,72 @@
+{
+ "lexicon": 1,
+ "id": "place.stream.branding.updateBlob",
+ "defs": {
+ "main": {
+ "type": "procedure",
+ "description": "Update or create a branding asset blob. Requires admin authorization.",
+ "input": {
+ "encoding": "application/json",
+ "schema": {
+ "type": "object",
+ "required": [
+ "key",
+ "data",
+ "mimeType"
+ ],
+ "properties": {
+ "broadcaster": {
+ "type": "string",
+ "description": "DID of the broadcaster. If not provided, uses the server's default broadcaster.",
+ "format": "did"
+ },
+ "data": {
+ "type": "string",
+ "description": "Base64-encoded blob data"
+ },
+ "height": {
+ "type": "integer",
+ "description": "Image height in pixels (optional, for images only)"
+ },
+ "key": {
+ "type": "string",
+ "description": "Branding asset key (mainLogo, favicon, siteTitle, etc.)"
+ },
+ "mimeType": {
+ "type": "string",
+ "description": "MIME type of the blob (e.g., image/png, text/plain)"
+ },
+ "width": {
+ "type": "integer",
+ "description": "Image width in pixels (optional, for images only)"
+ }
+ }
+ }
+ },
+ "output": {
+ "encoding": "application/json",
+ "schema": {
+ "type": "object",
+ "required": [
+ "success"
+ ],
+ "properties": {
+ "success": {
+ "type": "boolean"
+ }
+ }
+ }
+ },
+ "errors": [
+ {
+ "description": "The authenticated DID is not authorized to modify branding",
+ "name": "Unauthorized"
+ },
+ {
+ "description": "The blob exceeds the maximum size limit",
+ "name": "BlobTooLarge"
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/place_stream_broadcast_getBroadcaster.json b/crates/jacquard-api/lexicons/place_stream_broadcast_getBroadcaster.json
index a307f0ac..e5cd1e1e 100644
--- a/crates/jacquard-api/lexicons/place_stream_broadcast_getBroadcaster.json
+++ b/crates/jacquard-api/lexicons/place_stream_broadcast_getBroadcaster.json
@@ -7,7 +7,6 @@
"description": "Get information about a Streamplace broadcaster.",
"parameters": {
"type": "params",
- "required": [],
"properties": {}
},
"output": {
@@ -18,6 +17,14 @@
"broadcaster"
],
"properties": {
+ "admins": {
+ "type": "array",
+ "description": "Array of DIDs authorized as admins",
+ "items": {
+ "type": "string",
+ "format": "did"
+ }
+ },
"broadcaster": {
"type": "string",
"description": "DID of the Streamplace broadcaster to which this server belongs",
@@ -30,8 +37,7 @@
}
}
}
- },
- "errors": []
+ }
}
}
}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/place_stream_moderation_createBlock.json b/crates/jacquard-api/lexicons/place_stream_moderation_createBlock.json
new file mode 100644
index 00000000..eac11a74
--- /dev/null
+++ b/crates/jacquard-api/lexicons/place_stream_moderation_createBlock.json
@@ -0,0 +1,73 @@
+{
+ "lexicon": 1,
+ "id": "place.stream.moderation.createBlock",
+ "defs": {
+ "main": {
+ "type": "procedure",
+ "description": "Create a block (ban) on behalf of a streamer. Requires 'ban' permission. Creates an app.bsky.graph.block record in the streamer's repository.",
+ "input": {
+ "encoding": "application/json",
+ "schema": {
+ "type": "object",
+ "required": [
+ "streamer",
+ "subject"
+ ],
+ "properties": {
+ "reason": {
+ "type": "string",
+ "description": "Optional reason for the block.",
+ "maxLength": 300
+ },
+ "streamer": {
+ "type": "string",
+ "description": "The DID of the streamer whose chat this block applies to.",
+ "format": "did"
+ },
+ "subject": {
+ "type": "string",
+ "description": "The DID of the user being blocked from chat.",
+ "format": "did"
+ }
+ }
+ }
+ },
+ "output": {
+ "encoding": "application/json",
+ "schema": {
+ "type": "object",
+ "required": [
+ "uri",
+ "cid"
+ ],
+ "properties": {
+ "cid": {
+ "type": "string",
+ "description": "The CID of the created block record.",
+ "format": "cid"
+ },
+ "uri": {
+ "type": "string",
+ "description": "The AT-URI of the created block record.",
+ "format": "at-uri"
+ }
+ }
+ }
+ },
+ "errors": [
+ {
+ "description": "The request lacks valid authentication credentials.",
+ "name": "Unauthorized"
+ },
+ {
+ "description": "The caller does not have permission to create blocks for this streamer.",
+ "name": "Forbidden"
+ },
+ {
+ "description": "The streamer's OAuth session could not be found or is invalid.",
+ "name": "SessionNotFound"
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/place_stream_moderation_createGate.json b/crates/jacquard-api/lexicons/place_stream_moderation_createGate.json
new file mode 100644
index 00000000..ad0dd971
--- /dev/null
+++ b/crates/jacquard-api/lexicons/place_stream_moderation_createGate.json
@@ -0,0 +1,68 @@
+{
+ "lexicon": 1,
+ "id": "place.stream.moderation.createGate",
+ "defs": {
+ "main": {
+ "type": "procedure",
+ "description": "Create a gate (hide message) on behalf of a streamer. Requires 'hide' permission. Creates a place.stream.chat.gate record in the streamer's repository.",
+ "input": {
+ "encoding": "application/json",
+ "schema": {
+ "type": "object",
+ "required": [
+ "streamer",
+ "messageUri"
+ ],
+ "properties": {
+ "messageUri": {
+ "type": "string",
+ "description": "The AT-URI of the chat message to hide.",
+ "format": "at-uri"
+ },
+ "streamer": {
+ "type": "string",
+ "description": "The DID of the streamer.",
+ "format": "did"
+ }
+ }
+ }
+ },
+ "output": {
+ "encoding": "application/json",
+ "schema": {
+ "type": "object",
+ "required": [
+ "uri",
+ "cid"
+ ],
+ "properties": {
+ "cid": {
+ "type": "string",
+ "description": "The CID of the created gate record.",
+ "format": "cid"
+ },
+ "uri": {
+ "type": "string",
+ "description": "The AT-URI of the created gate record.",
+ "format": "at-uri"
+ }
+ }
+ }
+ },
+ "errors": [
+ {
+ "description": "The request lacks valid authentication credentials.",
+ "name": "Unauthorized"
+ },
+ {
+ "description": "The caller does not have permission to hide messages for this streamer.",
+ "name": "Forbidden"
+ },
+ {
+ "description": "The streamer's OAuth session could not be found or is invalid.",
+ "name": "SessionNotFound"
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/place_stream_moderation_defs.json b/crates/jacquard-api/lexicons/place_stream_moderation_defs.json
new file mode 100644
index 00000000..7f4f2f5f
--- /dev/null
+++ b/crates/jacquard-api/lexicons/place_stream_moderation_defs.json
@@ -0,0 +1,36 @@
+{
+ "lexicon": 1,
+ "id": "place.stream.moderation.defs",
+ "defs": {
+ "permissionView": {
+ "type": "object",
+ "required": [
+ "uri",
+ "cid",
+ "author",
+ "record"
+ ],
+ "properties": {
+ "author": {
+ "type": "ref",
+ "description": "The streamer who granted these permissions",
+ "ref": "app.bsky.actor.defs#profileViewBasic"
+ },
+ "cid": {
+ "type": "string",
+ "description": "Content identifier of the permission record",
+ "format": "cid"
+ },
+ "record": {
+ "type": "unknown",
+ "description": "The permission record itself"
+ },
+ "uri": {
+ "type": "string",
+ "description": "AT-URI of the permission record",
+ "format": "at-uri"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/place_stream_moderation_deleteBlock.json b/crates/jacquard-api/lexicons/place_stream_moderation_deleteBlock.json
new file mode 100644
index 00000000..902e082f
--- /dev/null
+++ b/crates/jacquard-api/lexicons/place_stream_moderation_deleteBlock.json
@@ -0,0 +1,53 @@
+{
+ "lexicon": 1,
+ "id": "place.stream.moderation.deleteBlock",
+ "defs": {
+ "main": {
+ "type": "procedure",
+ "description": "Delete a block (unban) on behalf of a streamer. Requires 'ban' permission. Deletes an app.bsky.graph.block record from the streamer's repository.",
+ "input": {
+ "encoding": "application/json",
+ "schema": {
+ "type": "object",
+ "required": [
+ "streamer",
+ "blockUri"
+ ],
+ "properties": {
+ "blockUri": {
+ "type": "string",
+ "description": "The AT-URI of the block record to delete.",
+ "format": "at-uri"
+ },
+ "streamer": {
+ "type": "string",
+ "description": "The DID of the streamer.",
+ "format": "did"
+ }
+ }
+ }
+ },
+ "output": {
+ "encoding": "application/json",
+ "schema": {
+ "type": "object",
+ "properties": {}
+ }
+ },
+ "errors": [
+ {
+ "description": "The request lacks valid authentication credentials.",
+ "name": "Unauthorized"
+ },
+ {
+ "description": "The caller does not have permission to delete blocks for this streamer.",
+ "name": "Forbidden"
+ },
+ {
+ "description": "The streamer's OAuth session could not be found or is invalid.",
+ "name": "SessionNotFound"
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/place_stream_moderation_deleteGate.json b/crates/jacquard-api/lexicons/place_stream_moderation_deleteGate.json
new file mode 100644
index 00000000..016b3d2b
--- /dev/null
+++ b/crates/jacquard-api/lexicons/place_stream_moderation_deleteGate.json
@@ -0,0 +1,53 @@
+{
+ "lexicon": 1,
+ "id": "place.stream.moderation.deleteGate",
+ "defs": {
+ "main": {
+ "type": "procedure",
+ "description": "Delete a gate (unhide message) on behalf of a streamer. Requires 'hide' permission. Deletes a place.stream.chat.gate record from the streamer's repository.",
+ "input": {
+ "encoding": "application/json",
+ "schema": {
+ "type": "object",
+ "required": [
+ "streamer",
+ "gateUri"
+ ],
+ "properties": {
+ "gateUri": {
+ "type": "string",
+ "description": "The AT-URI of the gate record to delete.",
+ "format": "at-uri"
+ },
+ "streamer": {
+ "type": "string",
+ "description": "The DID of the streamer.",
+ "format": "did"
+ }
+ }
+ }
+ },
+ "output": {
+ "encoding": "application/json",
+ "schema": {
+ "type": "object",
+ "properties": {}
+ }
+ },
+ "errors": [
+ {
+ "description": "The request lacks valid authentication credentials.",
+ "name": "Unauthorized"
+ },
+ {
+ "description": "The caller does not have permission to unhide messages for this streamer.",
+ "name": "Forbidden"
+ },
+ {
+ "description": "The streamer's OAuth session could not be found or is invalid.",
+ "name": "SessionNotFound"
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/place_stream_moderation_permission.json b/crates/jacquard-api/lexicons/place_stream_moderation_permission.json
new file mode 100644
index 00000000..4a1f5a18
--- /dev/null
+++ b/crates/jacquard-api/lexicons/place_stream_moderation_permission.json
@@ -0,0 +1,48 @@
+{
+ "lexicon": 1,
+ "id": "place.stream.moderation.permission",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "Record granting moderation permissions to a user for this streamer's content.",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [
+ "moderator",
+ "permissions",
+ "createdAt"
+ ],
+ "properties": {
+ "createdAt": {
+ "type": "string",
+ "description": "Client-declared timestamp when this moderator was added.",
+ "format": "datetime"
+ },
+ "expirationTime": {
+ "type": "string",
+ "description": "Optional expiration time for this delegation. If set, the delegation is invalid after this time.",
+ "format": "datetime"
+ },
+ "moderator": {
+ "type": "string",
+ "description": "The DID of the user granted moderator permissions.",
+ "format": "did"
+ },
+ "permissions": {
+ "type": "array",
+ "description": "Array of permissions granted to this moderator. 'ban' covers blocks/bans (with optional expiration), 'hide' covers message gates, 'livestream.manage' allows updating livestream metadata.",
+ "items": {
+ "type": "string",
+ "enum": [
+ "ban",
+ "hide",
+ "livestream.manage"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/place_stream_moderation_updateLivestream.json b/crates/jacquard-api/lexicons/place_stream_moderation_updateLivestream.json
new file mode 100644
index 00000000..00da97aa
--- /dev/null
+++ b/crates/jacquard-api/lexicons/place_stream_moderation_updateLivestream.json
@@ -0,0 +1,78 @@
+{
+ "lexicon": 1,
+ "id": "place.stream.moderation.updateLivestream",
+ "defs": {
+ "main": {
+ "type": "procedure",
+ "description": "Update livestream metadata on behalf of a streamer. Requires 'livestream.manage' permission. Updates a place.stream.livestream record in the streamer's repository.",
+ "input": {
+ "encoding": "application/json",
+ "schema": {
+ "type": "object",
+ "required": [
+ "streamer",
+ "livestreamUri"
+ ],
+ "properties": {
+ "livestreamUri": {
+ "type": "string",
+ "description": "The AT-URI of the livestream record to update.",
+ "format": "at-uri"
+ },
+ "streamer": {
+ "type": "string",
+ "description": "The DID of the streamer.",
+ "format": "did"
+ },
+ "title": {
+ "type": "string",
+ "description": "New title for the livestream.",
+ "maxLength": 1400,
+ "maxGraphemes": 140
+ }
+ }
+ }
+ },
+ "output": {
+ "encoding": "application/json",
+ "schema": {
+ "type": "object",
+ "required": [
+ "uri",
+ "cid"
+ ],
+ "properties": {
+ "cid": {
+ "type": "string",
+ "description": "The CID of the updated livestream record.",
+ "format": "cid"
+ },
+ "uri": {
+ "type": "string",
+ "description": "The AT-URI of the updated livestream record.",
+ "format": "at-uri"
+ }
+ }
+ }
+ },
+ "errors": [
+ {
+ "description": "The request lacks valid authentication credentials.",
+ "name": "Unauthorized"
+ },
+ {
+ "description": "The caller does not have permission to update livestream metadata for this streamer.",
+ "name": "Forbidden"
+ },
+ {
+ "description": "The streamer's OAuth session could not be found or is invalid.",
+ "name": "SessionNotFound"
+ },
+ {
+ "description": "The specified livestream record does not exist.",
+ "name": "RecordNotFound"
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/place_stream_multistream_createTarget.json b/crates/jacquard-api/lexicons/place_stream_multistream_createTarget.json
new file mode 100644
index 00000000..57497a6a
--- /dev/null
+++ b/crates/jacquard-api/lexicons/place_stream_multistream_createTarget.json
@@ -0,0 +1,38 @@
+{
+ "lexicon": 1,
+ "id": "place.stream.multistream.createTarget",
+ "defs": {
+ "main": {
+ "type": "procedure",
+ "description": "Create a new target for rebroadcasting a Streamplace stream.",
+ "input": {
+ "encoding": "application/json",
+ "schema": {
+ "type": "object",
+ "required": [
+ "multistreamTarget"
+ ],
+ "properties": {
+ "multistreamTarget": {
+ "type": "ref",
+ "ref": "place.stream.multistream.target"
+ }
+ }
+ }
+ },
+ "output": {
+ "encoding": "application/json",
+ "schema": {
+ "type": "ref",
+ "ref": "place.stream.multistream.defs#targetView"
+ }
+ },
+ "errors": [
+ {
+ "description": "The provided target URL is invalid or unreachable.",
+ "name": "InvalidTargetUrl"
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/place_stream_multistream_defs.json b/crates/jacquard-api/lexicons/place_stream_multistream_defs.json
new file mode 100644
index 00000000..e0dcee11
--- /dev/null
+++ b/crates/jacquard-api/lexicons/place_stream_multistream_defs.json
@@ -0,0 +1,57 @@
+{
+ "lexicon": 1,
+ "id": "place.stream.multistream.defs",
+ "defs": {
+ "event": {
+ "type": "object",
+ "required": [
+ "message",
+ "status",
+ "createdAt"
+ ],
+ "properties": {
+ "createdAt": {
+ "type": "string",
+ "format": "datetime"
+ },
+ "message": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string",
+ "enum": [
+ "inactive",
+ "pending",
+ "active",
+ "error"
+ ]
+ }
+ }
+ },
+ "targetView": {
+ "type": "object",
+ "required": [
+ "uri",
+ "cid",
+ "record"
+ ],
+ "properties": {
+ "cid": {
+ "type": "string",
+ "format": "cid"
+ },
+ "latestEvent": {
+ "type": "ref",
+ "ref": "place.stream.multistream.defs#event"
+ },
+ "record": {
+ "type": "unknown"
+ },
+ "uri": {
+ "type": "string",
+ "format": "at-uri"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/place_stream_multistream_deleteTarget.json b/crates/jacquard-api/lexicons/place_stream_multistream_deleteTarget.json
new file mode 100644
index 00000000..260063b9
--- /dev/null
+++ b/crates/jacquard-api/lexicons/place_stream_multistream_deleteTarget.json
@@ -0,0 +1,34 @@
+{
+ "lexicon": 1,
+ "id": "place.stream.multistream.deleteTarget",
+ "defs": {
+ "main": {
+ "type": "procedure",
+ "description": "Delete a target for rebroadcasting a Streamplace stream.",
+ "input": {
+ "encoding": "application/json",
+ "schema": {
+ "type": "object",
+ "required": [
+ "rkey"
+ ],
+ "properties": {
+ "rkey": {
+ "type": "string",
+ "description": "The Record Key of the target to delete.",
+ "format": "record-key"
+ }
+ }
+ }
+ },
+ "output": {
+ "encoding": "application/json",
+ "schema": {
+ "type": "object",
+ "properties": {}
+ }
+ },
+ "errors": []
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/place_stream_multistream_listTargets.json b/crates/jacquard-api/lexicons/place_stream_multistream_listTargets.json
new file mode 100644
index 00000000..b04089de
--- /dev/null
+++ b/crates/jacquard-api/lexicons/place_stream_multistream_listTargets.json
@@ -0,0 +1,68 @@
+{
+ "lexicon": 1,
+ "id": "place.stream.multistream.listTargets",
+ "defs": {
+ "main": {
+ "type": "query",
+ "description": "List a range of targets for rebroadcasting a Streamplace stream.",
+ "parameters": {
+ "type": "params",
+ "required": [],
+ "properties": {
+ "cursor": {
+ "type": "string"
+ },
+ "limit": {
+ "type": "integer",
+ "description": "The number of targets to return.",
+ "default": 50,
+ "minimum": 1,
+ "maximum": 100
+ }
+ }
+ },
+ "output": {
+ "encoding": "application/json",
+ "schema": {
+ "type": "object",
+ "required": [
+ "targets"
+ ],
+ "properties": {
+ "cursor": {
+ "type": "string"
+ },
+ "targets": {
+ "type": "array",
+ "items": {
+ "type": "ref",
+ "ref": "place.stream.multistream.defs#targetView"
+ }
+ }
+ }
+ }
+ }
+ },
+ "record": {
+ "type": "object",
+ "required": [
+ "uri",
+ "cid",
+ "value"
+ ],
+ "properties": {
+ "cid": {
+ "type": "string",
+ "format": "cid"
+ },
+ "uri": {
+ "type": "string",
+ "format": "at-uri"
+ },
+ "value": {
+ "type": "unknown"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/place_stream_multistream_putTarget.json b/crates/jacquard-api/lexicons/place_stream_multistream_putTarget.json
new file mode 100644
index 00000000..a4bd219d
--- /dev/null
+++ b/crates/jacquard-api/lexicons/place_stream_multistream_putTarget.json
@@ -0,0 +1,44 @@
+{
+ "lexicon": 1,
+ "id": "place.stream.multistream.putTarget",
+ "defs": {
+ "main": {
+ "type": "procedure",
+ "description": "Update an existing target for rebroadcasting a Streamplace stream.",
+ "input": {
+ "encoding": "application/json",
+ "schema": {
+ "type": "object",
+ "required": [
+ "multistreamTarget"
+ ],
+ "properties": {
+ "multistreamTarget": {
+ "type": "ref",
+ "ref": "place.stream.multistream.target"
+ },
+ "rkey": {
+ "type": "string",
+ "description": "The Record Key.",
+ "format": "record-key",
+ "maxLength": 512
+ }
+ }
+ }
+ },
+ "output": {
+ "encoding": "application/json",
+ "schema": {
+ "type": "ref",
+ "ref": "place.stream.multistream.defs#targetView"
+ }
+ },
+ "errors": [
+ {
+ "description": "The provided target URL is invalid or unreachable.",
+ "name": "InvalidTargetUrl"
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/place_stream_multistream_target.json b/crates/jacquard-api/lexicons/place_stream_multistream_target.json
new file mode 100644
index 00000000..b9f031d4
--- /dev/null
+++ b/crates/jacquard-api/lexicons/place_stream_multistream_target.json
@@ -0,0 +1,40 @@
+{
+ "lexicon": 1,
+ "id": "place.stream.multistream.target",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "An external server for rebroadcasting a Streamplace stream",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [
+ "url",
+ "active",
+ "createdAt"
+ ],
+ "properties": {
+ "active": {
+ "type": "boolean",
+ "description": "Whether this target is currently active."
+ },
+ "createdAt": {
+ "type": "string",
+ "description": "When this target was created.",
+ "format": "datetime"
+ },
+ "name": {
+ "type": "string",
+ "description": "A user-friendly name for this target.",
+ "maxLength": 100
+ },
+ "url": {
+ "type": "string",
+ "description": "The rtmp:// or rtmps:// url of the target server.",
+ "format": "uri"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/pub_leaflet_blocks_text.json b/crates/jacquard-api/lexicons/pub_leaflet_blocks_text.json
index 501a3985..773e00f8 100644
--- a/crates/jacquard-api/lexicons/pub_leaflet_blocks_text.json
+++ b/crates/jacquard-api/lexicons/pub_leaflet_blocks_text.json
@@ -17,6 +17,14 @@
},
"plaintext": {
"type": "string"
+ },
+ "textSize": {
+ "type": "string",
+ "enum": [
+ "default",
+ "small",
+ "large"
+ ]
}
}
}
diff --git a/crates/jacquard-api/lexicons/pub_leaflet_publication.json b/crates/jacquard-api/lexicons/pub_leaflet_publication.json
index de5a997f..ce2237d4 100644
--- a/crates/jacquard-api/lexicons/pub_leaflet_publication.json
+++ b/crates/jacquard-api/lexicons/pub_leaflet_publication.json
@@ -89,6 +89,11 @@
"pub.leaflet.theme.color#rgb"
]
},
+ "pageWidth": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 1600
+ },
"primary": {
"type": "union",
"refs": [
diff --git a/crates/jacquard-api/lexicons/sh_tangled_repo_pull.json b/crates/jacquard-api/lexicons/sh_tangled_repo_pull.json
index ea849df1..05661c19 100644
--- a/crates/jacquard-api/lexicons/sh_tangled_repo_pull.json
+++ b/crates/jacquard-api/lexicons/sh_tangled_repo_pull.json
@@ -10,7 +10,7 @@
"required": [
"target",
"title",
- "patch",
+ "patchBlob",
"createdAt"
],
"properties": {
@@ -29,7 +29,15 @@
}
},
"patch": {
- "type": "string"
+ "type": "string",
+ "description": "(deprecated) use patchBlob instead"
+ },
+ "patchBlob": {
+ "type": "blob",
+ "description": "patch content",
+ "accept": [
+ "text/x-patch"
+ ]
},
"references": {
"type": "array",
diff --git a/crates/jacquard-api/lexicons/site_standard_document.json b/crates/jacquard-api/lexicons/site_standard_document.json
index bbb9f881..14c25683 100644
--- a/crates/jacquard-api/lexicons/site_standard_document.json
+++ b/crates/jacquard-api/lexicons/site_standard_document.json
@@ -4,6 +4,7 @@
"defs": {
"main": {
"type": "record",
+ "description": "A document record representing a published article, blog post, or other content. Documents can belong to a publication or exist independently.",
"key": "tid",
"record": {
"type": "object",
@@ -15,18 +16,18 @@
"properties": {
"bskyPostRef": {
"type": "ref",
+ "description": "Strong reference to a Bluesky post. Useful to keep track of comments off-platform.",
"ref": "com.atproto.repo.strongRef"
},
"content": {
- "type": "array",
- "items": {
- "type": "union",
- "refs": [],
- "closed": false
- }
+ "type": "union",
+ "description": "Open union used to define the record's content. Each entry must specify a $type and may be extended with other lexicons to support additional content formats.",
+ "refs": [],
+ "closed": false
},
"coverImage": {
"type": "blob",
+ "description": "Image to used for thumbnail or cover image. Less than 1MB is size.",
"accept": [
"image/*"
],
@@ -34,24 +35,27 @@
},
"description": {
"type": "string",
+ "description": "A brief description or excerpt from the document.",
"maxLength": 3000,
"maxGraphemes": 300
},
"path": {
"type": "string",
- "description": "combine with the publication url or the document site to construct a full url to the document"
+ "description": "Combine with site or publication url to construct a canonical URL to the document. Prepend with a leading slash."
},
"publishedAt": {
"type": "string",
+ "description": "Timestamp of the documents publish time.",
"format": "datetime"
},
"site": {
"type": "string",
- "description": "URI to the site or publication this document belongs to (https or at-uri)",
+ "description": "Points to a publication record (at://) or a publication url (https://) for loose documents. Avoid trailing slashes.",
"format": "uri"
},
"tags": {
"type": "array",
+ "description": "Array of strings used to tag or categorize the document. Avoid prepending tags with hashtags.",
"items": {
"type": "string",
"maxLength": 100,
@@ -59,15 +63,18 @@
}
},
"textContent": {
- "type": "string"
+ "type": "string",
+ "description": "Plaintext representation of the documents contents. Should not contain markdown or other formatting."
},
"title": {
"type": "string",
+ "description": "Title of the document.",
"maxLength": 1280,
"maxGraphemes": 128
},
"updatedAt": {
"type": "string",
+ "description": "Timestamp of the documents last edit.",
"format": "datetime"
}
}
diff --git a/crates/jacquard-api/lexicons/site_standard_graph_subscription.json b/crates/jacquard-api/lexicons/site_standard_graph_subscription.json
index 0aa92868..6099f156 100644
--- a/crates/jacquard-api/lexicons/site_standard_graph_subscription.json
+++ b/crates/jacquard-api/lexicons/site_standard_graph_subscription.json
@@ -14,6 +14,7 @@
"properties": {
"publication": {
"type": "string",
+ "description": "AT-URI reference to the publication record being subscribed to (ex: at://did:plc:abc123/site.standard.publication/xyz789).",
"format": "at-uri"
}
}
diff --git a/crates/jacquard-api/lexicons/site_standard_publication.json b/crates/jacquard-api/lexicons/site_standard_publication.json
index 44880169..dbc74057 100644
--- a/crates/jacquard-api/lexicons/site_standard_publication.json
+++ b/crates/jacquard-api/lexicons/site_standard_publication.json
@@ -4,6 +4,7 @@
"defs": {
"main": {
"type": "record",
+ "description": "A publication record representing a blog, website, or content platform. Publications serve as containers for documents and define the overall branding and settings.",
"key": "tid",
"record": {
"type": "object",
@@ -14,15 +15,18 @@
"properties": {
"basicTheme": {
"type": "ref",
+ "description": "Simplified publication theme for tools and apps to utilize when displaying content.",
"ref": "site.standard.theme.basic"
},
"description": {
"type": "string",
+ "description": "Brief description of the publication.",
"maxLength": 3000,
"maxGraphemes": 300
},
"icon": {
"type": "blob",
+ "description": "Square image to identify the publication. Should be at least 256x256.",
"accept": [
"image/*"
],
@@ -30,15 +34,18 @@
},
"name": {
"type": "string",
+ "description": "Name of the publication.",
"maxLength": 1280,
"maxGraphemes": 128
},
"preferences": {
"type": "ref",
+ "description": "Object containing platform specific preferences (with a few shared properties).",
"ref": "#preferences"
},
"url": {
"type": "string",
+ "description": "Base publication url (ex: https://standard.site). The canonical document URL is formed by combining this value with the document path.",
"format": "uri"
}
}
@@ -46,9 +53,11 @@
},
"preferences": {
"type": "object",
+ "description": "Platform-specific preferences for the publication, including discovery and visibility settings.",
"properties": {
"showInDiscover": {
"type": "boolean",
+ "description": "Boolean which decides whether the publication should appear in discovery feeds.",
"default": true
}
}
diff --git a/crates/jacquard-api/lexicons/site_standard_theme_basic.json b/crates/jacquard-api/lexicons/site_standard_theme_basic.json
index 771f1abc..5a2c3749 100644
--- a/crates/jacquard-api/lexicons/site_standard_theme_basic.json
+++ b/crates/jacquard-api/lexicons/site_standard_theme_basic.json
@@ -4,6 +4,7 @@
"defs": {
"main": {
"type": "object",
+ "description": "A simplified theme definition for publications, providing basic color customization for content display across different platforms and applications.",
"required": [
"background",
"foreground",
@@ -13,24 +14,28 @@
"properties": {
"accent": {
"type": "union",
+ "description": "Color used for links and button backgrounds.",
"refs": [
"site.standard.theme.color#rgb"
]
},
"accentForeground": {
"type": "union",
+ "description": "Color used for button text.",
"refs": [
"site.standard.theme.color#rgb"
]
},
"background": {
"type": "union",
+ "description": "Color used for content background.",
"refs": [
"site.standard.theme.color#rgb"
]
},
"foreground": {
"type": "union",
+ "description": "Color used for content text.",
"refs": [
"site.standard.theme.color#rgb"
]
diff --git a/crates/jacquard-api/lexicons/social_pace_daily_ring.json b/crates/jacquard-api/lexicons/social_pace_daily_ring.json
new file mode 100644
index 00000000..3a18df79
--- /dev/null
+++ b/crates/jacquard-api/lexicons/social_pace_daily_ring.json
@@ -0,0 +1,53 @@
+{
+ "lexicon": 1,
+ "id": "social.pace.daily.ring",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "A record of daily activity rings (Apple Fitness), including move, exercise, and stand goals.",
+ "key": "any",
+ "record": {
+ "type": "object",
+ "required": [
+ "move",
+ "moveGoal",
+ "exercise",
+ "exerciseGoal",
+ "standHours",
+ "standGoal",
+ "createdAt"
+ ],
+ "properties": {
+ "createdAt": {
+ "type": "string",
+ "format": "datetime"
+ },
+ "exercise": {
+ "type": "integer",
+ "description": "The total minutes of exercise completed."
+ },
+ "exerciseGoal": {
+ "type": "integer",
+ "description": "The daily exercise goal in minutes."
+ },
+ "move": {
+ "type": "integer",
+ "description": "The total active calories burned for the day."
+ },
+ "moveGoal": {
+ "type": "integer",
+ "description": "The daily move goal in calories."
+ },
+ "standGoal": {
+ "type": "integer",
+ "description": "The daily stand goal in hours."
+ },
+ "standHours": {
+ "type": "integer",
+ "description": "The number of hours the user stood up and moved around."
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/social_pace_daily_step.json b/crates/jacquard-api/lexicons/social_pace_daily_step.json
new file mode 100644
index 00000000..44411c29
--- /dev/null
+++ b/crates/jacquard-api/lexicons/social_pace_daily_step.json
@@ -0,0 +1,35 @@
+{
+ "lexicon": 1,
+ "id": "social.pace.daily.step",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "A daily recording of your steps for that day. This record is expected to be update throughout the day and represent's 12am-12pm in your timezone, or what you count as a \"day\". The key is also traditionally the date of your \"day\" yyy-mm-dd.",
+ "key": "any",
+ "record": {
+ "type": "object",
+ "required": [
+ "steps",
+ "createdAt",
+ "updatedAt"
+ ],
+ "properties": {
+ "createdAt": {
+ "type": "string",
+ "description": "The first time this record was created",
+ "format": "datetime"
+ },
+ "steps": {
+ "type": "integer",
+ "description": "The number of steps taken during the day"
+ },
+ "updatedAt": {
+ "type": "string",
+ "description": "The last time this record was updated",
+ "format": "datetime"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/social_tophhie_profile.json b/crates/jacquard-api/lexicons/social_tophhie_profile.json
new file mode 100644
index 00000000..679e8044
--- /dev/null
+++ b/crates/jacquard-api/lexicons/social_tophhie_profile.json
@@ -0,0 +1,70 @@
+{
+ "lexicon": 1,
+ "id": "social.tophhie.profile",
+ "revision": 0,
+ "description": "Tophhie Social: profile record containing various PDS specific settings.",
+ "defs": {
+ "communicationPreferences": {
+ "type": "object",
+ "description": "Granular communication consent flags.",
+ "required": [
+ "marketing"
+ ],
+ "properties": {
+ "marketing": {
+ "type": "boolean",
+ "description": "True if the user consents to receive marketing communications."
+ }
+ }
+ },
+ "main": {
+ "type": "record",
+ "key": "literal:self",
+ "record": {
+ "type": "object",
+ "description": "Tophhie profile record",
+ "required": [
+ "createdAt",
+ "communicationPreferences"
+ ],
+ "properties": {
+ "communicationPreferences": {
+ "type": "ref",
+ "description": "User's opt-in/out preferences for communications.",
+ "ref": "#communicationPreferences"
+ },
+ "createdAt": {
+ "type": "string",
+ "description": "ISO 8601 timestamp when this profile record was created.",
+ "format": "datetime"
+ },
+ "pdsPreferences": {
+ "type": "ref",
+ "description": "User's opt-in/out preferences for PDS features.",
+ "ref": "#pdsPreferences"
+ },
+ "updatedAt": {
+ "type": "string",
+ "description": "ISO 8601 timestamp when this profile record was updated.",
+ "format": "datetime"
+ }
+ }
+ }
+ },
+ "pdsPreferences": {
+ "type": "object",
+ "description": "Granular PDS preference consent flags.",
+ "required": [],
+ "properties": {
+ "accessibilityScoring": {
+ "type": "boolean",
+ "description": "True if the user participates in accessibility scoring."
+ },
+ "showOnHomepage": {
+ "type": "boolean",
+ "description": "True if the user is shown on the Tophhie Social homepage."
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/tech_tokimeki_kaku_collection.json b/crates/jacquard-api/lexicons/tech_tokimeki_kaku_collection.json
new file mode 100644
index 00000000..d8d320bc
--- /dev/null
+++ b/crates/jacquard-api/lexicons/tech_tokimeki_kaku_collection.json
@@ -0,0 +1,42 @@
+{
+ "lexicon": 1,
+ "id": "tech.tokimeki.kaku.collection",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "A collection to organize drawings into folders",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [
+ "name",
+ "createdAt"
+ ],
+ "properties": {
+ "createdAt": {
+ "type": "string",
+ "format": "datetime"
+ },
+ "description": {
+ "type": "string",
+ "description": "Collection description",
+ "maxLength": 500,
+ "maxGraphemes": 200
+ },
+ "isPublic": {
+ "type": "boolean",
+ "description": "Whether the collection is publicly visible",
+ "default": true
+ },
+ "name": {
+ "type": "string",
+ "description": "Collection name",
+ "minLength": 1,
+ "maxLength": 100,
+ "maxGraphemes": 50
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/tech_tokimeki_kaku_collectionItem.json b/crates/jacquard-api/lexicons/tech_tokimeki_kaku_collectionItem.json
new file mode 100644
index 00000000..1f0ef63c
--- /dev/null
+++ b/crates/jacquard-api/lexicons/tech_tokimeki_kaku_collectionItem.json
@@ -0,0 +1,40 @@
+{
+ "lexicon": 1,
+ "id": "tech.tokimeki.kaku.collectionItem",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "An item in a collection linking to a post",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [
+ "collection",
+ "post",
+ "createdAt"
+ ],
+ "properties": {
+ "collection": {
+ "type": "ref",
+ "description": "Reference to the collection",
+ "ref": "com.atproto.repo.strongRef"
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "datetime"
+ },
+ "order": {
+ "type": "integer",
+ "description": "Order within the collection",
+ "minimum": 0
+ },
+ "post": {
+ "type": "ref",
+ "description": "Reference to the post",
+ "ref": "com.atproto.repo.strongRef"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/tech_tokimeki_kaku_defs.json b/crates/jacquard-api/lexicons/tech_tokimeki_kaku_defs.json
new file mode 100644
index 00000000..35a98a1f
--- /dev/null
+++ b/crates/jacquard-api/lexicons/tech_tokimeki_kaku_defs.json
@@ -0,0 +1,367 @@
+{
+ "lexicon": 1,
+ "id": "tech.tokimeki.kaku.defs",
+ "defs": {
+ "aspectRatio": {
+ "type": "object",
+ "description": "Width and height representing the aspect ratio of an image",
+ "required": [
+ "width",
+ "height"
+ ],
+ "properties": {
+ "height": {
+ "type": "integer",
+ "description": "Height component of aspect ratio",
+ "minimum": 1
+ },
+ "width": {
+ "type": "integer",
+ "description": "Width component of aspect ratio",
+ "minimum": 1
+ }
+ }
+ },
+ "collectionView": {
+ "type": "object",
+ "description": "A view of a collection with author profile and item count",
+ "required": [
+ "uri",
+ "cid",
+ "author",
+ "name",
+ "createdAt"
+ ],
+ "properties": {
+ "author": {
+ "type": "ref",
+ "description": "Collection owner profile",
+ "ref": "app.bsky.actor.defs#profileViewBasic"
+ },
+ "cid": {
+ "type": "string",
+ "description": "CID of the collection record",
+ "format": "cid"
+ },
+ "createdAt": {
+ "type": "string",
+ "description": "Timestamp when the collection was created",
+ "format": "datetime"
+ },
+ "description": {
+ "type": "string",
+ "description": "Collection description",
+ "maxLength": 500,
+ "maxGraphemes": 200
+ },
+ "indexedAt": {
+ "type": "string",
+ "description": "Timestamp when the collection was indexed",
+ "format": "datetime"
+ },
+ "isPublic": {
+ "type": "boolean",
+ "description": "Whether the collection is publicly visible",
+ "default": true
+ },
+ "itemCount": {
+ "type": "integer",
+ "description": "Number of items in the collection"
+ },
+ "name": {
+ "type": "string",
+ "description": "Collection name",
+ "maxLength": 100,
+ "maxGraphemes": 50
+ },
+ "uri": {
+ "type": "string",
+ "description": "AT-URI of the collection record",
+ "format": "at-uri"
+ }
+ }
+ },
+ "postView": {
+ "type": "object",
+ "description": "A view of a drawing post with author profile and metadata",
+ "required": [
+ "uri",
+ "cid",
+ "author",
+ "image",
+ "aspectRatio",
+ "createdAt"
+ ],
+ "properties": {
+ "aspectRatio": {
+ "type": "ref",
+ "description": "Aspect ratio of the image",
+ "ref": "#aspectRatio"
+ },
+ "author": {
+ "type": "ref",
+ "description": "Author profile",
+ "ref": "app.bsky.actor.defs#profileViewBasic"
+ },
+ "cid": {
+ "type": "string",
+ "description": "CID of the post record",
+ "format": "cid"
+ },
+ "createdAt": {
+ "type": "string",
+ "description": "Timestamp when the post was created",
+ "format": "datetime"
+ },
+ "image": {
+ "type": "string",
+ "description": "URL of the drawing image",
+ "format": "uri"
+ },
+ "indexedAt": {
+ "type": "string",
+ "description": "Timestamp when the post was indexed",
+ "format": "datetime"
+ },
+ "linkedPost": {
+ "type": "ref",
+ "description": "Reference to linked Bluesky post",
+ "ref": "com.atproto.repo.strongRef"
+ },
+ "reactionCounts": {
+ "type": "ref",
+ "description": "Counts of each reaction type",
+ "ref": "#reactionCounts"
+ },
+ "tags": {
+ "type": "array",
+ "description": "Tags for categorization",
+ "items": {
+ "type": "string",
+ "maxLength": 64,
+ "maxGraphemes": 32
+ },
+ "maxLength": 8
+ },
+ "text": {
+ "type": "string",
+ "description": "Optional description or title",
+ "maxLength": 1000,
+ "maxGraphemes": 300
+ },
+ "uri": {
+ "type": "string",
+ "description": "AT-URI of the post record",
+ "format": "at-uri"
+ },
+ "viewerReaction": {
+ "type": "ref",
+ "description": "Current user's reaction to this post",
+ "ref": "#reactionType"
+ }
+ }
+ },
+ "reactionCounts": {
+ "type": "object",
+ "description": "Counts of each reaction type on a post",
+ "properties": {
+ "kami": {
+ "type": "integer",
+ "description": "Count of kami (godly) reactions",
+ "default": 0
+ },
+ "kawaii": {
+ "type": "integer",
+ "description": "Count of kawaii (cute) reactions",
+ "default": 0
+ },
+ "sugoi": {
+ "type": "integer",
+ "description": "Count of sugoi (amazing) reactions",
+ "default": 0
+ },
+ "suki": {
+ "type": "integer",
+ "description": "Count of suki (like) reactions",
+ "default": 0
+ },
+ "tasukaru": {
+ "type": "integer",
+ "description": "Count of tasukaru (helpful) reactions",
+ "default": 0
+ }
+ }
+ },
+ "reactionType": {
+ "type": "string",
+ "description": "Type of reaction to a post",
+ "knownValues": [
+ "suki",
+ "tasukaru",
+ "sugoi",
+ "kawaii",
+ "kami"
+ ]
+ },
+ "replyView": {
+ "type": "object",
+ "description": "A view of a Bluesky reply to a linked post",
+ "required": [
+ "uri",
+ "cid",
+ "author",
+ "text",
+ "createdAt"
+ ],
+ "properties": {
+ "author": {
+ "type": "ref",
+ "description": "Reply author profile",
+ "ref": "app.bsky.actor.defs#profileViewBasic"
+ },
+ "cid": {
+ "type": "string",
+ "description": "CID of the Bluesky reply",
+ "format": "cid"
+ },
+ "createdAt": {
+ "type": "string",
+ "description": "Timestamp when the reply was created",
+ "format": "datetime"
+ },
+ "text": {
+ "type": "string",
+ "description": "Reply text content",
+ "maxLength": 3000,
+ "maxGraphemes": 300
+ },
+ "uri": {
+ "type": "string",
+ "description": "AT-URI of the Bluesky reply",
+ "format": "at-uri"
+ }
+ }
+ },
+ "requestResponseView": {
+ "type": "object",
+ "description": "A view of a response to a drawing request",
+ "required": [
+ "uri",
+ "cid",
+ "author",
+ "post",
+ "createdAt"
+ ],
+ "properties": {
+ "author": {
+ "type": "ref",
+ "description": "Response author profile",
+ "ref": "app.bsky.actor.defs#profileViewBasic"
+ },
+ "cid": {
+ "type": "string",
+ "description": "CID of the response record",
+ "format": "cid"
+ },
+ "createdAt": {
+ "type": "string",
+ "description": "Timestamp when the response was created",
+ "format": "datetime"
+ },
+ "message": {
+ "type": "string",
+ "description": "Optional message to the requester",
+ "maxLength": 500,
+ "maxGraphemes": 150
+ },
+ "post": {
+ "type": "ref",
+ "description": "The drawing post submitted as response",
+ "ref": "#postView"
+ },
+ "uri": {
+ "type": "string",
+ "description": "AT-URI of the response record",
+ "format": "at-uri"
+ }
+ }
+ },
+ "requestView": {
+ "type": "object",
+ "description": "A view of a drawing request with author profile and response count",
+ "required": [
+ "uri",
+ "cid",
+ "author",
+ "text",
+ "isOpen",
+ "createdAt"
+ ],
+ "properties": {
+ "author": {
+ "type": "ref",
+ "description": "Request author profile",
+ "ref": "app.bsky.actor.defs#profileViewBasic"
+ },
+ "cid": {
+ "type": "string",
+ "description": "CID of the request record",
+ "format": "cid"
+ },
+ "createdAt": {
+ "type": "string",
+ "description": "Timestamp when the request was created",
+ "format": "datetime"
+ },
+ "indexedAt": {
+ "type": "string",
+ "description": "Timestamp when the request was indexed",
+ "format": "datetime"
+ },
+ "isOpen": {
+ "type": "boolean",
+ "description": "Whether the request is still accepting responses"
+ },
+ "referenceImages": {
+ "type": "array",
+ "description": "URLs of reference images for the request",
+ "items": {
+ "type": "string",
+ "format": "uri"
+ },
+ "maxLength": 4
+ },
+ "responseCount": {
+ "type": "integer",
+ "description": "Number of responses to this request"
+ },
+ "tags": {
+ "type": "array",
+ "description": "Tags for categorization",
+ "items": {
+ "type": "string",
+ "maxLength": 64,
+ "maxGraphemes": 32
+ },
+ "maxLength": 8
+ },
+ "targetActor": {
+ "type": "ref",
+ "description": "Specific artist the request is directed to",
+ "ref": "app.bsky.actor.defs#profileViewBasic"
+ },
+ "text": {
+ "type": "string",
+ "description": "Description of what to draw",
+ "maxLength": 1000,
+ "maxGraphemes": 300
+ },
+ "uri": {
+ "type": "string",
+ "description": "AT-URI of the request record",
+ "format": "at-uri"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/tech_tokimeki_kaku_post.json b/crates/jacquard-api/lexicons/tech_tokimeki_kaku_post.json
new file mode 100644
index 00000000..3d001b52
--- /dev/null
+++ b/crates/jacquard-api/lexicons/tech_tokimeki_kaku_post.json
@@ -0,0 +1,66 @@
+{
+ "lexicon": 1,
+ "id": "tech.tokimeki.kaku.post",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "A drawing post created with the drawing tool",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [
+ "image",
+ "aspectRatio",
+ "createdAt"
+ ],
+ "properties": {
+ "aspectRatio": {
+ "type": "ref",
+ "description": "Aspect ratio of the image",
+ "ref": "tech.tokimeki.kaku.defs#aspectRatio"
+ },
+ "createdAt": {
+ "type": "string",
+ "description": "Timestamp when the post was created",
+ "format": "datetime"
+ },
+ "image": {
+ "type": "blob",
+ "description": "The drawn image (max 1MB)",
+ "accept": [
+ "image/png",
+ "image/jpeg"
+ ],
+ "maxSize": 1000000
+ },
+ "linkedPost": {
+ "type": "ref",
+ "description": "Bluesky post created for this drawing",
+ "ref": "com.atproto.repo.strongRef"
+ },
+ "subject": {
+ "type": "ref",
+ "description": "Reference to a related Bluesky post",
+ "ref": "com.atproto.repo.strongRef"
+ },
+ "tags": {
+ "type": "array",
+ "description": "Tags for categorization",
+ "items": {
+ "type": "string",
+ "maxLength": 64,
+ "maxGraphemes": 32
+ },
+ "maxLength": 8
+ },
+ "text": {
+ "type": "string",
+ "description": "Optional description or title",
+ "maxLength": 1000,
+ "maxGraphemes": 300
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/tech_tokimeki_kaku_reaction.json b/crates/jacquard-api/lexicons/tech_tokimeki_kaku_reaction.json
new file mode 100644
index 00000000..90bb67f6
--- /dev/null
+++ b/crates/jacquard-api/lexicons/tech_tokimeki_kaku_reaction.json
@@ -0,0 +1,41 @@
+{
+ "lexicon": 1,
+ "id": "tech.tokimeki.kaku.reaction",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "A reaction to a post",
+ "key": "any",
+ "record": {
+ "type": "object",
+ "required": [
+ "subject",
+ "type",
+ "createdAt"
+ ],
+ "properties": {
+ "createdAt": {
+ "type": "string",
+ "format": "datetime"
+ },
+ "subject": {
+ "type": "ref",
+ "description": "Reference to the post being reacted to",
+ "ref": "com.atproto.repo.strongRef"
+ },
+ "type": {
+ "type": "string",
+ "description": "Type of reaction",
+ "knownValues": [
+ "suki",
+ "tasukaru",
+ "sugoi",
+ "kawaii",
+ "kami"
+ ]
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/tech_tokimeki_kaku_request.json b/crates/jacquard-api/lexicons/tech_tokimeki_kaku_request.json
new file mode 100644
index 00000000..59262f7e
--- /dev/null
+++ b/crates/jacquard-api/lexicons/tech_tokimeki_kaku_request.json
@@ -0,0 +1,62 @@
+{
+ "lexicon": 1,
+ "id": "tech.tokimeki.kaku.request",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "A request for someone to draw something",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [
+ "text",
+ "createdAt"
+ ],
+ "properties": {
+ "createdAt": {
+ "type": "string",
+ "format": "datetime"
+ },
+ "isOpen": {
+ "type": "boolean",
+ "description": "Whether still accepting responses",
+ "default": true
+ },
+ "referenceImages": {
+ "type": "array",
+ "description": "Reference images for the request",
+ "items": {
+ "type": "blob",
+ "accept": [
+ "image/png",
+ "image/jpeg"
+ ],
+ "maxSize": 1000000
+ },
+ "maxLength": 4
+ },
+ "tags": {
+ "type": "array",
+ "description": "Tags for categorization",
+ "items": {
+ "type": "string",
+ "maxLength": 64
+ },
+ "maxLength": 8
+ },
+ "targetActor": {
+ "type": "string",
+ "description": "Optional: specific artist to request",
+ "format": "did"
+ },
+ "text": {
+ "type": "string",
+ "description": "Description of what to draw",
+ "maxLength": 1000,
+ "maxGraphemes": 300
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/tech_tokimeki_kaku_requestResponse.json b/crates/jacquard-api/lexicons/tech_tokimeki_kaku_requestResponse.json
new file mode 100644
index 00000000..a3f9ad06
--- /dev/null
+++ b/crates/jacquard-api/lexicons/tech_tokimeki_kaku_requestResponse.json
@@ -0,0 +1,41 @@
+{
+ "lexicon": 1,
+ "id": "tech.tokimeki.kaku.requestResponse",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "A post created in response to a request",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [
+ "request",
+ "post",
+ "createdAt"
+ ],
+ "properties": {
+ "createdAt": {
+ "type": "string",
+ "format": "datetime"
+ },
+ "message": {
+ "type": "string",
+ "description": "Optional message to the requester",
+ "maxLength": 500,
+ "maxGraphemes": 150
+ },
+ "post": {
+ "type": "ref",
+ "description": "Reference to the post created as response",
+ "ref": "com.atproto.repo.strongRef"
+ },
+ "request": {
+ "type": "ref",
+ "description": "Reference to the request",
+ "ref": "com.atproto.repo.strongRef"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/tech_tokimeki_kaku_roomGate.json b/crates/jacquard-api/lexicons/tech_tokimeki_kaku_roomGate.json
new file mode 100644
index 00000000..cf9e6f62
--- /dev/null
+++ b/crates/jacquard-api/lexicons/tech_tokimeki_kaku_roomGate.json
@@ -0,0 +1,35 @@
+{
+ "lexicon": 1,
+ "id": "tech.tokimeki.kaku.roomGate",
+ "defs": {
+ "main": {
+ "type": "record",
+ "description": "Gate settings for a ROOM post (like threadgate)",
+ "key": "tid",
+ "record": {
+ "type": "object",
+ "required": [
+ "room",
+ "createdAt"
+ ],
+ "properties": {
+ "createdAt": {
+ "type": "string",
+ "description": "Timestamp when the gate was created",
+ "format": "datetime"
+ },
+ "isClosed": {
+ "type": "boolean",
+ "description": "Whether the room is closed for new replies",
+ "default": false
+ },
+ "room": {
+ "type": "ref",
+ "description": "Reference to the ROOM post",
+ "ref": "com.atproto.repo.strongRef"
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/crates/jacquard-api/lexicons/uk_skyblur_post.json b/crates/jacquard-api/lexicons/uk_skyblur_post.json
index 00a09eb1..9d408e3c 100644
--- a/crates/jacquard-api/lexicons/uk_skyblur_post.json
+++ b/crates/jacquard-api/lexicons/uk_skyblur_post.json
@@ -42,12 +42,13 @@
},
"visibility": {
"type": "string",
- "description": "For 'password', the text only contains blurred text, and additional is always empty. The unblurred text and additional are included in the encryptBody.",
+ "description": "For 'login', the post requires login to view (Bluesky account required). For 'password', the text only contains blurred text, and additional is always empty. The unblurred text and additional are included in the encryptBody.",
"maxLength": 100,
"maxGraphemes": 10,
"enum": [
"public",
- "password"
+ "password",
+ "login"
]
}
}
diff --git a/crates/jacquard-api/src/app_bsky/actor.rs b/crates/jacquard-api/src/app_bsky/actor.rs
index 3b6aff4a..d2b3e908 100644
--- a/crates/jacquard-api/src/app_bsky/actor.rs
+++ b/crates/jacquard-api/src/app_bsky/actor.rs
@@ -2089,6 +2089,23 @@ fn lexicon_doc_app_bsky_actor_defs() -> ::jacquard_lexicon::lexicon::LexiconDoc<
properties: {
#[allow(unused_mut)]
let mut map = ::alloc::collections::BTreeMap::new();
+ map.insert(
+ ::jacquard_common::smol_str::SmolStr::new_static("cid"),
+ ::jacquard_lexicon::lexicon::LexObjectProperty::String(::jacquard_lexicon::lexicon::LexString {
+ description: None,
+ format: Some(
+ ::jacquard_lexicon::lexicon::LexStringFormat::Cid,
+ ),
+ default: None,
+ min_length: None,
+ max_length: None,
+ min_graphemes: None,
+ max_graphemes: None,
+ r#enum: None,
+ r#const: None,
+ known_values: None,
+ }),
+ );
map.insert(
::jacquard_common::smol_str::SmolStr::new_static("embed"),
::jacquard_lexicon::lexicon::LexObjectProperty::Union(::jacquard_lexicon::lexicon::LexRefUnion {
@@ -2134,6 +2151,16 @@ fn lexicon_doc_app_bsky_actor_defs() -> ::jacquard_lexicon::lexicon::LexiconDoc<
r#const: None,
}),
);
+ map.insert(
+ ::jacquard_common::smol_str::SmolStr::new_static(
+ "isDisabled",
+ ),
+ ::jacquard_lexicon::lexicon::LexObjectProperty::Boolean(::jacquard_lexicon::lexicon::LexBoolean {
+ description: None,
+ default: None,
+ r#const: None,
+ }),
+ );
map.insert(
::jacquard_common::smol_str::SmolStr::new_static("record"),
::jacquard_lexicon::lexicon::LexObjectProperty::Unknown(::jacquard_lexicon::lexicon::LexUnknown {
@@ -2159,6 +2186,23 @@ fn lexicon_doc_app_bsky_actor_defs() -> ::jacquard_lexicon::lexicon::LexiconDoc<
known_values: None,
}),
);
+ map.insert(
+ ::jacquard_common::smol_str::SmolStr::new_static("uri"),
+ ::jacquard_lexicon::lexicon::LexObjectProperty::String(::jacquard_lexicon::lexicon::LexString {
+ description: None,
+ format: Some(
+ ::jacquard_lexicon::lexicon::LexStringFormat::AtUri,
+ ),
+ default: None,
+ min_length: None,
+ max_length: None,
+ min_graphemes: None,
+ max_graphemes: None,
+ r#enum: None,
+ r#const: None,
+ known_values: None,
+ }),
+ );
map
},
}),
@@ -6132,37 +6176,37 @@ pub mod profile_view_detailed_state {
}
/// State trait tracking which required fields have been set
pub trait State: sealed::Sealed {
- type Handle;
type Did;
+ type Handle;
}
/// Empty state - all required fields are unset
pub struct Empty(());
impl sealed::Sealed for Empty {}
impl State for Empty {
- type Handle = Unset;
type Did = Unset;
- }
- ///State transition - sets the `handle` field to Set
- pub struct SetHandle(PhantomData S>);
- impl sealed::Sealed for SetHandle {}
- impl State for SetHandle {
- type Handle = Set;
- type Did = S::Did;
+ type Handle = Unset;
}
///State transition - sets the `did` field to Set
pub struct SetDid(PhantomData S>);
impl sealed::Sealed for SetDid {}
impl State for SetDid {
- type Handle = S::Handle;
type Did = Set;
+ type Handle = S::Handle;
+ }
+ ///State transition - sets the `handle` field to Set
+ pub struct SetHandle(PhantomData S>);
+ impl sealed::Sealed for SetHandle {}
+ impl State for SetHandle {
+ type Did = S::Did;
+ type Handle = Set;
}
/// Marker types for field names
#[allow(non_camel_case_types)]
pub mod members {
- ///Marker type for the `handle` field
- pub struct handle(());
///Marker type for the `did` field
pub struct did(());
+ ///Marker type for the `handle` field
+ pub struct handle(());
}
}
@@ -6616,8 +6660,8 @@ impl<'a, S: profile_view_detailed_state::State> ProfileViewDetailedBuilder<'a, S
impl<'a, S> ProfileViewDetailedBuilder<'a, S>
where
S: profile_view_detailed_state::State,
- S::Handle: profile_view_detailed_state::IsSet,
S::Did: profile_view_detailed_state::IsSet,
+ S::Handle: profile_view_detailed_state::IsSet,
{
/// Build the final struct
pub fn build(self) -> ProfileViewDetailed<'a> {
@@ -6789,67 +6833,67 @@ pub mod saved_feed_state {
}
/// State trait tracking which required fields have been set
pub trait State: sealed::Sealed {
- type Id;
type Value;
- type Pinned;
+ type Id;
type Type;
+ type Pinned;
}
/// Empty state - all required fields are unset
pub struct Empty(());
impl sealed::Sealed for Empty {}
impl State for Empty {
- type Id = Unset;
type Value = Unset;
- type Pinned = Unset;
+ type Id = Unset;
type Type = Unset;
- }
- ///State transition - sets the `id` field to Set
- pub struct SetId(PhantomData S>);
- impl sealed::Sealed for SetId {}
- impl State for SetId {
- type Id = Set;
- type Value = S::Value;
- type Pinned = S::Pinned;
- type Type = S::Type;
+ type Pinned = Unset;
}
///State transition - sets the `value` field to Set
pub struct SetValue(PhantomData S>);
impl sealed::Sealed for SetValue {}
impl State for SetValue {
- type Id = S::Id;
type Value = Set;
- type Pinned = S::Pinned;
+ type Id = S::Id;
type Type = S::Type;
+ type Pinned = S::Pinned;
}
- ///State transition - sets the `pinned` field to Set
- pub struct SetPinned(PhantomData S>);
- impl sealed::Sealed for SetPinned {}
- impl State for SetPinned {
- type Id = S::Id;
+ ///State transition - sets the `id` field to Set
+ pub struct SetId(PhantomData S>);
+ impl sealed::Sealed for SetId {}
+ impl State for SetId {
type Value = S::Value;
- type Pinned = Set;
+ type Id = Set;
type Type = S::Type;
+ type Pinned = S::Pinned;
}
///State transition - sets the `type` field to Set
pub struct SetType(PhantomData S>);
impl sealed::Sealed for SetType {}
impl State for SetType {
- type Id = S::Id;
type Value = S::Value;
- type Pinned = S::Pinned;
+ type Id = S::Id;
type Type = Set;
+ type Pinned = S::Pinned;
+ }
+ ///State transition - sets the `pinned` field to Set
+ pub struct SetPinned(PhantomData S>);
+ impl sealed::Sealed for SetPinned {}
+ impl State for SetPinned {
+ type Value = S::Value;
+ type Id = S::Id;
+ type Type = S::Type;
+ type Pinned = Set;
}
/// Marker types for field names
#[allow(non_camel_case_types)]
pub mod members {
- ///Marker type for the `id` field
- pub struct id(());
///Marker type for the `value` field
pub struct value(());
- ///Marker type for the `pinned` field
- pub struct pinned(());
+ ///Marker type for the `id` field
+ pub struct id(());
///Marker type for the `type` field
pub struct r#type(());
+ ///Marker type for the `pinned` field
+ pub struct pinned(());
}
}
@@ -6962,10 +7006,10 @@ where
impl<'a, S> SavedFeedBuilder<'a, S>
where
S: saved_feed_state::State,
- S::Id: saved_feed_state::IsSet,
S::Value: saved_feed_state::IsSet,
- S::Pinned: saved_feed_state::IsSet,
+ S::Id: saved_feed_state::IsSet,
S::Type: saved_feed_state::IsSet,
+ S::Pinned: saved_feed_state::IsSet,
{
/// Build the final struct
pub fn build(self) -> SavedFeed<'a> {
@@ -7135,37 +7179,37 @@ pub mod saved_feeds_pref_state {
}
/// State trait tracking which required fields have been set
pub trait State: sealed::Sealed {
- type Saved;
type Pinned;
+ type Saved;
}
/// Empty state - all required fields are unset
pub struct Empty(());
impl sealed::Sealed for Empty {}
impl State for Empty {
- type Saved = Unset;
type Pinned = Unset;
- }
- ///State transition - sets the `saved` field to Set
- pub struct SetSaved(PhantomData S>);
- impl sealed::Sealed for SetSaved {}
- impl State for SetSaved {
- type Saved = Set;
- type Pinned = S::Pinned;
+ type Saved = Unset;
}
///State transition - sets the `pinned` field to Set
pub struct SetPinned(PhantomData S>);
impl sealed::Sealed for SetPinned {}
impl State for SetPinned {
- type Saved = S::Saved;
type Pinned = Set;
+ type Saved = S::Saved;
+ }
+ ///State transition - sets the `saved` field to Set
+ pub struct SetSaved(PhantomData S>);
+ impl sealed::Sealed for SetSaved {}
+ impl State for SetSaved {
+ type Pinned = S::Pinned;
+ type Saved = Set;
}
/// Marker types for field names
#[allow(non_camel_case_types)]
pub mod members {
- ///Marker type for the `saved` field
- pub struct saved(());
///Marker type for the `pinned` field
pub struct pinned(());
+ ///Marker type for the `saved` field
+ pub struct saved(());
}
}
@@ -7252,8 +7296,8 @@ impl<'a, S: saved_feeds_pref_state::State> SavedFeedsPrefBuilder<'a, S> {
impl<'a, S> SavedFeedsPrefBuilder<'a, S>
where
S: saved_feeds_pref_state::State,
- S::Saved: saved_feeds_pref_state::IsSet,
S::Pinned: saved_feeds_pref_state::IsSet,
+ S::Saved: saved_feeds_pref_state::IsSet,
{
/// Build the final struct
pub fn build(self) -> SavedFeedsPref<'a> {
@@ -7448,6 +7492,9 @@ impl<'a> ::jacquard_lexicon::schema::LexiconSchema for SavedFeedsPrefV2<'a> {
)]
#[serde(rename_all = "camelCase")]
pub struct StatusView<'a> {
+ #[serde(skip_serializing_if = "std::option::Option::is_none")]
+ #[serde(borrow)]
+ pub cid: std::option::Option>,
/// An optional embed associated with the status.
#[serde(skip_serializing_if = "std::option::Option::is_none")]
#[serde(borrow)]
@@ -7458,11 +7505,17 @@ pub struct StatusView<'a> {
/// True if the status is not expired, false if it is expired. Only present if expiration was set.
#[serde(skip_serializing_if = "std::option::Option::is_none")]
pub is_active: std::option::Option,
+ /// True if the user's go-live access has been disabled by a moderator, false otherwise.
+ #[serde(skip_serializing_if = "std::option::Option::is_none")]
+ pub is_disabled: std::option::Option,
#[serde(borrow)]
pub record: jacquard_common::types::value::Data<'a>,
/// The status for the account.
#[serde(borrow)]
pub status: StatusViewStatus<'a>,
+ #[serde(skip_serializing_if = "std::option::Option::is_none")]
+ #[serde(borrow)]
+ pub uri: std::option::Option>,
}
pub mod status_view_state {
@@ -7475,37 +7528,37 @@ pub mod status_view_state {
}
/// State trait tracking which required fields have been set
pub trait State: sealed::Sealed {
- type Status;
type Record;
+ type Status;
}
/// Empty state - all required fields are unset
pub struct Empty(());
impl sealed::Sealed for Empty {}
impl State for Empty {
- type Status = Unset;
type Record = Unset;
- }
- ///State transition - sets the `status` field to Set
- pub struct SetStatus(PhantomData S>);
- impl sealed::Sealed for SetStatus {}
- impl State for SetStatus {
- type Status = Set;
- type Record = S::Record;
+ type Status = Unset;
}
///State transition - sets the `record` field to Set
pub struct SetRecord(PhantomData S>);
impl sealed::Sealed for SetRecord {}
impl State for SetRecord {
- type Status = S::Status;
type Record = Set;
+ type Status = S::Status;
+ }
+ ///State transition - sets the `status` field to Set
+ pub struct SetStatus(PhantomData S>);
+ impl sealed::Sealed for SetStatus {}
+ impl State for SetStatus {
+ type Record = S::Record;
+ type Status = Set;
}
/// Marker types for field names
#[allow(non_camel_case_types)]
pub mod members {
- ///Marker type for the `status` field
- pub struct status(());
///Marker type for the `record` field
pub struct record(());
+ ///Marker type for the `status` field
+ pub struct status(());
}
}
@@ -7513,11 +7566,14 @@ pub mod status_view_state {
pub struct StatusViewBuilder<'a, S: status_view_state::State> {
_phantom_state: ::core::marker::PhantomData S>,
__unsafe_private_named: (
+ ::core::option::Option>,
::core::option::Option>,
::core::option::Option,
::core::option::Option,
+ ::core::option::Option,
::core::option::Option>,
::core::option::Option>,
+ ::core::option::Option>,
),
_phantom: ::core::marker::PhantomData<&'a ()>,
}
@@ -7534,19 +7590,38 @@ impl<'a> StatusViewBuilder<'a, status_view_state::Empty> {
pub fn new() -> Self {
StatusViewBuilder {
_phantom_state: ::core::marker::PhantomData,
- __unsafe_private_named: (None, None, None, None, None),
+ __unsafe_private_named: (None, None, None, None, None, None, None, None),
_phantom: ::core::marker::PhantomData,
}
}
}
+impl<'a, S: status_view_state::State> StatusViewBuilder<'a, S> {
+ /// Set the `cid` field (optional)
+ pub fn cid(
+ mut self,
+ value: impl Into