diff --git a/Cargo.lock b/Cargo.lock index d1065b4..fd37900 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,12 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + [[package]] name = "aead" version = "0.5.2" @@ -12,6 +18,31 @@ dependencies = [ "generic-array", ] +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures 0.2.17", + "zeroize", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "const-random", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.5" @@ -37,7 +68,7 @@ dependencies = [ "piper", "polling", "regex-automata", - "rustix", + "rustix 1.1.4", "rustix-openpty", "signal-hook", "unicode-width", @@ -45,6 +76,24 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "aligned" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685" +dependencies = [ + "as-slice", +] + +[[package]] +name = "aligned-vec" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" +dependencies = [ + "equator", +] + [[package]] name = "android_system_properties" version = "0.1.6" @@ -60,12 +109,355 @@ version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" +[[package]] +name = "ar_archive_writer" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73cd58deff2140a0a8eae87e417bd01db68a33e148aa93d1e8cd837e55e312b6" +dependencies = [ + "object", +] + +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" + +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + [[package]] name = "arrayvec" version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + +[[package]] +name = "as-slice" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "ash" +version = "0.38.0+1.3.281" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" +dependencies = [ + "libloading", +] + +[[package]] +name = "ash-window" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52bca67b61cb81e5553babde81b8211f713cb6db79766f80168f3e5f40ea6c82" +dependencies = [ + "ash", + "raw-window-handle", + "raw-window-metal", +] + +[[package]] +name = "ashpd" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f3f79755c74fd155000314eb349864caa787c6592eace6c6882dad873d9c39" +dependencies = [ + "async-fs", + "async-net", + "enumflags2", + "futures-channel", + "futures-util", + "rand 0.9.5", + "serde", + "serde_repr", + "url", + "wayland-backend", + "wayland-client", + "wayland-protocols 0.32.13", + "zbus", +] + +[[package]] +name = "ashpd" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33a3c86f3fd70c0ffa500ed189abfa90b5a52398a45d5dc372fcc38ebeb7a645" +dependencies = [ + "async-fs", + "async-net", + "enumflags2", + "futures-channel", + "futures-util", + "rand 0.9.5", + "serde", + "serde_repr", + "url", + "zbus", +] + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener 5.4.2", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-compression" +version = "0.4.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3976abdc8fe7d1133d43d304afd42abdf5bc3e1319d263d223bde07b5efc4be8" +dependencies = [ + "compression-codecs", + "compression-core", + "futures-io", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand 2.5.0", + "futures-lite 2.6.1", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-fs" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" +dependencies = [ + "async-lock", + "blocking", + "futures-lite 2.6.1", +] + +[[package]] +name = "async-global-executor" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" +dependencies = [ + "async-channel 2.5.0", + "async-executor", + "async-io", + "async-lock", + "blocking", + "futures-lite 2.6.1", + "once_cell", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.6.1", + "parking", + "polling", + "rustix 1.1.4", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener 5.4.2", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-net" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" +dependencies = [ + "async-io", + "blocking", + "futures-lite 2.6.1", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel 2.5.0", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener 5.4.2", + "futures-lite 2.6.1", + "rustix 1.1.4", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "async-signal" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 1.1.4", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-std" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c8e079a4ab67ae52b7403632e4618815d6db36d2a010cfe41b02c1b1578f93b" +dependencies = [ + "async-channel 1.9.0", + "async-global-executor", + "async-io", + "async-lock", + "async-process", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite 2.6.1", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[package]] +name = "async_zip" +version = "0.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b9f7252833d5ed4b00aa9604b563529dd5e11de9c23615de2dcdf91eb87b52" +dependencies = [ + "async-compression", + "crc32fast", + "futures-lite 2.6.1", + "pin-project", + "thiserror 1.0.69", +] + +[[package]] +name = "atomic" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" + [[package]] name = "atomic-waker" version = "1.1.2" @@ -78,6 +470,49 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" +[[package]] +name = "av-scenechange" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394" +dependencies = [ + "aligned", + "anyhow", + "arg_enum_proc_macro", + "arrayvec", + "log", + "num-rational", + "num-traits", + "pastey", + "rayon", + "thiserror 2.0.20", + "v_frame", + "y4m", +] + +[[package]] +name = "av1-grain" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom 8.0.0", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7178fe5f7d460b13895ebb9dcb28a3a6216d2df2574a0806cb51b555d297f38" +dependencies = [ + "arrayvec", +] + [[package]] name = "base64" version = "0.22.1" @@ -102,6 +537,26 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32637268377fc7b10a8c6d51de3e7fba1ce5dd371a96e342b34e6078db558e7f" +[[package]] +name = "bindgen" +version = "0.71.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" +dependencies = [ + "bitflags 2.13.1", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash 2.1.3", + "shlex 1.3.0", + "syn 2.0.119", +] + [[package]] name = "bip39" version = "2.2.2" @@ -113,6 +568,27 @@ dependencies = [ "unicode-normalization", ] +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" + [[package]] name = "bitcoin-consensus-encoding" version = "1.2.0" @@ -162,6 +638,79 @@ version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" +[[package]] +name = "bitstream-io" +version = "4.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eff00be299a18769011411c9def0d827e8f2d7bf0c3dbf53633147a8867fd1f" +dependencies = [ + "no_std_io2", +] + +[[package]] +name = "blade-graphics" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e71cfb73b98eb9f58ee84048aa1bdf4e7497fd20c141b57523499fa066b48fed" +dependencies = [ + "ash", + "ash-window", + "bitflags 2.13.1", + "bytemuck", + "codespan-reporting", + "glow", + "gpu-alloc", + "gpu-alloc-ash", + "hidden-trait", + "js-sys", + "khronos-egl", + "libloading", + "log", + "mint", + "naga", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-metal", + "objc2-quartz-core", + "objc2-ui-kit", + "once_cell", + "raw-window-handle", + "slab", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "blade-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27142319e2f4c264581067eaccb9f80acccdde60d8b4bf57cc50cd3152f109ca" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "blade-util" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a6be3a82c001ba7a17b6f8e413ede5d1004e6047213f8efaf0ffc15b5c4904c" +dependencies = [ + "blade-graphics", + "bytemuck", + "log", + "profiling", +] + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + [[package]] name = "block-buffer" version = "0.10.4" @@ -189,6 +738,44 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[package]] +name = "blocking" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a70e4329df6cb94385eed412ec92375c3cdd8a6e502493d1229b6414e4036dfa" +dependencies = [ + "async-channel 2.5.0", + "async-task", + "futures-io", + "futures-lite 2.6.1", + "piper", +] + +[[package]] +name = "bstr" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb31b46c14244e20ee9984b11bf5c992b91fb6939fea616e3512c8baecdbe5f" +dependencies = [ + "memchr", + "serde_core", +] + +[[package]] +name = "built" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c0e531d93d39c34eef561e929e8a7f86d77a5af08aac4f6d6e39976c51858e9" + [[package]] name = "bumpalo" version = "3.20.3" @@ -230,12 +817,70 @@ dependencies = [ "uuid", ] +[[package]] +name = "bytemuck" +version = "1.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0e56a716f1e132ff6bf4bdac1c944a3fcdc1cae65f70a4a2a1ac3b401d2d1f" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "bytes" version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" +[[package]] +name = "calloop" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" +dependencies = [ + "bitflags 2.13.1", + "log", + "polling", + "rustix 0.38.44", + "slab", + "thiserror 1.0.69", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" +dependencies = [ + "calloop", + "rustix 0.38.44", + "wayland-backend", + "wayland-client", +] + [[package]] name = "cbc" version = "0.1.2" @@ -245,6 +890,24 @@ dependencies = [ "cipher", ] +[[package]] +name = "cbindgen" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadd868a2ce9ca38de7eeafdcec9c7065ef89b42b32f0839278d55f35c54d1ff" +dependencies = [ + "heck 0.4.1", + "indexmap", + "log", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn 2.0.119", + "tempfile", + "toml 0.8.23", +] + [[package]] name = "cc" version = "1.4.4" @@ -252,7 +915,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ad534f4357a5264cce5019c989cf66a4f0dc4e0d1b1d15f8aacec0ff7360273" dependencies = [ "find-msvc-tools", - "shlex", + "jobserver", + "libc", + "shlex 2.0.1", +] + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom 7.1.3", ] [[package]] @@ -267,6 +941,21 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" +[[package]] +name = "cfg_aliases" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + +[[package]] +name = "cgl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" +dependencies = [ + "libc", +] + [[package]] name = "chacha20" version = "0.9.1" @@ -313,7 +1002,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -327,12 +1016,128 @@ dependencies = [ "zeroize", ] +[[package]] +name = "clang-sys" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "157a8ba7b480713b56f4c09fd13fc3e0a22a5dfab8097ba61cbc5feef950788a" +dependencies = [ + "glob", + "libc", + "libloading", +] + [[package]] name = "cmov" version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" +[[package]] +name = "cocoa" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6140449f97a6e97f9511815c5632d84c8aacf8ac271ad77c559218161a1373c" +dependencies = [ + "bitflags 1.3.2", + "block", + "cocoa-foundation 0.1.2", + "core-foundation 0.9.4", + "core-graphics 0.23.2", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f79398230a6e2c08f5c9760610eb6924b52aa9e7950a619602baba59dcbbdbb2" +dependencies = [ + "bitflags 2.13.1", + "block", + "cocoa-foundation 0.2.0", + "core-foundation 0.10.0", + "core-graphics 0.24.0", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" +dependencies = [ + "bitflags 1.3.2", + "block", + "core-foundation 0.9.4", + "core-graphics-types 0.1.3", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14045fb83be07b5acf1c0884b2180461635b433455fa35d1cd6f17f1450679d" +dependencies = [ + "bitflags 2.13.1", + "block", + "core-foundation 0.10.0", + "core-graphics-types 0.2.0", + "libc", + "objc", +] + +[[package]] +name = "codespan-reporting" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" +dependencies = [ + "serde", + "termcolor", + "unicode-width", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "command-fds" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b60b5124979fccd9addd89d8b97a1d6eebb4950694520c75ddd722535ea443f" +dependencies = [ + "nix 0.31.3", + "thiserror 2.0.20", +] + +[[package]] +name = "compression-codecs" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce2548391e9c1929c21bf6aa2680af86fe4c1b33e6cea9ac1cfeec0bd11218cf" +dependencies = [ + "compression-core", + "deflate64", + "flate2", + "memchr", +] + +[[package]] +name = "compression-core" +version = "0.4.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc14f565cf027a105f7a44ccf9e5b424348421a1d8952a8fc9d499d313107789" + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -348,6 +1153,32 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom 0.2.17", + "once_cell", + "tiny-keccak", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + [[package]] name = "cookie" version = "0.18.2" @@ -377,12 +1208,164 @@ dependencies = [ "url", ] +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "core-graphics-types 0.1.3", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" +dependencies = [ + "bitflags 2.13.1", + "core-foundation 0.10.0", + "core-graphics-types 0.2.0", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-helmer-fork" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32eb7c354ae9f6d437a6039099ce7ecd049337a8109b23d73e48e8ffba8e9cd5" +dependencies = [ + "bitflags 2.13.1", + "core-foundation 0.9.4", + "core-graphics-types 0.1.3", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.13.1", + "core-foundation 0.10.0", + "libc", +] + +[[package]] +name = "core-graphics2" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e4583956b9806b69f73fcb23aee05eb3620efc282972f08f6a6db7504f8334d" +dependencies = [ + "bitflags 2.13.1", + "block", + "cfg-if", + "core-foundation 0.10.0", + "libc", +] + +[[package]] +name = "core-text" +version = "21.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a593227b66cbd4007b2a050dfdd9e1d1318311409c8d600dc82ba1b15ca9c130" +dependencies = [ + "core-foundation 0.10.0", + "core-graphics 0.24.0", + "foreign-types", + "libc", +] + +[[package]] +name = "core-video" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d45e71d5be22206bed53c3c3cb99315fc4c3d31b8963808c6bc4538168c4f8ef" +dependencies = [ + "block", + "core-foundation 0.10.0", + "core-graphics2", + "io-surface", + "libc", + "metal", +] + +[[package]] +name = "core_maths" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30" +dependencies = [ + "libm", +] + +[[package]] +name = "cosmic-text" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da46a9d5a8905cc538a4a5bceb6a4510de7a51049c5588c0114efce102bcbbe8" +dependencies = [ + "bitflags 2.13.1", + "fontdb 0.16.2", + "log", + "rangemap", + "rustc-hash 1.1.0", + "rustybuzz 0.14.1", + "self_cell", + "smol_str", + "swash", + "sys-locale", + "ttf-parser 0.21.1", + "unicode-bidi", + "unicode-linebreak", + "unicode-script", + "unicode-segmentation", +] + [[package]] name = "cpufeatures" version = "0.2.17" @@ -401,12 +1384,55 @@ dependencies = [ "libc", ] +[[package]] +name = "crc32fast" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8498c871161e1742aaa9d52551b2d6ebdd4c3d45a3be423e3728f33b955be550" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "803d13fb3b09d88be9f4dbc29062c66b19bf7170867ceb746d2a8689bf6c7a26" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + [[package]] name = "crypto-common" version = "0.1.7" @@ -427,6 +1453,22 @@ dependencies = [ "hybrid-array", ] +[[package]] +name = "ctor" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec09e802f5081de6157da9a75701d6c713d8dc3ba52571fd4bd25f412644e8a6" +dependencies = [ + "ctor-proc-macro", + "dtor", +] + +[[package]] +name = "ctor-proc-macro" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2931af7e13dc045d8e9d26afccc6fa115d64e115c9c84b1166288b46f6782c2" + [[package]] name = "ctutils" version = "0.4.2" @@ -442,12 +1484,37 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" +[[package]] +name = "data-url" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" + +[[package]] +name = "deflate64" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac6b926516df9c60bfa16e107b21086399f8285a44ca9711344b9e553c5146e2" + [[package]] name = "deranged" version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +[[package]] +name = "derive_more" +version = "0.99.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.119", +] + [[package]] name = "digest" version = "0.10.7" @@ -471,6 +1538,63 @@ dependencies = [ "ctutils", ] +[[package]] +name = "dirs" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +dependencies = [ + "dirs-sys 0.3.7", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys 0.4.1", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.13.1", + "objc2", +] + [[package]] name = "displaydoc" version = "0.2.7" @@ -482,6 +1606,15 @@ dependencies = [ "syn 3.0.4", ] +[[package]] +name = "dlib" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a" +dependencies = [ + "libloading", +] + [[package]] name = "document-features" version = "0.2.12" @@ -497,12 +1630,138 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" +[[package]] +name = "dtor" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97cbdf2ad6846025e8e25df05171abfb30e3ababa12ee0a0e44b9bbe570633a8" +dependencies = [ + "dtor-proc-macro", +] + +[[package]] +name = "dtor-proc-macro" +version = "0.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7454e41ff9012c00d53cf7f475c5e3afa3b91b7c90568495495e8d9bf47a1055" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dwrote" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b35532432acc8b19ceed096e35dfa088d3ea037fe4f3c085f1f97f33b4d02" +dependencies = [ + "lazy_static", + "libc", + "winapi", + "wio", +] + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "either" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" + +[[package]] +name = "embed-resource" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbfdaacccebec3b28e4866b8973543c7647797db5ada1bdab552e48fe665fbbd" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 1.1.4+spec-1.1.0", + "vswhom", + "winreg 0.55.0", +] + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "equator" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" +dependencies = [ + "equator-macro", +] + +[[package]] +name = "equator-macro" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "equivalent" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +[[package]] +name = "erased-serde" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + [[package]] name = "errno" version = "0.3.14" @@ -513,6 +1772,68 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "etagere" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc89bf99e5dc15954a60f707c1e09d7540e5cd9af85fa75caa0b510bc08c5342" +dependencies = [ + "euclid", + "svg_fmt", +] + +[[package]] +name = "euclid" +version = "0.22.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a05365e3b1c6d1650318537c7460c6923f1abdd272ad6842baa2b509957a06" +dependencies = [ + "num-traits", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "5.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" +dependencies = [ + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener 5.4.2", + "pin-project-lite", +] + +[[package]] +name = "exr" +version = "1.74.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711fe42c9964295e01ee3fba3f9fe0e1d24b98886950d68efe81b1c76e21adf3" +dependencies = [ + "bit_field", + "half", + "lebe", + "miniz_oxide 0.8.9", + "num-complex", + "pulp", + "rayon-core", + "smallvec", + "zune-inflate", +] + [[package]] name = "fallible-iterator" version = "0.3.0" @@ -525,12 +1846,36 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + [[package]] name = "fastrand" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" +[[package]] +name = "fax" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caf1079563223d5d59d83c85886a56e586cfd5c1a26292e971a0fa266531ac5a" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + [[package]] name = "filedescriptor" version = "0.8.3" @@ -542,12 +1887,148 @@ dependencies = [ "winapi", ] +[[package]] +name = "filetime" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759" +dependencies = [ + "cfg-if", + "libc", +] + [[package]] name = "find-msvc-tools" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" +[[package]] +name = "flate2" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb" +dependencies = [ + "crc32fast", + "miniz_oxide 0.9.1", + "zlib-rs", +] + +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" + +[[package]] +name = "float-ord" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce81f49ae8a0482e4c55ea62ebbd7e5a686af544c00b9d090bba3ff9be97b3d" + +[[package]] +name = "float_next_after" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bf7cc16383c4b8d58b9905a8509f02926ce3058053c056376248d958c9df1e8" + +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "nanorand", + "spin", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "font-types" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e64eb721ca85a34323425f4041adc5d82704d3782d5f8f03793bc012419dce23" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "fontconfig-parser" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbc773e24e02d4ddd8395fd30dc147524273a83e54e0f312d986ea30de5f5646" +dependencies = [ + "roxmltree", +] + +[[package]] +name = "fontdb" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0299020c3ef3f60f526a4f64ab4a3d4ce116b1acbf24cdd22da0068e5d81dc3" +dependencies = [ + "fontconfig-parser", + "log", + "memmap2", + "slotmap", + "tinyvec", + "ttf-parser 0.20.0", +] + +[[package]] +name = "fontdb" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "457e789b3d1202543297a350643cf459f836cade38934e7a4cf6a39e7cde2905" +dependencies = [ + "fontconfig-parser", + "log", + "memmap2", + "slotmap", + "tinyvec", + "ttf-parser 0.25.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + [[package]] name = "form_urlencoded" version = "1.2.2" @@ -557,18 +2038,120 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "freetype-sys" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7edc5b9669349acfda99533e9e0bcf26a51862ab43b08ee7745c55d28eb134" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a31d2a3fbaaeb2af2368bbdd904aa8e812d3c04a1ee10d3171f52d556e5d0a3" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" +dependencies = [ + "futures-core", + "futures-sink", +] + [[package]] name = "futures-core" version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" +[[package]] +name = "futures-executor" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + [[package]] name = "futures-io" version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" +[[package]] +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand 1.9.0", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand 2.5.0", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[package]] +name = "futures-sink" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" + [[package]] name = "futures-task" version = "0.3.34" @@ -581,8 +2164,13 @@ version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" dependencies = [ + "futures-channel", "futures-core", + "futures-io", + "futures-macro", + "futures-sink", "futures-task", + "memchr", "pin-project-lite", "slab", ] @@ -597,6 +2185,16 @@ dependencies = [ "version_check", ] +[[package]] +name = "gethostname" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" +dependencies = [ + "rustix 1.1.4", + "windows-link 0.2.1", +] + [[package]] name = "getrandom" version = "0.2.17" @@ -610,6 +2208,18 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + [[package]] name = "getrandom" version = "0.4.3" @@ -617,9 +2227,405 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ "cfg-if", + "js-sys", "libc", - "r-efi", + "r-efi 6.0.0", "rand_core 0.10.1", + "wasm-bindgen", +] + +[[package]] +name = "gif" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159" +dependencies = [ + "color_quant", + "weezl", +] + +[[package]] +name = "glob" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" + +[[package]] +name = "globset" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07c34a9410465b45bd9787443bc7370f37735bad04b0f0cd57ff1a3186c98988" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "glow" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gpu-alloc" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45cf04b2726f02df5508c6de726acdc90cdf97ac771a9a0ffd8ba10a6e696bf9" +dependencies = [ + "bitflags 2.13.1", + "gpu-alloc-types", +] + +[[package]] +name = "gpu-alloc-ash" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643756f08ef6def813c776199e4766596395a4c6530373c9a4374a64de2f53a1" +dependencies = [ + "ash", + "gpu-alloc-types", + "tinyvec", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2bbed164dd10ed526c2e4fe3e721ca4a71c61730e5aafac6844b417b3227058" +dependencies = [ + "bitflags 2.13.1", +] + +[[package]] +name = "gpui" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "979b45cfa6ec723b6f42330915a1b3769b930d02b2d505f9697f8ca602bee707" +dependencies = [ + "anyhow", + "as-raw-xcb-connection", + "ashpd 0.11.1", + "async-task", + "bindgen", + "blade-graphics", + "blade-macros", + "blade-util", + "block", + "bytemuck", + "calloop", + "calloop-wayland-source", + "cbindgen", + "cocoa 0.26.0", + "cocoa-foundation 0.2.0", + "core-foundation 0.10.0", + "core-foundation-sys", + "core-graphics 0.24.0", + "core-text", + "core-video", + "cosmic-text", + "ctor", + "derive_more", + "embed-resource", + "etagere", + "filedescriptor", + "flume", + "foreign-types", + "futures", + "gpui-macros", + "gpui_collections", + "gpui_http_client", + "gpui_media", + "gpui_refineable", + "gpui_semantic_version", + "gpui_sum_tree", + "gpui_util", + "gpui_util_macros", + "image", + "inventory", + "itertools 0.14.0", + "libc", + "log", + "lyon", + "metal", + "naga", + "num_cpus", + "objc", + "oo7", + "open", + "parking", + "parking_lot", + "pathfinder_geometry", + "pin-project", + "postage", + "profiling", + "rand 0.9.5", + "raw-window-handle", + "resvg", + "schemars", + "seahash", + "serde", + "serde_json", + "slotmap", + "smallvec", + "smol", + "stacksafe", + "strum 0.27.2", + "taffy", + "thiserror 2.0.20", + "usvg", + "uuid", + "waker-fn", + "wayland-backend", + "wayland-client", + "wayland-cursor", + "wayland-protocols 0.31.2", + "wayland-protocols-plasma", + "windows 0.61.3", + "windows-core 0.61.2", + "windows-numerics", + "windows-registry 0.5.3", + "x11-clipboard", + "x11rb", + "xkbcommon", + "zed-font-kit", + "zed-scap", + "zed-xim", +] + +[[package]] +name = "gpui-macros" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcb02dd63a2859714ac7b6b476937617c3c744157af1b49f7c904023a79039be" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "gpui_collections" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae39dc6d3d201be97e4bc08d96dbef2bc5b5c3d5734e05786e8cc3043342351c" +dependencies = [ + "indexmap", + "rustc-hash 2.1.3", +] + +[[package]] +name = "gpui_derive_refineable" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "644de174341a87b3478bd65b66bca38af868bcf2b2e865700523734f83cfc664" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "gpui_http_client" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23822b0a6d2c5e6a42507980a0ab3848610ea908942c8ef98187f646f690335e" +dependencies = [ + "anyhow", + "async-compression", + "async-fs", + "bytes", + "derive_more", + "futures", + "gpui_util", + "http", + "http-body", + "log", + "parking_lot", + "serde", + "serde_json", + "sha2 0.10.9", + "tempfile", + "url", + "zed-async-tar", + "zed-reqwest", +] + +[[package]] +name = "gpui_media" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05cb8912ae17371725132d2b7eec6797a255accc95d58ee5c1134b529810f14b" +dependencies = [ + "anyhow", + "bindgen", + "core-foundation 0.10.0", + "core-video", + "ctor", + "foreign-types", + "metal", + "objc", +] + +[[package]] +name = "gpui_perf" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40a0961dcf598955130e867f4b731150a20546427b41b1a63767c1037a86d77" +dependencies = [ + "gpui_collections", + "serde", + "serde_json", +] + +[[package]] +name = "gpui_refineable" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "258cb099254e9468181aee5614410fba61db4ae115fc1d51b4a0b985f60d6641" +dependencies = [ + "gpui_derive_refineable", +] + +[[package]] +name = "gpui_semantic_version" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "201e45eff7b695528fb3af6560a534943fbc2db5323d755b9d198bd743948e35" +dependencies = [ + "anyhow", + "serde", +] + +[[package]] +name = "gpui_sum_tree" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4f3bedd573fafafa13d1200b356c588cf094fb2786e3684bb3f5ea59b549fa9" +dependencies = [ + "arrayvec", + "log", + "rayon", +] + +[[package]] +name = "gpui_util" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68faea25903ae524de9af83990b9aa51bcbc8dd085929ac0aea7fd41905e05c3" +dependencies = [ + "anyhow", + "async-fs", + "async_zip", + "command-fds", + "dirs 4.0.0", + "dunce", + "futures", + "futures-lite 1.13.0", + "globset", + "gpui_collections", + "itertools 0.14.0", + "libc", + "log", + "nix 0.29.0", + "regex", + "rust-embed", + "schemars", + "serde", + "serde_json", + "serde_json_lenient", + "shlex 1.3.0", + "smol", + "take-until", + "tempfile", + "tendril", + "unicase", + "walkdir", + "which", +] + +[[package]] +name = "gpui_util_macros" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c28f65ef47fb97e21e82fd4dd75ccc2506eda010c846dc8054015ea234f1a22" +dependencies = [ + "gpui_perf", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "grid" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12101ecc8225ea6d675bc70263074eab6169079621c2186fe0c66590b2df9681" + +[[package]] +name = "h2" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef8e5e5a340588f4452631496976cf8636d4a7ecf600239fdc27615d2530bc16" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "num-traits", + "zerocopy", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash", ] [[package]] @@ -628,6 +2634,18 @@ version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.5.3" @@ -658,6 +2676,32 @@ dependencies = [ "arrayvec", ] +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + +[[package]] +name = "hidden-trait" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ed9e850438ac849bec07e7d09fbe9309cbd396a5988c30b010580ce08860df" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac 0.12.1", +] + [[package]] name = "hmac" version = "0.12.1" @@ -695,6 +2739,29 @@ dependencies = [ "itoa", ] +[[package]] +name = "http-body" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + [[package]] name = "httparse" version = "1.10.1" @@ -710,6 +2777,63 @@ dependencies = [ "typenum", ] +[[package]] +name = "hyper" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b501faa50e7a26c3d3560ca625132f4078a17771f4810baf70475ae48cbe43" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-native-certs", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "libc", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + [[package]] name = "iana-time-zone" version = "0.1.65" @@ -722,7 +2846,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core", + "windows-core 0.62.2", ] [[package]] @@ -838,6 +2962,52 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "image" +version = "0.25.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" +dependencies = [ + "bytemuck", + "byteorder-lite", + "color_quant", + "exr", + "gif", + "image-webp", + "moxcms", + "num-traits", + "png 0.18.1", + "qoi", + "ravif", + "rayon", + "rgb", + "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imagesize" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" + +[[package]] +name = "imgref" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e44b0a4eaa4c82f441d50a963f2d5f05a787240aeee097597033e72accfd22f" + [[package]] name = "indexmap" version = "2.14.1" @@ -845,7 +3015,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07aa2048142242915a31d35844fb311e0e53fcca590c3a0a40dcf1b841fa09eb" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.17.1", + "serde", + "serde_core", ] [[package]] @@ -870,12 +3042,97 @@ dependencies = [ "web-sys", ] +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "inventory" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b" +dependencies = [ + "rustversion", +] + +[[package]] +name = "io-surface" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "554b8c5d64ec09a3a520fe58e4d48a73e00ff32899cdcbe32a4877afd4968b8e" +dependencies = [ + "cgl", + "core-foundation 0.10.0", + "core-foundation-sys", + "leaky-cow", +] + +[[package]] +name = "ipnet" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a756c3fac73139e83f14c2d742155dd2b78d3ee56597b419a0579b7bdd6dd78" + +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom 0.4.3", + "libc", +] + [[package]] name = "js-sys" version = "0.3.104" @@ -887,11 +3144,65 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "khronos-egl" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" +dependencies = [ + "libc", + "libloading", +] + +[[package]] +name = "kurbo" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62026ae44756f8a599ba21140f350303d4f08dcdcc71b5ad9c9bb8128c13c62" +dependencies = [ + "arrayvec", + "euclid", + "smallvec", +] + +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + [[package]] name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "leak" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd100e01f1154f2908dfa7d02219aeab25d0b9c7fa955164192e3245255a0c73" + +[[package]] +name = "leaky-cow" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40a8225d44241fd324a8af2806ba635fc7c8a7e9a7de4d5cf3ef54e71f5926fc" +dependencies = [ + "leak", +] + +[[package]] +name = "lebe" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" [[package]] name = "libc" @@ -899,6 +3210,41 @@ version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" +[[package]] +name = "libfuzzer-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9fd2f41a1cba099f79a0b6b6c35656cf7c03351a7bae8ff0f28f25270f929d2" +dependencies = [ + "arbitrary", + "cc", +] + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link 0.2.1", +] + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libredox" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7955dfc218a8afb29dfeffd540e3a6e96baeb94fe7138228dd7cc6937fbbf96" +dependencies = [ + "libc", +] + [[package]] name = "libsqlite3-sys" version = "0.38.2" @@ -910,6 +3256,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + [[package]] name = "linux-raw-sys" version = "0.12.1" @@ -942,12 +3294,39 @@ name = "log" version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" +dependencies = [ + "serde_core", + "value-bag", +] + +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" [[package]] name = "lumbridge" version = "0.0.1" dependencies = [ + "gpui", "lumbridge-core", + "lumbridge-harness", + "lumbridge-runtime", + "lumbridge-storage", + "lumbridge-terminal", + "lumbridge-ui-fixture", + "serde", + "serde_json", ] [[package]] @@ -972,7 +3351,7 @@ name = "lumbridge-harness" version = "0.0.1" dependencies = [ "lumbridge-core", - "nix", + "nix 0.28.0", "serde", "serde_json", "thiserror 2.0.20", @@ -983,7 +3362,7 @@ dependencies = [ name = "lumbridge-pty" version = "0.0.1" dependencies = [ - "nix", + "nix 0.28.0", "portable-pty", "thiserror 2.0.20", ] @@ -1013,12 +3392,195 @@ dependencies = [ "thiserror 2.0.20", ] +[[package]] +name = "lumbridge-ui-fixture" +version = "0.0.1" + +[[package]] +name = "lyon" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0578bdecb7d6d88987b8b2b1e3a4e2f81df9d0ece1078623324a567904e7b7" +dependencies = [ + "lyon_algorithms", + "lyon_tessellation", +] + +[[package]] +name = "lyon_algorithms" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdfa8785f95e57914ddb35e3b59994aeba6f5e79e9cfd03da1c269f010f36009" +dependencies = [ + "lyon_path", + "num-traits", +] + +[[package]] +name = "lyon_geom" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4336502e29e32af93cf2dad2214ed6003c17ceb5bd499df77b1de663b9042b92" +dependencies = [ + "arrayvec", + "euclid", + "num-traits", +] + +[[package]] +name = "lyon_path" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c463f9c428b7fc5ec885dcd39ce4aa61e29111d0e33483f6f98c74e89d8621e" +dependencies = [ + "lyon_geom", + "num-traits", +] + +[[package]] +name = "lyon_tessellation" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dabea159dc6eea9171a541b458134b70ca95e3162d068132b2b3b9bc01aad06e" +dependencies = [ + "float_next_after", + "lyon_path", + "num-traits", +] + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest 0.10.7", +] + [[package]] name = "memchr" version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" +[[package]] +name = "memmap2" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "metal" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" +dependencies = [ + "bitflags 2.13.1", + "block", + "core-graphics-types 0.1.3", + "foreign-types", + "log", + "objc", + "paste", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "miniz_oxide" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mint" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e53debba6bda7a793e5f99b8dacf19e626084f525f7829104ba9898f367d85ff" + +[[package]] +name = "mio" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + [[package]] name = "miow" version = "0.6.1" @@ -1028,6 +3590,56 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "moxcms" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" +dependencies = [ + "num-traits", + "pxfm", +] + +[[package]] +name = "naga" +version = "25.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b977c445f26e49757f9aca3631c3b8b836942cb278d69a92e7b80d3b24da632" +dependencies = [ + "arrayvec", + "bit-set", + "bitflags 2.13.1", + "cfg_aliases 0.2.2", + "codespan-reporting", + "half", + "hashbrown 0.15.5", + "hexf-parse", + "indexmap", + "log", + "num-traits", + "once_cell", + "rustc-hash 1.1.0", + "spirv", + "strum 0.26.3", + "thiserror 2.0.20", + "unicode-ident", +] + +[[package]] +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + [[package]] name = "nix" version = "0.28.0" @@ -1036,10 +3648,68 @@ checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" dependencies = [ "bitflags 2.13.1", "cfg-if", - "cfg_aliases", + "cfg_aliases 0.1.1", "libc", ] +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.13.1", + "cfg-if", + "cfg_aliases 0.2.2", + "libc", +] + +[[package]] +name = "nix" +version = "0.31.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" +dependencies = [ + "bitflags 2.13.1", + "cfg-if", + "cfg_aliases 0.2.2", + "libc", +] + +[[package]] +name = "no_std_io2" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418abd1b6d34fbf6cae440dc874771b0525a604428704c76e48b29a5e67b8003" +dependencies = [ + "memchr", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + [[package]] name = "nostr" version = "0.44.8" @@ -1064,12 +3734,113 @@ dependencies = [ "url", ] +[[package]] +name = "ntapi" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3b335231dfd352ffb0f8017f3b6027a4917f7df785ea2143d8af2adc66980ae" +dependencies = [ + "winapi", +] + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" +dependencies = [ + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.8", + "serde", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "bytemuck", + "num-traits", +] + [[package]] name = "num-conv" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "num-integer" +version = "0.1.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -1077,6 +3848,153 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", + "objc_exception", +] + +[[package]] +name = "objc-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] + +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.13.1", + "objc2", + "objc2-core-foundation", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.13.1", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.13.1", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-metal" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0125f776a10d00af4152d74616409f0d4a2053a6f57fa5b7d6aa2854ac04794" +dependencies = [ + "bitflags 2.13.1", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.13.1", + "objc2", + "objc2-core-foundation", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.13.1", + "objc2", + "objc2-core-foundation", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc_exception" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +dependencies = [ + "cc", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + +[[package]] +name = "object" +version = "0.39.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e5a6c098c7a3b6547378093f5cc30bc54fd361ce711e05293a5cc589562739b" +dependencies = [ + "memchr", ] [[package]] @@ -1085,12 +4003,85 @@ version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" +[[package]] +name = "oo7" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3299dd401feaf1d45afd8fd1c0586f10fcfb22f244bb9afa942cec73503b89d" +dependencies = [ + "aes", + "ashpd 0.12.3", + "async-fs", + "async-io", + "async-lock", + "blocking", + "cbc", + "cipher", + "digest 0.10.7", + "endi", + "futures-lite 2.6.1", + "futures-util", + "getrandom 0.3.4", + "hkdf", + "hmac 0.12.1", + "md-5", + "num", + "num-bigint-dig", + "pbkdf2", + "rand 0.9.5", + "serde", + "sha2 0.10.9", + "subtle", + "zbus", + "zbus_macros", + "zeroize", + "zvariant", +] + [[package]] name = "opaque-debug" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" +[[package]] +name = "open" +version = "5.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade3be4664bc1ef537ce133015f04c176b737815c2ba9fd60edf212d6e90dd55" +dependencies = [ + "is-wsl", + "libc", +] + +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + [[package]] name = "parking_lot" version = "0.12.5" @@ -1109,9 +4100,9 @@ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.18", "smallvec", - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -1125,6 +4116,37 @@ dependencies = [ "subtle", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pastey" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" + +[[package]] +name = "pathfinder_geometry" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b7e7b4ea703700ce73ebf128e1450eb69c3a8329199ffbfb9b2a0418e5ad3" +dependencies = [ + "log", + "pathfinder_simd", +] + +[[package]] +name = "pathfinder_simd" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4500030c302e4af1d423f36f3b958d1aecb6c04184356ed5a833bf6b60435777" +dependencies = [ + "rustc_version", +] + [[package]] name = "pbkdf2" version = "0.12.2" @@ -1141,12 +4163,44 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +[[package]] +name = "pico-args" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" + +[[package]] +name = "pin-project" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "pin-project-lite" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + [[package]] name = "piper" version = "0.2.5" @@ -1154,7 +4208,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" dependencies = [ "atomic-waker", - "fastrand", + "fastrand 2.5.0", "futures-io", ] @@ -1164,6 +4218,32 @@ version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide 0.8.9", +] + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags 2.13.1", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide 0.8.9", +] + [[package]] name = "polling" version = "3.11.0" @@ -1174,10 +4254,16 @@ dependencies = [ "concurrent-queue", "hermit-abi", "pin-project-lite", - "rustix", + "rustix 1.1.4", "windows-sys 0.61.2", ] +[[package]] +name = "pollster" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5da3b0203fd7ee5720aa0b5e790b591aa5d3f41c3ed2c34a3a393382198af2f7" + [[package]] name = "poly1305" version = "0.8.0" @@ -1202,12 +4288,29 @@ dependencies = [ "lazy_static", "libc", "log", - "nix", + "nix 0.28.0", "serial2", "shared_library", "shell-words", "winapi", - "winreg", + "winreg 0.10.1", +] + +[[package]] +name = "postage" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af3fb618632874fb76937c2361a7f22afd393c982a2165595407edc75b06d3c1" +dependencies = [ + "atomic", + "crossbeam-queue", + "futures", + "log", + "parking_lot", + "pin-project", + "pollster", + "static_assertions", + "thiserror 1.0.69", ] [[package]] @@ -1234,6 +4337,47 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.119", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit 0.25.13+spec-1.1.0", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "proc-macro2" version = "1.0.107" @@ -1243,6 +4387,144 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "profiling" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4488a4a36b9a4ba6b9334a32a39971f77c1436ec82c38707bce707699cc3bbcb" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "psm" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd034599e63b970727f70d79e02d62390a4a84f7c6b827c27c46d5ac3fa622" +dependencies = [ + "ar_archive_writer", + "cc", +] + +[[package]] +name = "pulp" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046aa45b989642ec2e4717c8e72d677b13edd831a4d3b6cf37d9a3e54912496a" +dependencies = [ + "bytemuck", + "cfg-if", + "libm", + "num-complex", + "paste", + "pulp-wasm-simd-flag", + "raw-cpuid", + "reborrow", + "version_check", +] + +[[package]] +name = "pulp-wasm-simd-flag" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d8f70e07b9c3962945a74e59ca1c511bba65b6419468acc217c457d93f3c740" + +[[package]] +name = "pxfm" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea" + +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + +[[package]] +name = "quick-xml" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1" +dependencies = [ + "memchr", +] + +[[package]] +name = "quinn" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" +dependencies = [ + "bytes", + "cfg_aliases 0.2.2", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash 2.1.3", + "rustls", + "socket2", + "thiserror 2.0.20", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04759210543be93709136e28212294a659ef5001836ff4eab4d663e4529bba83" +dependencies = [ + "bytes", + "getrandom 0.4.3", + "lru-slab", + "rand 0.10.2", + "rand_pcg", + "ring", + "rustc-hash 2.1.3", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.20", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" +dependencies = [ + "cfg_aliases 0.2.2", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.61.2", +] + [[package]] name = "quote" version = "1.0.47" @@ -1252,6 +4534,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "r-efi" version = "6.0.0" @@ -1265,10 +4553,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e058c7de0b26af77780c769414d6257830bb240f3c38477dbc2c16e5f54d6d4c" dependencies = [ "libc", - "rand_chacha", + "rand_chacha 0.3.1", "rand_core 0.6.4", ] +[[package]] +name = "rand" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + [[package]] name = "rand" version = "0.10.2" @@ -1290,6 +4588,16 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + [[package]] name = "rand_core" version = "0.6.4" @@ -1299,12 +4607,159 @@ dependencies = [ "getrandom 0.2.17", ] +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + [[package]] name = "rand_core" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" +dependencies = [ + "rand_core 0.10.1", +] + +[[package]] +name = "rangemap" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a611d15b50743feb4c76b7d03edcb0e64f399c26961e4efe6975bc398be6aa3d" + +[[package]] +name = "rav1e" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" +dependencies = [ + "aligned-vec", + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av-scenechange", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools 0.14.0", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "paste", + "profiling", + "rand 0.9.5", + "rand_chacha 0.9.0", + "simd_helpers", + "thiserror 2.0.20", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e52310197d971b0f5be7fe6b57530dcd27beb35c1b013f29d66c1ad73fbbcc45" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + +[[package]] +name = "raw-cpuid" +version = "11.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" +dependencies = [ + "bitflags 2.13.1", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "raw-window-metal" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76e8caa82e31bb98fee12fa8f051c94a6aa36b07cddb03f0d4fc558988360ff1" +dependencies = [ + "cocoa 0.25.0", + "core-graphics 0.23.2", + "objc", + "raw-window-handle", +] + +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "read-fonts" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046a7d674daf459825b32f5062056d6882db0d2f5a479fbd76ccfc870ac18709" +dependencies = [ + "bytemuck", + "font-types", + "once_cell", +] + +[[package]] +name = "reborrow" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "redox_syscall" version = "0.5.18" @@ -1314,6 +4769,49 @@ dependencies = [ "bitflags 2.13.1", ] +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "ref-cast" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e440fb4e4b4147295338efb76001ab9e4efc0e5839df2c47fc5ac2381d365c3" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecd8964f8453721699a1ed72037b0db49ce2f5a5138486ee89bed6f67cdf3a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + [[package]] name = "regex-automata" version = "0.4.18" @@ -1331,6 +4829,29 @@ version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" +[[package]] +name = "resvg" +version = "0.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8928798c0a55e03c9ca6c4c6846f76377427d2c1e1f7e6de3c06ae57942df43" +dependencies = [ + "log", + "pico-args", + "rgb", + "svgtypes", + "tiny-skia", + "usvg", +] + +[[package]] +name = "rgb" +version = "0.8.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" +dependencies = [ + "bytemuck", +] + [[package]] name = "ring" version = "0.17.14" @@ -1345,6 +4866,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "roxmltree" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" + [[package]] name = "rusqlite" version = "0.40.2" @@ -1358,6 +4885,76 @@ dependencies = [ "smallvec", ] +[[package]] +name = "rust-embed" +version = "8.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9e7760e252aaba7b09f4be00e36476cf585bdb68a53552ac954cdf504ab4bc9" +dependencies = [ + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "8.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bcfc4d6f53af43755f7a723e4b6b8794fcce052a178dd8c6c1dadc5f5343097" +dependencies = [ + "mime_guess", + "proc-macro2", + "quote", + "rust-embed-utils", + "syn 2.0.119", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "8.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ffa149f6aa81b58a5b3011d01a857c4ed12c7a732d2c51947a4c7c692185f0" +dependencies = [ + "globset", + "sha2 0.11.0", + "walkdir", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.13.1", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + [[package]] name = "rustix" version = "1.1.4" @@ -1367,7 +4964,7 @@ dependencies = [ "bitflags 2.13.1", "errno", "libc", - "linux-raw-sys", + "linux-raw-sys 0.12.1", "windows-sys 0.61.2", ] @@ -1379,7 +4976,7 @@ checksum = "1de16c7c59892b870a6336f185dc10943517f1327447096bbb7bb32cd85e2393" dependencies = [ "errno", "libc", - "rustix", + "rustix 1.1.4", ] [[package]] @@ -1397,12 +4994,34 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls-native-certs" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "rustls-pki-types" version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" dependencies = [ + "web-time", "zeroize", ] @@ -1423,6 +5042,47 @@ version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" +[[package]] +name = "rustybuzz" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfb9cf8877777222e4a3bc7eb247e398b56baba500c38c1c46842431adc8b55c" +dependencies = [ + "bitflags 2.13.1", + "bytemuck", + "libm", + "smallvec", + "ttf-parser 0.21.1", + "unicode-bidi-mirroring 0.2.0", + "unicode-ccc 0.2.0", + "unicode-properties", + "unicode-script", +] + +[[package]] +name = "rustybuzz" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702" +dependencies = [ + "bitflags 2.13.1", + "bytemuck", + "core_maths", + "log", + "smallvec", + "ttf-parser 0.25.1", + "unicode-bidi-mirroring 0.4.0", + "unicode-ccc 0.4.0", + "unicode-properties", + "unicode-script", +] + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + [[package]] name = "salsa20" version = "0.10.2" @@ -1432,12 +5092,85 @@ dependencies = [ "cipher", ] +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "schemars" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a" +dependencies = [ + "dyn-clone", + "indexmap", + "ref-cast", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98c67716b46af2f0b8cf752abc930f6f9aecfbf671ecfb531db8a31dbe4e2ba" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 3.0.4", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "screencapturekit" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5eeeb57ac94960cfe5ff4c402be6585ae4c8d29a2cf41b276048c2e849d64e" +dependencies = [ + "screencapturekit-sys", +] + +[[package]] +name = "screencapturekit-sys" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22411b57f7d49e7fe08025198813ee6fd65e1ee5eff4ebc7880c12c82bde4c60" +dependencies = [ + "block", + "dispatch", + "objc", + "objc-foundation", + "objc_id", + "once_cell", +] + [[package]] name = "scrypt" version = "0.11.0" @@ -1450,6 +5183,12 @@ dependencies = [ "sha2 0.10.9", ] +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + [[package]] name = "secp256k1" version = "0.29.1" @@ -1470,6 +5209,41 @@ dependencies = [ "cc", ] +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags 2.13.1", + "core-foundation 0.10.0", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "self_cell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab42ca02749e120097e328d91d415325bdf43b1c72c4c8badf37375fe40a813" + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + [[package]] name = "serde" version = "1.0.229" @@ -1500,12 +5274,33 @@ dependencies = [ "syn 3.0.4", ] +[[package]] +name = "serde_derive_internals" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f852137cce035d6a4df67ccce505ff6b3e9fd3a10e3e52b24dc71e650bb1a9bd" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[package]] +name = "serde_fmt" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e497af288b3b95d067a23a4f749f2861121ffcb2f6d8379310dcda040c345ed" +dependencies = [ + "serde_core", +] + [[package]] name = "serde_json" version = "1.0.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" dependencies = [ + "indexmap", "itoa", "memchr", "serde", @@ -1513,6 +5308,60 @@ dependencies = [ "zmij", ] +[[package]] +name = "serde_json_lenient" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e033097bf0d2b59a62b42c18ebbb797503839b26afdda2c4e1415cb6c813540" +dependencies = [ + "indexmap", + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + [[package]] name = "serial2" version = "0.2.38" @@ -1524,6 +5373,12 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "sha1_smol" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" + [[package]] name = "sha2" version = "0.10.9" @@ -1562,6 +5417,12 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "shlex" version = "2.0.1" @@ -1588,30 +5449,339 @@ dependencies = [ "libc", ] +[[package]] +name = "simd-adler32" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + +[[package]] +name = "simplecss" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a9c6883ca9c3c7c90e888de77b7a5c849c779d25d74a1269b0218b14e8b136c" +dependencies = [ + "log", +] + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "skrifa" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819ab7d62b1d3e72d9d9dea5650bac30424f9111364bb94928dbf5ecad1baa68" +dependencies = [ + "bytemuck", + "read-fonts", +] + [[package]] name = "slab" version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" +[[package]] +name = "slotmap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" +dependencies = [ + "version_check", +] + [[package]] name = "smallvec" version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" +[[package]] +name = "smol" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33bd3e260892199c3ccfc487c88b2da2265080acb316cd920da72fdfd7c599f" +dependencies = [ + "async-channel 2.5.0", + "async-executor", + "async-fs", + "async-io", + "async-lock", + "async-net", + "async-process", + "blocking", + "futures-lite 2.6.1", +] + +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" + +[[package]] +name = "socket2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "spin" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spirv" +version = "0.3.0+sdk-1.3.268.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" +dependencies = [ + "bitflags 2.13.1", +] + [[package]] name = "stable_deref_trait" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" +[[package]] +name = "stacker" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707f49d46706bacf8a2b00d51dace3f9de527c13eec3778f570c411f89e69967" +dependencies = [ + "cc", + "cfg-if", + "libc", + "psm", + "windows-sys 0.61.2", +] + +[[package]] +name = "stacksafe" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d9c1172965d317e87ddb6d364a040d958b40a1db82b6ef97da26253a8b3d090" +dependencies = [ + "stacker", + "stacksafe-macro", +] + +[[package]] +name = "stacksafe-macro" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "172175341049678163e979d9107ca3508046d4d2a7c6682bee46ac541b17db69" +dependencies = [ + "proc-macro-error2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" +dependencies = [ + "float-cmp", +] + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros 0.26.4", +] + +[[package]] +name = "strum" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +dependencies = [ + "strum_macros 0.27.2", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.119", +] + +[[package]] +name = "strum_macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "subtle" version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "sval" +version = "2.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b81b254da21fe1fcc4e3a74fe39b46e25e3a863078f8b71c954d47f84889dbc6" + +[[package]] +name = "sval_buffer" +version = "2.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50be352d2822ffafb59e3e2ddac9d5ee60f2eeadbb7b5a2a951b9f3651e87a6f" +dependencies = [ + "sval", + "sval_ref", + "zerocopy", +] + +[[package]] +name = "sval_dynamic" +version = "2.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048ca293b998d9a45659159f94a64063791e74cdc670164943dbb434405573d" +dependencies = [ + "sval", +] + +[[package]] +name = "sval_fmt" +version = "2.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6b5888e40f80568733217f27b7317b845f463400ced36c424b1a804730e53b2" +dependencies = [ + "itoa", + "ryu", + "sval", +] + +[[package]] +name = "sval_json" +version = "2.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17664d6bb6b74947afaab9d7c991caa9bf5638d4dee16fcbef637f440796049" +dependencies = [ + "itoa", + "ryu", + "sval", +] + +[[package]] +name = "sval_nested" +version = "2.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07c059969ca5ca163ea7fef6c9661758973d17691aba92abdcf5c428f4ec122c" +dependencies = [ + "sval", + "sval_buffer", + "sval_ref", +] + +[[package]] +name = "sval_ref" +version = "2.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d6b29ff568c85c87561807f51d2adfff4b6016c6363133f7cd1652a12548f3" +dependencies = [ + "sval", +] + +[[package]] +name = "sval_serde" +version = "2.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f33ec9edc42b12764d5c90ca0a1d84189c6bde81ed27507f1e661c6e4e05853" +dependencies = [ + "serde_core", + "sval", + "sval_nested", +] + +[[package]] +name = "svg_fmt" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0193cc4331cfd2f3d2011ef287590868599a2f33c3e69bc22c1a3d3acf9e02fb" + +[[package]] +name = "svgtypes" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" +dependencies = [ + "kurbo", + "siphasher", +] + +[[package]] +name = "swash" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c2499c2d826531388872b2268718aed907a39bd785ab0dcfe57fab26283f92e" +dependencies = [ + "skrifa", + "yazi", + "zeno", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.119" @@ -1634,6 +5804,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + [[package]] name = "synstructure" version = "0.13.2" @@ -1645,6 +5824,113 @@ dependencies = [ "syn 2.0.119", ] +[[package]] +name = "sys-locale" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" +dependencies = [ + "libc", +] + +[[package]] +name = "sysinfo" +version = "0.31.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "355dbe4f8799b304b05e1b0f05fc59b2a18d36645cf169607da45bde2f69a1be" +dependencies = [ + "core-foundation-sys", + "libc", + "memchr", + "ntapi", + "rayon", + "windows 0.57.0", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.13.1", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "taffy" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a13e5d13f79d558b5d353a98072ca8ca0e99da429467804de959aa8c83c9a004" +dependencies = [ + "arrayvec", + "grid", + "serde", + "slotmap", +] + +[[package]] +name = "take-until" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bdb6fa0dfa67b38c1e66b7041ba9dcf23b99d8121907cd31c807a332f7a0bbb" + +[[package]] +name = "tao-core-video-sys" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271450eb289cb4d8d0720c6ce70c72c8c858c93dd61fc625881616752e6b98f6" +dependencies = [ + "cfg-if", + "core-foundation-sys", + "libc", + "objc", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand 2.5.0", + "getrandom 0.4.3", + "once_cell", + "rustix 1.1.4", + "windows-sys 0.61.2", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -1685,6 +5971,20 @@ dependencies = [ "syn 3.0.4", ] +[[package]] +name = "tiff" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52" +dependencies = [ + "fax", + "flate2", + "half", + "quick-error", + "weezl", + "zune-jpeg", +] + [[package]] name = "time" version = "0.3.55" @@ -1715,6 +6015,41 @@ dependencies = [ "time-core", ] +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tiny-skia" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "log", + "png 0.17.16", + "tiny-skia-path", +] + +[[package]] +name = "tiny-skia-path" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + [[package]] name = "tinystr" version = "0.8.4" @@ -1740,18 +6075,304 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "tokio" +version = "1.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-socks" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7e2948f60dbe26b35f2c7fb74ac2854c1fddded0fe9d7548fcc674a246f7615" +dependencies = [ + "either", + "futures-util", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "libc", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", +] + +[[package]] +name = "toml" +version = "1.1.4+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.4", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_write", + "winnow 0.7.15", +] + +[[package]] +name = "toml_edit" +version = "0.25.13+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" +dependencies = [ + "indexmap", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "winnow 1.0.4", +] + +[[package]] +name = "toml_parser" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +dependencies = [ + "winnow 1.0.4", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "toml_writer" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "ttf-parser" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" + +[[package]] +name = "ttf-parser" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c591d83f69777866b9126b24c6dd9a18351f177e49d625920d19f989fd31cf8" + +[[package]] +name = "ttf-parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" +dependencies = [ + "core_maths", +] + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + [[package]] name = "typenum" version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" +[[package]] +name = "uds_windows" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" +dependencies = [ + "memoffset", + "tempfile", + "windows-sys 0.61.2", +] + +[[package]] +name = "unicase" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-bidi-mirroring" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cb788ffebc92c5948d0e997106233eeb1d8b9512f93f41651f52b6c5f5af86" + +[[package]] +name = "unicode-bidi-mirroring" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfa6e8c60bb66d49db113e0125ee8711b7647b5579dc7f5f19c42357ed039fe" + +[[package]] +name = "unicode-ccc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df77b101bcc4ea3d78dafc5ad7e4f58ceffe0b2b16bf446aeb50b6cb4157656" + +[[package]] +name = "unicode-ccc" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce61d488bcdc9bc8b5d1772c404828b17fc481c0a582b5581e95fb233aef503e" + [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + [[package]] name = "unicode-normalization" version = "0.1.25" @@ -1761,6 +6382,30 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-properties" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" + +[[package]] +name = "unicode-script" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "383ad40bb927465ec0ce7720e033cb4ca06912855fc35db31b5755d0de75b1ee" + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "unicode-vo" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" + [[package]] name = "unicode-width" version = "0.2.2" @@ -1827,6 +6472,39 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "usvg" +version = "0.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80be9b06fbae3b8b303400ab20778c80bbaf338f563afe567cf3c9eea17b47ef" +dependencies = [ + "base64 0.22.1", + "data-url", + "flate2", + "fontdb 0.23.0", + "imagesize", + "kurbo", + "log", + "pico-args", + "roxmltree", + "rustybuzz 0.20.1", + "simplecss", + "siphasher", + "strict-num", + "svgtypes", + "tiny-skia-path", + "unicode-bidi", + "unicode-script", + "unicode-vo", + "xmlwriter", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + [[package]] name = "utf8-zero" version = "0.8.1" @@ -1848,9 +6526,57 @@ dependencies = [ "getrandom 0.4.3", "js-sys", "serde_core", + "sha1_smol", "wasm-bindgen", ] +[[package]] +name = "v_frame" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + +[[package]] +name = "value-bag" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "068e763e8279de7ab94b6afebded2cb701678af094feb1c12ccb061b4783c1be" +dependencies = [ + "value-bag-serde1", + "value-bag-sval2", +] + +[[package]] +name = "value-bag-serde1" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27780e3aec98b13ac796bc0d5770205ee6e976d1ccb33a52da70b73ff0ff880d" +dependencies = [ + "erased-serde", + "serde_core", + "serde_fmt", +] + +[[package]] +name = "value-bag-sval2" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c093d229c7ead9974b640e61170976e0eff3dac447cf6792c645f0b7f28b3de" +dependencies = [ + "sval", + "sval_buffer", + "sval_dynamic", + "sval_fmt", + "sval_json", + "sval_ref", + "sval_serde", +] + [[package]] name = "vcpkg" version = "0.2.15" @@ -1863,6 +6589,26 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "vte" version = "0.15.0" @@ -1876,12 +6622,46 @@ dependencies = [ "memchr", ] +[[package]] +name = "waker-fn" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + [[package]] name = "wasm-bindgen" version = "0.2.127" @@ -1895,6 +6675,16 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b7777d5cc23d0e91404e53ce2d5e8ec7acae3026b16233dba62cd3246457950" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.127" @@ -1927,6 +6717,116 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wayland-backend" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38a91b4eaddff87b1cd1074985e3713da4af2c49742d1b356b2c01670a67a078" +dependencies = [ + "cc", + "downcast-rs", + "rustix 1.1.4", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c36a0f861ad76d0901f2800b46321410d9f73f2ea88aac0650d86c32688073" +dependencies = [ + "bitflags 2.13.1", + "rustix 1.1.4", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-cursor" +version = "0.31.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a52d18780be9b1314328a3de5f930b73d2200112e3849ca6cb11822793fb34d" +dependencies = [ + "rustix 1.1.4", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4" +dependencies = [ + "bitflags 2.13.1", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d0c813de3daa2ed6520af85a3bd49b0e722a3078506899aa9686fea58dc4b6" +dependencies = [ + "bitflags 2.13.1", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-plasma" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23803551115ff9ea9bce586860c5c5a971e360825a0309264102a9495a5ff479" +dependencies = [ + "bitflags 2.13.1", + "wayland-backend", + "wayland-client", + "wayland-protocols 0.31.2", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "338e30461b3a2b67d70eb30a6d89f8e0c93a833e07d2ae89085cd070c4a00ac0" +dependencies = [ + "proc-macro2", + "quick-xml", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8eab23fefc9e41f8e841df4a9c707e8a8c4ed26e944ef69297184de2785e3be" +dependencies = [ + "dlib", + "log", + "once_cell", + "pkg-config", +] + [[package]] name = "web-sys" version = "0.3.104" @@ -1937,6 +6837,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "webpki-roots" version = "1.0.9" @@ -1946,6 +6856,24 @@ dependencies = [ "rustls-pki-types", ] +[[package]] +name = "weezl" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" + +[[package]] +name = "which" +version = "6.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ee928febd44d98f2f459a4a79bd4d928591333a494a10a868418ac1b39cf1f" +dependencies = [ + "either", + "home", + "rustix 0.38.44", + "winsafe", +] + [[package]] name = "winapi" version = "0.3.9" @@ -1962,23 +6890,124 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" +dependencies = [ + "windows-core 0.57.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-capture" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a4df73e95feddb9ec1a7e9c2ca6323b8c97d5eeeff78d28f1eccdf19c882b24" +dependencies = [ + "parking_lot", + "rayon", + "thiserror 2.0.20", + "windows 0.61.3", + "windows-future", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" +dependencies = [ + "windows-implement 0.57.0", + "windows-interface 0.57.0", + "windows-result 0.1.2", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement 0.60.2", + "windows-interface 0.59.3", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + [[package]] name = "windows-core" version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result", - "windows-strings", + "windows-implement 0.60.2", + "windows-interface 0.59.3", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", ] [[package]] @@ -1992,6 +7021,17 @@ dependencies = [ "syn 2.0.119", ] +[[package]] +name = "windows-interface" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "windows-interface" version = "0.59.3" @@ -2003,19 +7043,93 @@ dependencies = [ "syn 2.0.119", ] +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-registry" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" +dependencies = [ + "windows-result 0.3.4", + "windows-strings 0.3.1", + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-registry" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +dependencies = [ + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + [[package]] name = "windows-result" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-link", + "windows-link 0.2.1", +] + +[[package]] +name = "windows-strings" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", ] [[package]] @@ -2024,7 +7138,16 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ - "windows-link", + "windows-link 0.2.1", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", ] [[package]] @@ -2033,7 +7156,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -2042,7 +7165,7 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -2051,7 +7174,22 @@ version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-link", + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] @@ -2060,64 +7198,198 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.10.1" @@ -2127,12 +7399,175 @@ dependencies = [ "winapi", ] +[[package]] +name = "winreg" +version = "0.55.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" +dependencies = [ + "cfg-if", + "windows-sys 0.59.0", +] + +[[package]] +name = "winsafe" +version = "0.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" + +[[package]] +name = "wio" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5" +dependencies = [ + "winapi", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + [[package]] name = "writeable" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-clipboard" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "662d74b3d77e396b8e5beb00b9cad6a9eccf40b2ef68cc858784b14c41d535a3" +dependencies = [ + "libc", + "x11rb", +] + +[[package]] +name = "x11rb" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" +dependencies = [ + "as-raw-xcb-connection", + "gethostname", + "libc", + "rustix 1.1.4", + "x11rb-protocol", + "xcursor", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" + +[[package]] +name = "xattr" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" +dependencies = [ + "libc", +] + +[[package]] +name = "xcb" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6c2ad15e0e922856ee89afe862b8992334bbe7953adad56cd1199358cb30566" +dependencies = [ + "bitflags 2.13.1", + "libc", + "quick-xml", + "x11", +] + +[[package]] +name = "xcursor" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "163b33ed8786455e2fa5d72f554057ce3f3182425434f756cd39c99839d88e23" + +[[package]] +name = "xim-ctext" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ac61a7062c40f3c37b6e82eeeef835d5cc7824b632a72784a89b3963c33284c" +dependencies = [ + "encoding_rs", +] + +[[package]] +name = "xim-parser" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dcee45f89572d5a65180af3a84e7ddb24f5ea690a6d3aa9de231281544dd7b7" +dependencies = [ + "bitflags 2.13.1", +] + +[[package]] +name = "xkbcommon" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d66ca9352cbd4eecbbc40871d8a11b4ac8107cfc528a6e14d7c19c69d0e1ac9" +dependencies = [ + "as-raw-xcb-connection", + "libc", + "memmap2", + "xkeysym", +] + +[[package]] +name = "xkeysym" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" + +[[package]] +name = "xmlwriter" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" + +[[package]] +name = "y4m" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" + +[[package]] +name = "yazi" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01738255b5a16e78bbb83e7fbba0a1e7dd506905cfc53f4622d89015a03fbb5" + +[[package]] +name = "yeslogic-fontconfig-sys" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d8b8abf912b9a29ff112e1671c97c33636903d13a69712037190e6805af4f76" +dependencies = [ + "dlib", + "once_cell", + "pkg-config", +] + [[package]] name = "yoke" version = "0.8.3" @@ -2156,6 +7591,207 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zbus" +version = "5.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5db4be7c075cb421e4b7ee645541604239bd243ba7c357511f4ff3a74b555907" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener 5.4.2", + "futures-core", + "futures-lite 2.6.1", + "hex", + "libc", + "ordered-stream", + "rustix 1.1.4", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow 1.0.4", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2990635d09ade6df1868f72f8cac69a876a90981e8bd3c40b1be413f8dc88f40" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 3.0.4", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8bf88b4a3ff53e883001e0e0115b297a9d53c31b9c1edd2bfdd853e3428624e" +dependencies = [ + "serde", + "winnow 1.0.4", + "zvariant", +] + +[[package]] +name = "zcheapstr" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1afec51604565183aeb5c54c20aeab286120d4e4460f7f76e3e8bb8c0d99473" +dependencies = [ + "serde", +] + +[[package]] +name = "zed-async-tar" +version = "0.5.0-zed" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cf4b5f655e29700e473cb1acd914ab112b37b62f96f7e642d5fc6a0c02eb881" +dependencies = [ + "async-std", + "filetime", + "libc", + "pin-project", + "redox_syscall 0.2.16", + "xattr", +] + +[[package]] +name = "zed-font-kit" +version = "0.14.1-zed" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3898e450f36f852edda72e3f985c34426042c4951790b23b107f93394f9bff5" +dependencies = [ + "bitflags 2.13.1", + "byteorder", + "core-foundation 0.10.0", + "core-graphics 0.24.0", + "core-text", + "dirs 5.0.1", + "dwrote", + "float-ord", + "freetype-sys", + "lazy_static", + "libc", + "log", + "pathfinder_geometry", + "pathfinder_simd", + "walkdir", + "winapi", + "yeslogic-fontconfig-sys", +] + +[[package]] +name = "zed-reqwest" +version = "0.12.15-zed" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac2d05756ff48539950c3282ad7acf3817ad3f08797c205ad1c34a2ce03b9970" +dependencies = [ + "base64 0.22.1", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "mime_guess", + "once_cell", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-native-certs", + "rustls-pemfile", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-rustls", + "tokio-socks", + "tokio-util", + "tower", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "windows-registry 0.4.0", +] + +[[package]] +name = "zed-scap" +version = "0.0.8-zed" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b338d705ae33a43ca00287c11129303a7a0aa57b101b72a1c08c863f698ac8" +dependencies = [ + "anyhow", + "cocoa 0.25.0", + "core-graphics-helmer-fork", + "log", + "objc", + "rand 0.8.8", + "screencapturekit", + "screencapturekit-sys", + "sysinfo", + "tao-core-video-sys", + "windows 0.61.3", + "windows-capture", + "x11", + "xcb", +] + +[[package]] +name = "zed-xim" +version = "0.4.0-zed" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0b46ed118eba34d9ba53d94ddc0b665e0e06a2cf874cfa2dd5dec278148642" +dependencies = [ + "ahash", + "hashbrown 0.14.5", + "log", + "x11rb", + "xim-ctext", + "xim-parser", +] + +[[package]] +name = "zeno" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" + [[package]] name = "zerocopy" version = "0.8.56" @@ -2202,6 +7838,20 @@ name = "zeroize" version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] [[package]] name = "zerotrie" @@ -2236,8 +7886,80 @@ dependencies = [ "syn 3.0.4", ] +[[package]] +name = "zlib-rs" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b31d188d9d685a4f9c7b46d6e36631b07058d2cfe190267adce54dc230bf12" + [[package]] name = "zmij" version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" + +[[package]] +name = "zune-core" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56377fd46368984a170bc5aac5567e52ca5da874caa60bea39fcbca78fb658b" + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "zune-jpeg" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296" +dependencies = [ + "zune-core", +] + +[[package]] +name = "zvariant" +version = "5.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1d34c27cc6cdd1f458427519dd6b8612f7b7e3f7b9a0b2355d041dda9869147" +dependencies = [ + "endi", + "enumflags2", + "serde", + "url", + "winnow 1.0.4", + "zcheapstr", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "864155e69b4352db0c7f374917bf45d1e0c8d17659c8b3dbf9795f3673f8c497" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 3.0.4", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad0294361a320b694a328460dc73add56c306150f5cb6bfafc44446120008a3" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 3.0.4", + "winnow 1.0.4", +] diff --git a/Cargo.toml b/Cargo.toml index 6e186d3..61e78df 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,7 @@ members = [ "crates/lumbridge-runtime", "crates/lumbridge-storage", "crates/lumbridge-terminal", + "crates/lumbridge-ui-fixture", ] exclude = ["spikes"] resolver = "2" diff --git a/apps/lumbridge/Cargo.toml b/apps/lumbridge/Cargo.toml index 3b8d893..8464073 100644 --- a/apps/lumbridge/Cargo.toml +++ b/apps/lumbridge/Cargo.toml @@ -8,8 +8,15 @@ license.workspace = true repository.workspace = true [dependencies] +gpui = "0.2.2" lumbridge-core = { path = "../../crates/lumbridge-core" } +lumbridge-harness = { path = "../../crates/lumbridge-harness" } +lumbridge-runtime = { path = "../../crates/lumbridge-runtime" } +lumbridge-storage = { path = "../../crates/lumbridge-storage" } +lumbridge-terminal = { path = "../../crates/lumbridge-terminal" } +lumbridge-ui-fixture = { path = "../../crates/lumbridge-ui-fixture" } +serde = { version = "1.0.228", features = ["derive"] } +serde_json = "1.0.149" [lints] workspace = true - diff --git a/apps/lumbridge/src/main.rs b/apps/lumbridge/src/main.rs index ce0a043..1024582 100644 --- a/apps/lumbridge/src/main.rs +++ b/apps/lumbridge/src/main.rs @@ -1,11 +1,3062 @@ -use lumbridge_core::{Platform, ProductStatus}; +mod panel_registry; +mod usage_feed; + +use std::collections::{BTreeMap, VecDeque}; +use std::path::PathBuf; +use std::time::{Duration, Instant}; + +use gpui::{ + App, Application, Bounds, Context, FocusHandle, FontWeight, KeyBinding, KeyDownEvent, Pixels, + Size, Window, WindowBounds, WindowOptions, actions, div, prelude::*, px, relative, rgb, size, +}; +use lumbridge_core::UsageProvenance; +use lumbridge_runtime::{ + CommandConfig, PtyOptions, RuntimeActorError, RuntimeActorOptions, RuntimeCommand, + RuntimeEvent, RuntimeRegistry, RuntimeRegistryError, TerminalSize, +}; +use lumbridge_storage::Store; +use lumbridge_terminal::{ + KeyModifiers, TerminalCellStyle, TerminalColor, TerminalCursorShape, TerminalDimensions, + TerminalEngine, TerminalEngineOptions, TerminalKey, TerminalKeyEvent, TerminalNamedColor, + TerminalScroll, TerminalSnapshot, +}; +use lumbridge_ui_fixture::{ + ActionOutcome, OutputSource, PaneId as FixturePaneId, PaneStatus, ShellAction, ShellModel, + SurfaceKind, +}; + +use panel_registry::{PanelId, PanelKind, PanelRegistry, SeedPane}; +use usage_feed::{UsageFeed, UsageSegment}; + +// A colour is read as six hex digits, so `0x8b_c8ff` would be harder to check +// against a design token than `0x8bc8ff`, not easier. Scoped to the palette and +// the two terminal colour tables; every other literal keeps the lint. +#[allow( + clippy::unreadable_literal, + reason = "six-digit colour hex reads whole" +)] +const BG: u32 = 0x090c12; +#[allow( + clippy::unreadable_literal, + reason = "six-digit colour hex reads whole" +)] +const PANEL: u32 = 0x101620; +#[allow( + clippy::unreadable_literal, + reason = "six-digit colour hex reads whole" +)] +const PANEL_ALT: u32 = 0x151d29; +#[allow( + clippy::unreadable_literal, + reason = "six-digit colour hex reads whole" +)] +const PANEL_ACTIVE: u32 = 0x182334; +#[allow( + clippy::unreadable_literal, + reason = "six-digit colour hex reads whole" +)] +const BORDER: u32 = 0x263246; +#[allow( + clippy::unreadable_literal, + reason = "six-digit colour hex reads whole" +)] +const BORDER_QUIET: u32 = 0x1c2636; +#[allow( + clippy::unreadable_literal, + reason = "six-digit colour hex reads whole" +)] +const TEXT: u32 = 0xdbe5f4; +#[allow( + clippy::unreadable_literal, + reason = "six-digit colour hex reads whole" +)] +const MUTED: u32 = 0x8290a8; +#[allow( + clippy::unreadable_literal, + reason = "six-digit colour hex reads whole" +)] +const ACCENT: u32 = 0x68b5f8; +#[allow( + clippy::unreadable_literal, + reason = "six-digit colour hex reads whole" +)] +const ATTENTION: u32 = 0xf1b96a; +#[allow( + clippy::unreadable_literal, + reason = "six-digit colour hex reads whole" +)] +const SUCCESS: u32 = 0x70d6a8; +const TIMING_SAMPLE_LIMIT: usize = 256; +const RUNTIME_POLL_INTERVAL: Duration = Duration::from_millis(16); +const RUNTIME_DRAIN_LIMIT: usize = 64; +const WORKSPACE_SNAPSHOT_ID: &str = "lumbridge-code-gpui-spike"; +const SIDEBAR_WIDTH: f32 = 248.0; +const APP_HEADER_HEIGHT: f32 = 48.0; +const TAB_BAR_HEIGHT: f32 = 38.0; +const APP_FOOTER_HEIGHT: f32 = 46.0; +const TERMINAL_CONTENT_VERTICAL_INSET: f32 = 24.0; +const TERMINAL_HORIZONTAL_INSET: f32 = 32.0; +const TERMINAL_CELL_WIDTH: f32 = 8.4; +const TERMINAL_CELL_HEIGHT: f32 = 18.0; +const WORK_PANEL_GAP: f32 = 4.0; +const TERMINAL_ROW_STEP: u16 = 2; +const TERMINAL_COLUMN_STEP: u16 = 10; + +actions!( + lumbridge, + [ + FocusLeft, + FocusRight, + FocusUp, + FocusDown, + OpenPalette, + ClosePalette, + SelectPane1, + SelectPane2, + SelectPane3, + SelectPane4, + SelectPane5, + SelectPane6, + AddPanel, + DetachSelectedPanel, + TerminalTaller, + TerminalShorter, + TerminalWider, + TerminalNarrower, + ] +); + +struct LumbridgeShell { + model: ShellModel, + panels: PanelRegistry, + timing: RenderTiming, + runtimes: RuntimeRegistry, + live_terminals: BTreeMap, + store: Option, + persistence_status: String, + usage: UsageFeed, + /// Which surface tab each panel is showing. A panel is absent until the + /// user picks something other than the surface it provides natively. + surfaces: BTreeMap, + /// Which decision-shelf choice each panel has selected. Selecting one is + /// inert by design: it prepares nothing and runs nothing. + shelf_choice: BTreeMap, + add_panel_chooser_open: bool, + root_focus: FocusHandle, +} + +/// The surfaces a pane can be viewed through. +/// +/// A pane is the durable unit of work and its surface is a view over that work. +/// Switching one never launches a process, moves the pane, or changes which +/// agent owns the session — it only changes what is drawn. +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +enum SurfaceTab { + Terminal, + Browser, + Tools, + Context, + Goal, + Review, +} + +impl SurfaceTab { + const ALL: [Self; 6] = [ + Self::Terminal, + Self::Browser, + Self::Tools, + Self::Context, + Self::Goal, + Self::Review, + ]; + + const fn label(self) -> &'static str { + match self { + Self::Terminal => "TERMINAL", + Self::Browser => "BROWSER", + Self::Tools => "TOOLS", + Self::Context => "CONTEXT", + Self::Goal => "GOAL", + Self::Review => "REVIEW", + } + } + + const fn ordinal(self) -> u64 { + match self { + Self::Terminal => 0, + Self::Browser => 1, + Self::Tools => 2, + Self::Context => 3, + Self::Goal => 4, + Self::Review => 5, + } + } + + /// The one surface a pane of this kind actually provides. + const fn native_for(kind: SurfaceKind) -> Self { + match kind { + SurfaceKind::Terminal => Self::Terminal, + SurfaceKind::Browser => Self::Browser, + SurfaceKind::Markdown => Self::Context, + SurfaceKind::Review => Self::Review, + } + } + + /// Why this pane cannot show this surface. Stated plainly, because the + /// product boundary says an unsupported surface is shown as unavailable + /// rather than simulated. + const fn unavailable_reason(self) -> &'static str { + match self { + Self::Terminal => "Only a terminal pane owns a live shell.", + Self::Browser => "No isolated web engine is wired yet.", + Self::Tools => "Tool calls arrive with the ACP client.", + Self::Context => "Context projection is not built yet.", + Self::Goal => "Goal tracking is not built yet.", + Self::Review => "Review is not wired to Git yet.", + } + } +} + +#[derive(Clone)] +struct PanelView { + id: PanelId, + kind: SurfaceKind, + title: String, + badge: String, + target: String, + status: PaneStatus, + lines: Vec, + output_source: OutputSource, +} + +impl PanelView { + const fn needs_input(&self) -> bool { + matches!(self.status, PaneStatus::NeedsInput) + } +} + +struct LiveTerminalState { + status: LiveRuntimeStatus, + terminal: TerminalEngine, + snapshot: TerminalSnapshot, + last_runtime_sequence: u64, +} + +impl LiveTerminalState { + fn new(dimensions: TerminalDimensions) -> Self { + let terminal = TerminalEngine::new(TerminalEngineOptions { + dimensions, + ..TerminalEngineOptions::default() + }); + let snapshot = terminal.snapshot(); + Self { + status: LiveRuntimeStatus::Starting, + terminal, + snapshot, + last_runtime_sequence: 0, + } + } +} + +#[derive(Clone, Debug, Eq, PartialEq)] +enum LiveRuntimeStatus { + Starting, + Running { + session_id: u64, + process_id: Option, + }, + Exited(String), + Fault(String), +} + +impl LiveRuntimeStatus { + fn badge(&self) -> &'static str { + match self { + Self::Starting => "PTY STARTING", + Self::Running { .. } => "LIVE PTY", + Self::Exited(_) => "PTY EXITED", + Self::Fault(_) => "PTY FAULT", + } + } + + fn detail(&self) -> String { + match self { + Self::Starting => "local · runtime actor starting".to_owned(), + Self::Running { + session_id, + process_id, + } => match process_id { + Some(process_id) => { + format!("local · runtime session {session_id} · pid {process_id}") + } + None => format!("local · runtime session {session_id}"), + }, + Self::Exited(status) => format!("local · {status}"), + Self::Fault(message) => format!("local · {message}"), + } + } + + const fn is_terminal(&self) -> bool { + matches!(self, Self::Exited(_) | Self::Fault(_)) + } +} + +#[derive(Default)] +struct RenderTiming { + pending_dispatch: Option, + dispatch_to_element_micros: VecDeque, +} + +#[derive(Clone, Eq, PartialEq)] +struct TerminalPaintRun { + text: String, + columns: u16, + foreground: u32, + background: u32, + style: TerminalCellStyle, + cursor: Option, + hyperlink: bool, +} + +impl TerminalPaintRun { + fn can_merge(&self, other: &Self) -> bool { + self.foreground == other.foreground + && self.background == other.background + && self.style == other.style + && self.cursor == other.cursor + && self.hyperlink == other.hyperlink + } +} + +fn terminal_paint_rows(snapshot: &TerminalSnapshot) -> Vec> { + (0..snapshot.dimensions.rows()) + .map(|row| { + let mut runs: Vec = Vec::new(); + for column in 0..snapshot.dimensions.columns() { + let Some(cell) = snapshot.cell(row, column) else { + continue; + }; + if cell.wide_spacer { + continue; + } + + let mut foreground = terminal_color(cell.foreground); + let mut background = terminal_color(cell.background); + if cell.style.contains(TerminalCellStyle::INVERSE) { + std::mem::swap(&mut foreground, &mut background); + } + if cell.style.contains(TerminalCellStyle::DIM) { + foreground = dim_color(foreground); + } + if cell.style.contains(TerminalCellStyle::HIDDEN) { + foreground = background; + } + + let cursor = (snapshot.cursor.row == row + && snapshot.cursor.column == column + && snapshot.cursor.shape != TerminalCursorShape::Hidden) + .then_some(snapshot.cursor.shape); + let text = if cell.text.is_empty() { + " ".to_owned() + } else { + cell.text.clone() + }; + let next = TerminalPaintRun { + text, + columns: if cell.wide { 2 } else { 1 }, + foreground, + background, + style: cell.style, + cursor, + hyperlink: cell.hyperlink.is_some(), + }; + + if let Some(current) = runs.last_mut() + && current.can_merge(&next) + { + current.text.push_str(&next.text); + current.columns = current.columns.saturating_add(next.columns); + continue; + } + runs.push(next); + } + runs + }) + .collect() +} + +#[allow( + clippy::unreadable_literal, + reason = "six-digit colour hex reads whole" +)] +/// Widens a small count for layout arithmetic. +/// +/// `f32` represents every integer below 2^24 exactly, and the values passed +/// here are panel and column counts. Saturating there rather than at `usize::MAX` +/// keeps the conversion exact for every value this can actually receive. +fn lossless_f32(value: usize) -> f32 { + const EXACT_LIMIT: usize = 1 << 24; + #[allow( + clippy::cast_precision_loss, + reason = "clamped below 2^24, where f32 is exact" + )] + { + value.min(EXACT_LIMIT) as f32 + } +} + +/// Narrows an already-clamped dimension. +/// +/// Every caller clamps into `2.0..=u16::MAX` first, so this is a narrowing of a +/// value known to fit — but `as` would silently produce garbage if a caller ever +/// stopped clamping, and a NaN would become zero. This saturates instead, which +/// is why the `with_cell_size` expect below is honest rather than hopeful. +fn clamp_to_u16(value: f32) -> u16 { + if value.is_nan() { + return 1; + } + #[allow( + clippy::cast_possible_truncation, + clippy::cast_sign_loss, + reason = "clamped into u16 range on the line above" + )] + { + value.clamp(0.0, f32::from(u16::MAX)) as u16 + } +} + +#[allow( + clippy::unreadable_literal, + reason = "six-digit colour hex reads whole" +)] +fn terminal_color(color: TerminalColor) -> u32 { + match color { + TerminalColor::Rgb { red, green, blue } => { + (u32::from(red) << 16) | (u32::from(green) << 8) | u32::from(blue) + } + TerminalColor::Indexed(index) => indexed_terminal_color(index), + TerminalColor::Named(named) => match named { + TerminalNamedColor::Black => 0x1d2430, + TerminalNamedColor::Red => 0xff6b6b, + TerminalNamedColor::Green => 0x70d6a8, + TerminalNamedColor::Yellow => 0xf1c76a, + TerminalNamedColor::Blue => 0x68b5f8, + TerminalNamedColor::Magenta => 0xc79bf2, + TerminalNamedColor::Cyan => 0x63d5da, + TerminalNamedColor::White => 0xdbe5f4, + TerminalNamedColor::BrightBlack => 0x6d7a91, + TerminalNamedColor::BrightRed => 0xff8b8b, + TerminalNamedColor::BrightGreen => 0x93e6be, + TerminalNamedColor::BrightYellow => 0xf8d98c, + TerminalNamedColor::BrightBlue => 0x8bc8ff, + TerminalNamedColor::BrightMagenta => 0xd9b4fb, + TerminalNamedColor::BrightCyan => 0x86e7eb, + TerminalNamedColor::BrightWhite + | TerminalNamedColor::BrightForeground + | TerminalNamedColor::Cursor => 0xf4f8ff, + TerminalNamedColor::Foreground => TEXT, + TerminalNamedColor::Background => BG, + TerminalNamedColor::DimBlack => 0x121820, + TerminalNamedColor::DimRed => 0x9f4a4a, + TerminalNamedColor::DimGreen => 0x4e9878, + TerminalNamedColor::DimYellow => 0xa88a49, + TerminalNamedColor::DimBlue => 0x477fac, + TerminalNamedColor::DimMagenta => 0x896ca4, + TerminalNamedColor::DimCyan => 0x459397, + TerminalNamedColor::DimWhite | TerminalNamedColor::DimForeground => MUTED, + }, + } +} + +#[allow( + clippy::unreadable_literal, + reason = "six-digit colour hex reads whole" +)] +fn indexed_terminal_color(index: u8) -> u32 { + const ANSI: [u32; 16] = [ + 0x1d2430, 0xff6b6b, 0x70d6a8, 0xf1c76a, 0x68b5f8, 0xc79bf2, 0x63d5da, 0xdbe5f4, 0x6d7a91, + 0xff8b8b, 0x93e6be, 0xf8d98c, 0x8bc8ff, 0xd9b4fb, 0x86e7eb, 0xf4f8ff, + ]; + match index { + 0..=15 => ANSI[usize::from(index)], + 16..=231 => { + const LEVELS: [u32; 6] = [0, 95, 135, 175, 215, 255]; + let offset = u32::from(index - 16); + let red = LEVELS[(offset / 36) as usize]; + let green = LEVELS[((offset % 36) / 6) as usize]; + let blue = LEVELS[(offset % 6) as usize]; + (red << 16) | (green << 8) | blue + } + 232..=255 => { + let level = 8 + 10 * u32::from(index - 232); + (level << 16) | (level << 8) | level + } + } +} + +fn dim_color(color: u32) -> u32 { + let dim = |channel: u32| channel * 13 / 20; + (dim((color >> 16) & 0xff) << 16) | (dim((color >> 8) & 0xff) << 8) | dim(color & 0xff) +} + +fn terminal_dimensions_for_window( + window_size: Size, + attached_panel_count: usize, +) -> TerminalDimensions { + let width = f32::from(window_size.width); + let height = f32::from(window_size.height); + let panel_count = visible_panel_count(window_size) + .min(attached_panel_count) + .max(1); + let workspace_height = + (height - APP_HEADER_HEIGHT - TAB_BAR_HEIGHT - APP_FOOTER_HEIGHT).max(0.0); + let terminal_height = (workspace_height * 0.60 - TERMINAL_CONTENT_VERTICAL_INSET).max(0.0); + let workspace_width = (width - SIDEBAR_WIDTH).max(0.0); + // A panel count is single digits; the precision lint is about 2^24 and up. + let panel_gaps = WORK_PANEL_GAP * lossless_f32(panel_count.saturating_sub(1)); + let panel_width = + ((workspace_width - panel_gaps).max(0.0) / lossless_f32(panel_count)).max(0.0); + let terminal_width = (panel_width - TERMINAL_HORIZONTAL_INSET).max(0.0); + let rows = (terminal_height / TERMINAL_CELL_HEIGHT) + .floor() + .clamp(2.0, f32::from(u16::MAX)); + let columns = (terminal_width / TERMINAL_CELL_WIDTH) + .floor() + .clamp(20.0, f32::from(u16::MAX)); + TerminalDimensions::with_cell_size( + clamp_to_u16(rows), + clamp_to_u16(columns), + clamp_to_u16(TERMINAL_CELL_WIDTH.round()), + clamp_to_u16(TERMINAL_CELL_HEIGHT.round()), + ) + .expect("geometry clamps terminal dimensions above zero") +} + +fn visible_panel_count(window_size: Size) -> usize { + let workspace_width = (f32::from(window_size.width) - SIDEBAR_WIDTH).max(0.0); + if workspace_width >= 2_800.0 { + 5 + } else if workspace_width >= 1_100.0 { + 3 + } else { + 1 + } +} + +fn visible_panel_range( + total: usize, + selected: usize, + panel_count: usize, +) -> std::ops::Range { + let count = panel_count.clamp(1, total.max(1)).min(total); + let start = selected + .saturating_sub(count / 2) + .min(total.saturating_sub(count)); + start..start + count +} + +impl RenderTiming { + fn mark_dispatch(&mut self) { + self.pending_dispatch = Some(Instant::now()); + } + + fn observe_element_build(&mut self) { + let Some(started) = self.pending_dispatch.take() else { + return; + }; + if self.dispatch_to_element_micros.len() == TIMING_SAMPLE_LIMIT { + self.dispatch_to_element_micros.pop_front(); + } + self.dispatch_to_element_micros + .push_back(started.elapsed().as_micros()); + } + + fn summary(&self) -> String { + if self.dispatch_to_element_micros.is_empty() { + return "dispatch→element collecting…".to_owned(); + } + let mut samples = self + .dispatch_to_element_micros + .iter() + .copied() + .collect::>(); + samples.sort_unstable(); + let percentile = |percent: usize| { + let index = ((samples.len() - 1) * percent) / 100; + samples[index] + }; + format!( + "dispatch→element p50 {}µs · p95 {}µs · n{}", + percentile(50), + percentile(95), + samples.len() + ) + } +} + +fn workspace_database_path() -> Option { + if let Some(path) = std::env::var_os("LUMBRIDGE_SPIKE_DB") { + return Some(PathBuf::from(path)); + } + if let Some(root) = std::env::var_os("XDG_DATA_HOME") { + return Some(PathBuf::from(root).join("lumbridge/lumbridge.db")); + } + std::env::var_os("HOME") + .map(PathBuf::from) + .map(|home| home.join(".local/share/lumbridge/lumbridge.db")) +} + +fn load_panel_registry() -> (Option, PanelRegistry, String) { + let Some(path) = workspace_database_path() else { + return ( + None, + PanelRegistry::first_run(), + "layout memory-only · no data directory".to_owned(), + ); + }; + if let Some(parent) = path.parent() + && let Err(error) = std::fs::create_dir_all(parent) + { + return ( + None, + PanelRegistry::first_run(), + format!("layout memory-only · {error}"), + ); + } + let store = match Store::open(&path) { + Ok(store) => store, + Err(error) => { + return ( + None, + PanelRegistry::first_run(), + format!("layout memory-only · {error}"), + ); + } + }; + match store.workspace_snapshot(WORKSPACE_SNAPSHOT_ID) { + Ok(Some(json)) => match PanelRegistry::from_json(&json) { + Ok(panels) => (Some(store), panels, "layout restored · SQLite".to_owned()), + Err(error) => ( + Some(store), + PanelRegistry::first_run(), + format!("invalid layout ignored · {error}"), + ), + }, + Ok(None) => ( + Some(store), + PanelRegistry::first_run(), + "layout ready · SQLite".to_owned(), + ), + Err(error) => ( + Some(store), + PanelRegistry::first_run(), + format!("layout read failed · {error}"), + ), + } +} + +impl LumbridgeShell { + fn new(window: &mut Window, cx: &mut Context) -> Self { + let root_focus = cx.focus_handle(); + window.focus(&root_focus); + + cx.spawn(async move |this, cx| { + loop { + cx.background_executor() + .timer(Duration::from_millis(650)) + .await; + if this + .update(cx, |shell, cx| { + shell.dispatch(ShellAction::SyntheticStreamTick); + shell.usage.advance(); + shell.usage.tick(); + cx.notify(); + }) + .is_err() + { + break; + } + } + }) + .detach(); + + cx.spawn(async move |this, cx| { + loop { + cx.background_executor().timer(RUNTIME_POLL_INTERVAL).await; + if this + .update(cx, |shell, cx| { + if shell.drain_runtime_events() { + cx.notify(); + } + }) + .is_err() + { + break; + } + } + }) + .detach(); + + let (store, panels, persistence_status) = load_panel_registry(); + let terminal_dimensions = + terminal_dimensions_for_window(window.bounds().size, panels.attached_count()); + let mut runtimes = RuntimeRegistry::new(); + let mut live_terminals = BTreeMap::new(); + for panel in panels + .panels() + .iter() + .filter(|panel| panel.kind == PanelKind::Terminal) + { + let mut terminal = LiveTerminalState::new(terminal_dimensions); + if let Err(error) = + spawn_live_runtime(&mut runtimes, panel.id, panel.seed, terminal_dimensions) + { + terminal.status = LiveRuntimeStatus::Fault(error.to_string()); + } + live_terminals.insert(panel.id, terminal); + } + + cx.observe_window_bounds(window, |shell, window, cx| { + let dimensions = + terminal_dimensions_for_window(window.bounds().size, shell.panels.attached_count()); + shell.resize_attached_terminals(dimensions.rows(), dimensions.columns(), cx); + }) + .detach(); + + Self { + model: ShellModel::with_external_outputs([ + FixturePaneId::CodexRuntime, + FixturePaneId::ClaudeUi, + FixturePaneId::PiDocs, + ]) + .expect("all live comparison panes are terminals"), + panels, + timing: RenderTiming::default(), + runtimes, + live_terminals, + store, + persistence_status, + usage: UsageFeed::start(), + surfaces: BTreeMap::new(), + shelf_choice: BTreeMap::new(), + add_panel_chooser_open: false, + root_focus, + } + } + + fn persist_panels(&mut self) { + let Some(store) = &self.store else { + return; + }; + let result = self + .panels + .to_json() + .map_err(|error| error.clone()) + .and_then(|json| { + store + .save_workspace_snapshot(WORKSPACE_SNAPSHOT_ID, &json) + .map_err(|error| error.to_string()) + }); + self.persistence_status = match result { + Ok(()) => "layout saved · SQLite".to_owned(), + Err(error) => format!("layout save failed · {error}"), + }; + } + + fn dispatch(&mut self, action: ShellAction) -> ActionOutcome { + self.timing.mark_dispatch(); + self.model.dispatch(action) + } + + #[allow( + clippy::too_many_lines, + reason = "one match over the runtime event enum; splitting it hides the exhaustiveness" + )] + fn drain_runtime_events(&mut self) -> bool { + let mut changed = false; + let panes = self.live_terminals.keys().copied().collect::>(); + for pane in panes { + if self + .live_terminals + .get(&pane) + .is_none_or(|terminal| terminal.status.is_terminal()) + { + continue; + } + for _ in 0..RUNTIME_DRAIN_LIMIT { + let event = match self.runtimes.try_recv(&pane) { + Ok(Some(event)) => event, + Ok(None) => break, + Err(RuntimeRegistryError::Actor(RuntimeActorError::Disconnected)) => { + self.live_terminals + .get_mut(&pane) + .expect("live terminal state exists") + .status = + LiveRuntimeStatus::Fault("runtime actor disconnected".to_owned()); + changed = true; + break; + } + Err(error) => { + self.live_terminals + .get_mut(&pane) + .expect("live terminal state exists") + .status = LiveRuntimeStatus::Fault(error.to_string()); + changed = true; + break; + } + }; + + match event { + RuntimeEvent::Started { + session_id, + process_id, + } => { + self.live_terminals + .get_mut(&pane) + .expect("live terminal state exists") + .status = LiveRuntimeStatus::Running { + session_id: session_id.get(), + process_id, + }; + changed = true; + } + RuntimeEvent::Output { + sequence, bytes, .. + } => { + let responses = { + let terminal = self + .live_terminals + .get_mut(&pane) + .expect("live terminal state exists"); + if sequence <= terminal.last_runtime_sequence { + terminal.status = LiveRuntimeStatus::Fault(format!( + "non-monotonic PTY output sequence {sequence}" + )); + changed = true; + break; + } + terminal.last_runtime_sequence = sequence; + terminal.terminal.process(&bytes).outbound + }; + for response in responses { + if let Err(error) = + self.send_runtime_command(pane, RuntimeCommand::Input(response)) + { + self.live_terminals + .get_mut(&pane) + .expect("live terminal state exists") + .status = LiveRuntimeStatus::Fault(error.to_string()); + return true; + } + } + self.publish_terminal_snapshot(pane); + changed = true; + } + RuntimeEvent::InputClosed { .. } => {} + RuntimeEvent::Exited { status, .. } => { + self.live_terminals + .get_mut(&pane) + .expect("live terminal state exists") + .status = LiveRuntimeStatus::Exited(format!( + "PTY exited with code {}", + status.code + )); + changed = true; + break; + } + RuntimeEvent::Fault { + operation, message, .. + } => { + self.live_terminals + .get_mut(&pane) + .expect("live terminal state exists") + .status = LiveRuntimeStatus::Fault(format!("{operation:?}: {message}")); + changed = true; + break; + } + } + } + } + changed + } + + fn send_runtime_command( + &self, + pane: PanelId, + command: RuntimeCommand, + ) -> Result<(), RuntimeRegistryError> { + self.runtimes.try_send(&pane, command) + } + + fn publish_terminal_snapshot(&mut self, pane: PanelId) { + let lines = { + let terminal = self + .live_terminals + .get_mut(&pane) + .expect("live terminal state exists"); + let snapshot = terminal.terminal.snapshot(); + let lines = snapshot.plain_rows(); + terminal.snapshot = snapshot; + lines + }; + let fixture = self + .panels + .panel(pane) + .and_then(|panel| panel.seed) + .map(SeedPane::fixture_id); + if let Some(pane) = fixture { + self.dispatch(ShellAction::ReplaceExternalOutput { pane, lines }); + } + } + + fn resize_terminal(&mut self, pane: PanelId, rows: u16, columns: u16) -> bool { + let dimensions = TerminalDimensions::new(rows, columns) + .expect("resize actions always retain non-zero dimensions"); + let terminal = self + .live_terminals + .get_mut(&pane) + .expect("live terminal state exists"); + if !terminal.terminal.resize(dimensions) { + return false; + } + let pty_size = TerminalSize::new(rows, columns) + .expect("terminal engine dimensions are valid PTY dimensions"); + if let Err(error) = self.send_runtime_command(pane, RuntimeCommand::Resize(pty_size)) { + self.live_terminals + .get_mut(&pane) + .expect("live terminal state exists") + .status = LiveRuntimeStatus::Fault(error.to_string()); + } + self.publish_terminal_snapshot(pane); + true + } + + fn resize_attached_terminals(&mut self, rows: u16, columns: u16, cx: &mut Context) { + let mut changed = false; + let panes = self.live_terminals.keys().copied().collect::>(); + for pane in panes { + if self.panels.panel(pane).is_some_and(|panel| panel.attached) { + changed |= self.resize_terminal(pane, rows, columns); + } + } + if changed { + cx.notify(); + } + } + + fn scroll_terminal(&mut self, pane: PanelId, scroll: TerminalScroll, cx: &mut Context) { + if !self + .live_terminals + .get_mut(&pane) + .expect("live terminal state exists") + .terminal + .scroll_display(scroll) + { + return; + } + self.publish_terminal_snapshot(pane); + cx.notify(); + } + + fn select_pane(&mut self, pane: PanelId, window: &mut Window, cx: &mut Context) { + self.timing.mark_dispatch(); + if self.panels.select(pane) { + self.persist_panels(); + } + window.focus(&self.root_focus); + cx.notify(); + } + + /// Changes which surface a pane is viewed through. + /// + /// This is a view change only. It never touches the PTY, the agent, or the + /// pane's execution target, so a pane keeps running whatever it was running. + fn select_surface( + &mut self, + pane: PanelId, + tab: SurfaceTab, + window: &mut Window, + cx: &mut Context, + ) { + self.timing.mark_dispatch(); + self.surfaces.insert(pane, tab); + if self.panels.select(pane) { + self.persist_panels(); + } + window.focus(&self.root_focus); + cx.notify(); + } + + /// Records which suggestion the user picked. Deliberately does nothing else. + fn select_shelf_choice( + &mut self, + pane: PanelId, + index: usize, + window: &mut Window, + cx: &mut Context, + ) { + self.timing.mark_dispatch(); + if self.shelf_choice.get(&pane) == Some(&index) { + self.shelf_choice.remove(&pane); + } else { + self.shelf_choice.insert(pane, index); + } + if self.panels.select(pane) { + self.persist_panels(); + } + window.focus(&self.root_focus); + cx.notify(); + } + + fn select_pane_at(&mut self, index: usize, window: &mut Window, cx: &mut Context) { + self.timing.mark_dispatch(); + if self.panels.select_attached_at(index) { + self.persist_panels(); + } + window.focus(&self.root_focus); + cx.notify(); + } + + fn resize_terminal_for_workspace(&mut self, window: &Window, cx: &mut Context) { + let dimensions = + terminal_dimensions_for_window(window.bounds().size, self.panels.attached_count()); + self.resize_attached_terminals(dimensions.rows(), dimensions.columns(), cx); + } + + fn attach_panel(&mut self, pane: PanelId, window: &mut Window, cx: &mut Context) { + self.timing.mark_dispatch(); + if self.panels.attach(pane) { + self.persist_panels(); + self.resize_terminal_for_workspace(window, cx); + } + window.focus(&self.root_focus); + cx.notify(); + } + + fn create_panel(&mut self, kind: PanelKind, window: &mut Window, cx: &mut Context) { + self.timing.mark_dispatch(); + let pane = self.panels.create(kind); + if kind == PanelKind::Terminal { + let dimensions = + terminal_dimensions_for_window(window.bounds().size, self.panels.attached_count()); + let mut terminal = LiveTerminalState::new(dimensions); + if let Err(error) = spawn_live_runtime(&mut self.runtimes, pane, None, dimensions) { + terminal.status = LiveRuntimeStatus::Fault(error.to_string()); + } + self.live_terminals.insert(pane, terminal); + } + self.add_panel_chooser_open = false; + self.persist_panels(); + self.resize_terminal_for_workspace(window, cx); + window.focus(&self.root_focus); + cx.notify(); + } + + fn detach_panel(&mut self, pane: PanelId, window: &mut Window, cx: &mut Context) { + self.timing.mark_dispatch(); + if self.panels.detach(pane) { + self.persist_panels(); + self.resize_terminal_for_workspace(window, cx); + } + window.focus(&self.root_focus); + cx.notify(); + } + + fn add_panel_action(&mut self, _: &AddPanel, window: &mut Window, cx: &mut Context) { + self.dispatch(ShellAction::CloseCommandPalette); + self.add_panel_chooser_open = !self.add_panel_chooser_open; + window.focus(&self.root_focus); + cx.notify(); + } + + fn detach_selected_panel( + &mut self, + _: &DetachSelectedPanel, + window: &mut Window, + cx: &mut Context, + ) { + self.detach_panel(self.panels.selected(), window, cx); + } + + fn move_focus(&mut self, delta: isize, window: &mut Window, cx: &mut Context) { + self.timing.mark_dispatch(); + if self.panels.move_horizontal(delta) { + self.persist_panels(); + } + window.focus(&self.root_focus); + cx.notify(); + } + + fn focus_left(&mut self, _: &FocusLeft, window: &mut Window, cx: &mut Context) { + self.move_focus(-1, window, cx); + } + + fn focus_right(&mut self, _: &FocusRight, window: &mut Window, cx: &mut Context) { + self.move_focus(1, window, cx); + } + + fn focus_up(&mut self, _: &FocusUp, window: &mut Window, cx: &mut Context) { + self.move_focus(-1, window, cx); + } + + fn focus_down(&mut self, _: &FocusDown, window: &mut Window, cx: &mut Context) { + self.move_focus(1, window, cx); + } + + fn open_palette(&mut self, _: &OpenPalette, _: &mut Window, cx: &mut Context) { + self.add_panel_chooser_open = false; + self.dispatch(ShellAction::OpenCommandPalette); + cx.notify(); + } + + fn close_palette(&mut self, _: &ClosePalette, _: &mut Window, cx: &mut Context) { + self.dispatch(ShellAction::CloseCommandPalette); + cx.notify(); + } + + fn selected_terminal_dimensions(&self) -> Option<(PanelId, TerminalDimensions)> { + let pane = self.panels.selected(); + self.live_terminals + .get(&pane) + .map(|terminal| (pane, terminal.terminal.dimensions())) + } + + fn terminal_taller(&mut self, _: &TerminalTaller, _: &mut Window, cx: &mut Context) { + let Some((pane, dimensions)) = self.selected_terminal_dimensions() else { + return; + }; + if self.resize_terminal( + pane, + dimensions.rows().saturating_add(TERMINAL_ROW_STEP), + dimensions.columns(), + ) { + cx.notify(); + } + } + + fn terminal_shorter(&mut self, _: &TerminalShorter, _: &mut Window, cx: &mut Context) { + let Some((pane, dimensions)) = self.selected_terminal_dimensions() else { + return; + }; + if self.resize_terminal( + pane, + dimensions.rows().saturating_sub(TERMINAL_ROW_STEP).max(2), + dimensions.columns(), + ) { + cx.notify(); + } + } + + fn terminal_wider(&mut self, _: &TerminalWider, _: &mut Window, cx: &mut Context) { + let Some((pane, dimensions)) = self.selected_terminal_dimensions() else { + return; + }; + if self.resize_terminal( + pane, + dimensions.rows(), + dimensions.columns().saturating_add(TERMINAL_COLUMN_STEP), + ) { + cx.notify(); + } + } + + fn terminal_narrower(&mut self, _: &TerminalNarrower, _: &mut Window, cx: &mut Context) { + let Some((pane, dimensions)) = self.selected_terminal_dimensions() else { + return; + }; + if self.resize_terminal( + pane, + dimensions.rows(), + dimensions + .columns() + .saturating_sub(TERMINAL_COLUMN_STEP) + .max(20), + ) { + cx.notify(); + } + } + + fn on_key_down(&mut self, event: &KeyDownEvent, window: &mut Window, cx: &mut Context) { + if self.add_panel_chooser_open { + match event.keystroke.key.as_str() { + "escape" => { + self.add_panel_chooser_open = false; + cx.notify(); + } + "1" => self.create_panel(PanelKind::Terminal, window, cx), + "2" => self.create_panel(PanelKind::Browser, window, cx), + "3" => self.create_panel(PanelKind::Markdown, window, cx), + "4" => self.create_panel(PanelKind::Review, window, cx), + _ => {} + } + return; + } + if !self.model.command_palette().is_open() { + let pane = self.panels.selected(); + if self + .live_terminals + .get(&pane) + .is_none_or(|terminal| terminal.status.is_terminal()) + { + return; + } + let modifiers = key_modifiers(event); + if let Some(scroll) = + terminal_scroll_from_parts(event.keystroke.key.as_str(), modifiers) + { + self.scroll_terminal(pane, scroll, cx); + return; + } + let Some(event) = terminal_key_from_parts( + event.keystroke.key.as_str(), + event.keystroke.key_char.as_deref(), + modifiers, + ) else { + return; + }; + let bytes = self + .live_terminals + .get(&pane) + .expect("selected live terminal exists") + .terminal + .encode_key(&event); + if bytes.is_empty() { + return; + } + if let Err(error) = self.send_runtime_command(pane, RuntimeCommand::Input(bytes)) { + self.live_terminals + .get_mut(&pane) + .expect("selected live terminal exists") + .status = LiveRuntimeStatus::Fault(error.to_string()); + } + let moved_to_bottom = { + let terminal = self + .live_terminals + .get_mut(&pane) + .expect("selected live terminal exists"); + terminal.terminal.display_offset() > 0 + && terminal.terminal.scroll_display(TerminalScroll::Bottom) + }; + if moved_to_bottom { + self.publish_terminal_snapshot(pane); + } + cx.notify(); + return; + } + + let mut query = self.model.command_palette().query().to_owned(); + match event.keystroke.key.as_str() { + "backspace" => { + query.pop(); + } + // Enter and Escape both dismiss: there is nothing to commit yet. + // When the palette runs a command they diverge again. + "enter" | "escape" => { + self.dispatch(ShellAction::CloseCommandPalette); + cx.notify(); + return; + } + _ => { + if let Some(character) = event.keystroke.key_char.as_deref() + && !event.keystroke.modifiers.control + && !event.keystroke.modifiers.platform + { + query.push_str(character); + } else { + return; + } + } + } + self.dispatch(ShellAction::SetCommandPaletteQuery(query)); + cx.notify(); + } + + fn terminal_run(run: TerminalPaintRun) -> gpui::AnyElement { + let cursor = run.cursor; + div() + .flex_none() + .h(px(TERMINAL_CELL_HEIGHT)) + .w(px(f32::from(run.columns) * TERMINAL_CELL_WIDTH)) + .overflow_hidden() + .whitespace_nowrap() + .text_color(rgb(run.foreground)) + .bg(rgb(run.background)) + .when(run.style.contains(TerminalCellStyle::BOLD), |view| { + view.font_weight(FontWeight::BOLD) + }) + .when(run.style.contains(TerminalCellStyle::ITALIC), |view| { + view.italic() + }) + .when( + run.style.contains(TerminalCellStyle::UNDERLINE) + || run.style.contains(TerminalCellStyle::DOUBLE_UNDERLINE) + || run.style.contains(TerminalCellStyle::UNDERCURL) + || run.style.contains(TerminalCellStyle::DOTTED_UNDERLINE) + || run.style.contains(TerminalCellStyle::DASHED_UNDERLINE) + || run.hyperlink, + gpui::Styled::underline, + ) + .when(run.style.contains(TerminalCellStyle::STRIKEOUT), |view| { + view.line_through() + }) + .when(cursor == Some(TerminalCursorShape::Block), |view| { + view.bg(rgb(TEXT)).text_color(rgb(BG)) + }) + .when(cursor == Some(TerminalCursorShape::HollowBlock), |view| { + view.border_1().border_color(rgb(TEXT)) + }) + .when(cursor == Some(TerminalCursorShape::Underline), |view| { + view.border_b_2().border_color(rgb(TEXT)) + }) + .when(cursor == Some(TerminalCursorShape::Beam), |view| { + view.border_l_2().border_color(rgb(TEXT)) + }) + .child(run.text) + .into_any_element() + } + + fn panel_view(&self, id: PanelId) -> PanelView { + let panel = self.panels.panel(id).expect("workspace panel exists"); + if let Some(seed) = panel.seed { + let fixture = self.model.pane(seed.fixture_id()); + return PanelView { + id, + kind: fixture.kind(), + title: panel.title.clone(), + badge: fixture.fixture().badge.to_owned(), + target: panel.target.clone(), + status: fixture.status(), + lines: fixture.lines().to_vec(), + output_source: fixture.output_source(), + }; + } + let (kind, badge, lines) = match panel.kind { + PanelKind::Terminal => (SurfaceKind::Terminal, "TERMINAL", Vec::new()), + PanelKind::Browser => ( + SurfaceKind::Browser, + "BROWSER", + vec![ + "about:blank".to_owned(), + "No web engine is embedded in this build.".to_owned(), + "Choose a URL or open externally ↗".to_owned(), + ], + ), + PanelKind::Markdown => ( + SurfaceKind::Markdown, + "MARKDOWN", + vec![ + "# Untitled note".to_owned(), + String::new(), + "Local-first workspace document.".to_owned(), + ], + ), + PanelKind::Review => ( + SurfaceKind::Review, + "REVIEW", + vec![ + "No working tree is loaded.".to_owned(), + "No approval has been requested.".to_owned(), + "0 files selected".to_owned(), + ], + ), + }; + PanelView { + id, + kind, + title: panel.title.clone(), + badge: badge.to_owned(), + target: panel.target.clone(), + status: PaneStatus::Ready, + lines, + output_source: if panel.kind == PanelKind::Terminal { + OutputSource::External + } else { + OutputSource::Deterministic + }, + } + } + + fn terminal_view(&self, pane: PanelId) -> gpui::AnyElement { + let terminal = self + .live_terminals + .get(&pane) + .expect("external terminal pane has live state"); + let rows = terminal_paint_rows(&terminal.snapshot) + .into_iter() + .map(|runs| { + div() + .flex() + .h(px(TERMINAL_CELL_HEIGHT)) + .flex_none() + .children(runs.into_iter().map(Self::terminal_run)) + }) + .collect::>(); + div() + .flex() + .flex_col() + .size_full() + .overflow_hidden() + .bg(rgb(BG)) + .font_family("monospace") + .text_size(px(13.0)) + .children(rows) + .into_any_element() + } + + #[allow( + clippy::too_many_lines, + reason = "a single declarative element tree, not a sequence of steps" + )] + fn pane_context( + &self, + pane: &PanelView, + selected: bool, + cx: &mut Context, + ) -> gpui::AnyElement { + let pane_id = pane.id; + let can_detach = self.panels.attached_count() > 1; + let external = pane.output_source == OutputSource::External; + let live_terminal = external.then(|| { + self.live_terminals + .get(&pane_id) + .expect("external terminal pane has live state") + }); + let status = live_terminal.map_or(pane.badge.as_str(), |terminal| terminal.status.badge()); + let detail = + live_terminal.map_or_else(|| pane.target.clone(), |terminal| terminal.status.detail()); + let surface_status = live_terminal.map_or_else( + || status.to_owned(), + |terminal| { + let dimensions = terminal.terminal.dimensions(); + if terminal.snapshot.display_offset > 0 { + format!( + "{} · ↑{} · {}×{}", + status, + terminal.snapshot.display_offset, + dimensions.columns(), + dimensions.rows() + ) + } else { + format!( + "{} · {}×{}", + status, + dimensions.columns(), + dimensions.rows() + ) + } + }, + ); + let native = SurfaceTab::native_for(pane.kind); + let shown = self.surface_for(pane.id, pane.kind); + let tabs = SurfaceTab::ALL + .into_iter() + .map(|tab| { + let active = tab == shown; + let provided = tab == native; + div() + .id(("surface-tab", pane_id.get() * 16 + tab.ordinal())) + .cursor_pointer() + .h_full() + .flex() + .items_center() + .px_3() + .text_xs() + // Provided but unselected reads as available; unprovided + // stays dim, so the tab strip shows what this pane can do + // before you click rather than after. + .text_color(rgb(if active { + ACCENT + } else if provided { + TEXT + } else { + MUTED + })) + .when(active, |view| view.border_b_2().border_color(rgb(ACCENT))) + .hover(|view| view.bg(rgb(PANEL_ACTIVE)).text_color(rgb(TEXT))) + .child(tab.label()) + .on_click(cx.listener(move |shell, _, window, cx| { + cx.stop_propagation(); + shell.select_surface(pane_id, tab, window, cx); + })) + }) + .collect::>(); + + div() + .flex() + .flex_col() + .size_full() + .min_h_0() + .overflow_hidden() + .px_3() + .py_2() + .bg(rgb(if selected { PANEL_ACTIVE } else { PANEL_ALT })) + .border_b_1() + .border_color(rgb(BORDER)) + .child( + div() + .flex() + .items_center() + .justify_between() + .gap_2() + .child( + div() + .min_w_0() + .child( + div() + .truncate() + .text_sm() + .text_color(rgb(TEXT)) + .child(pane.title.clone()), + ) + .child( + div() + .mt_1() + .truncate() + .text_xs() + .text_color(rgb(MUTED)) + .child(detail), + ), + ) + .child( + div() + .flex() + .flex_col() + .items_end() + .flex_none() + .gap_1() + .child( + div() + .text_xs() + .text_color(rgb(if pane.needs_input() { + ATTENTION + } else if selected { + SUCCESS + } else { + MUTED + })) + .child(surface_status), + ) + .child( + div() + .id(("detach-panel", pane_id.get())) + .cursor_pointer() + .px_2() + .py_1() + .rounded(px(4.0)) + .border_1() + .border_color(rgb(BORDER)) + .text_xs() + .text_color(rgb(if can_detach { MUTED } else { BORDER })) + .when(can_detach, |view| { + view.hover(|view| { + view.border_color(rgb(ATTENTION)) + .text_color(rgb(ATTENTION)) + }) + }) + .child(if can_detach { + "− DETACH" + } else { + "LAST PANEL" + }) + .on_click(cx.listener(move |shell, _, window, cx| { + cx.stop_propagation(); + shell.detach_panel(pane_id, window, cx); + })), + ), + ), + ) + .child( + div() + .flex() + .h(px(28.0)) + .flex_none() + .mt_2() + .overflow_hidden() + .border_t_1() + .border_color(rgb(BORDER_QUIET)) + .children(tabs), + ) + .child( + div() + .flex() + .items_center() + .justify_between() + .mt_2() + .text_xs() + .text_color(rgb(MUTED)) + .child("TOOLS · CONTEXT · GOAL") + .child(if pane.needs_input() { + "NEEDS INPUT" + } else if selected { + "KEYBOARD OWNER" + } else { + "RUNNING" + }), + ) + .into_any_element() + } + + /// The surface a panel is currently being viewed through. + fn surface_for(&self, id: PanelId, kind: SurfaceKind) -> SurfaceTab { + self.surfaces + .get(&id) + .copied() + .unwrap_or_else(|| SurfaceTab::native_for(kind)) + } + + /// What a pane shows when asked for a surface it does not provide. + /// + /// It says so, and it says what is still running underneath, because the + /// pane's process identity does not change when the view does. + fn unavailable_surface(pane: &PanelView, shown: SurfaceTab) -> gpui::AnyElement { + let native = SurfaceTab::native_for(pane.kind); + div() + .flex() + .flex_col() + .size_full() + .min_w_0() + .min_h_0() + .overflow_hidden() + .bg(rgb(BG)) + .border_y_1() + .border_color(rgb(BORDER)) + .child( + div() + .flex() + .flex_col() + .gap_2() + .p_4() + .child( + div() + .text_sm() + .text_color(rgb(TEXT)) + .child(format!("{} unavailable", shown.label())), + ) + .child( + div() + .text_xs() + .text_color(rgb(MUTED)) + .child(shown.unavailable_reason()), + ) + .child( + div() + .mt_2() + .text_xs() + .text_color(rgb(SUCCESS)) + .child(format!( + "{} is still this pane's live surface. Nothing was stopped.", + native.label() + )), + ), + ) + .into_any_element() + } + + fn pane_work_surface(&self, pane: &PanelView) -> gpui::AnyElement { + let shown = self.surface_for(pane.id, pane.kind); + if shown != SurfaceTab::native_for(pane.kind) { + return Self::unavailable_surface(pane, shown); + } + let external = pane.output_source == OutputSource::External; + let content = if external { + self.terminal_view(pane.id) + } else { + let start = pane.lines.len().saturating_sub(18); + div() + .flex() + .flex_col() + .gap_1() + .size_full() + .overflow_hidden() + .font_family("monospace") + .text_sm() + .text_color(rgb(TEXT)) + .children(pane.lines[start..].iter().cloned()) + .into_any_element() + }; + + div() + .flex() + .flex_col() + .size_full() + .min_w_0() + .min_h_0() + .overflow_hidden() + .bg(rgb(BG)) + .border_y_1() + .border_color(rgb(BORDER)) + .child( + div() + .flex_1() + .min_h_0() + .overflow_hidden() + .p_3() + .child(content), + ) + .into_any_element() + } + + fn pane_decision_region(&self, pane: &PanelView, cx: &mut Context) -> gpui::AnyElement { + let pane_id = pane.id; + let picked = self.shelf_choice.get(&pane_id).copied(); + // Every choice names the capability it would need. None of them holds + // that capability: choosing prepares, the command plane executes. + let choices: [(&'static str, &'static str, &'static str, bool); 3] = if pane.needs_input() { + [ + ("Review request", "inspect scope", "needs Observe", true), + ("Steer…", "edit response", "needs Execute", false), + ("Dismiss", "leave inert", "inert", false), + ] + } else { + [ + ("Continue", "keep moving", "needs Execute", false), + ("Review plan", "inspect commands", "needs Observe", false), + ("Ask…", "refine prompt", "inert", false), + ] + }; + div() + .flex() + .flex_col() + .size_full() + .min_h_0() + .overflow_hidden() + .px_2() + .py_2() + .bg(rgb(PANEL)) + .border_t_1() + .border_color(rgb(BORDER)) + .child( + div() + .flex() + .items_center() + .justify_between() + .text_xs() + .child(div().text_color(rgb(MUTED)).child("DECISION SHELF")) + .child( + div() + .text_color(rgb(if pane.needs_input() { ATTENTION } else { MUTED })) + .child(if pane.needs_input() { + "REVIEW REQUIRED" + } else { + "SUGGESTIONS INERT" + }), + ), + ) + .child(div().flex().flex_col().gap_1().mt_2().children( + choices.into_iter().enumerate().map( + |(index, (label, detail, _capability, attention))| { + let chosen = picked == Some(index); + div() + .id(("shelf-choice", pane_id.get() * 8 + index as u64)) + .cursor_pointer() + .flex() + .items_center() + .justify_between() + .min_w_0() + .px_2() + .py_1() + .rounded(px(4.0)) + .border_1() + .border_color(rgb(if chosen { + ACCENT + } else if attention { + ATTENTION + } else { + BORDER + })) + .bg(rgb(if chosen { PANEL_ACTIVE } else { PANEL_ALT })) + .hover(|view| view.border_color(rgb(ACCENT))) + .text_xs() + .text_color(rgb(TEXT)) + .child(label) + .child(div().truncate().text_color(rgb(MUTED)).child(detail)) + .on_click(cx.listener(move |shell, _, window, cx| { + cx.stop_propagation(); + shell.select_shelf_choice(pane_id, index, window, cx); + })) + }, + ), + )) + .child( + div() + .mt_2() + .text_xs() + .text_color(rgb(if picked.is_some() { ACCENT } else { MUTED })) + .child(picked.map_or_else( + || "Pick one to see what it would need".to_owned(), + |index| { + format!( + "{} · {} · nothing has run", + choices[index].0, choices[index].2 + ) + }, + )), + ) + .into_any_element() + } + + fn workspace_panel( + &self, + pane: &PanelView, + selected: bool, + cx: &mut Context, + ) -> gpui::AnyElement { + let pane_id = pane.id; + div() + .id(("workspace-panel", pane_id.get())) + .cursor_pointer() + .on_click(cx.listener(move |shell, _, window, cx| { + shell.select_pane(pane_id, window, cx); + })) + .flex() + .flex_col() + .size_full() + .min_w_0() + .min_h_0() + .overflow_hidden() + .border_1() + .border_color(rgb(if selected { ACCENT } else { BORDER })) + .child( + div() + .h(relative(0.20)) + .flex_none() + .min_h_0() + .overflow_hidden() + .child(self.pane_context(pane, selected, cx)), + ) + .child( + div() + .h(relative(0.60)) + .flex_none() + .min_h_0() + .overflow_hidden() + .child(self.pane_work_surface(pane)), + ) + .child( + div() + .h(relative(0.20)) + .flex_none() + .min_h_0() + .overflow_hidden() + .child(self.pane_decision_region(pane, cx)), + ) + .into_any_element() + } + + fn command_palette(&self) -> impl IntoElement { + let query = self.model.command_palette().query(); + let prompt = if query.is_empty() { + "Type a command…".to_owned() + } else { + query.to_owned() + }; + + div() + .absolute() + .inset_0() + .flex() + .justify_center() + .items_start() + .pt(px(92.0)) + .bg(gpui::black().opacity(0.72)) + .child( + div() + .w(px(620.0)) + .overflow_hidden() + .bg(rgb(PANEL_ALT)) + .border_1() + .border_color(rgb(ACCENT)) + .rounded(px(8.0)) + .child( + div() + .px_4() + .py_3() + .border_b_1() + .border_color(rgb(BORDER)) + .text_color(rgb(if query.is_empty() { MUTED } else { TEXT })) + .child(prompt), + ) + .child( + div() + .flex() + .flex_col() + .p_2() + .text_sm() + .child( + div() + .px_3() + .py_2() + .rounded(px(5.0)) + .bg(rgb(PANEL_ACTIVE)) + .child("Focus next pane") + .child( + div() + .mt_1() + .text_xs() + .text_color(rgb(MUTED)) + .child("Workspace · navigation"), + ), + ) + .child( + div() + .px_3() + .py_2() + .text_color(rgb(MUTED)) + .child("Add workspace panel") + .child( + div() + .mt_1() + .text_xs() + .child("Alt+Shift+N · choose a surface or reattach"), + ), + ) + .child( + div() + .px_3() + .py_2() + .text_color(rgb(MUTED)) + .child("Detach selected panel") + .child( + div() + .mt_1() + .text_xs() + .child("Alt+Shift+W · session keeps running"), + ), + ) + .child( + div() + .px_3() + .py_2() + .text_color(rgb(MUTED)) + .child("Share selected pane to Buzz…"), + ), + ) + .child( + div() + .flex() + .justify_between() + .px_4() + .py_2() + .border_t_1() + .border_color(rgb(BORDER)) + .text_xs() + .text_color(rgb(MUTED)) + .child("Enter to run") + .child("Esc to close"), + ), + ) + } + + #[allow( + clippy::too_many_lines, + reason = "a single declarative element tree, not a sequence of steps" + )] + fn add_panel_chooser(&self, cx: &mut Context) -> impl IntoElement { + let kinds = PanelKind::ALL + .into_iter() + .enumerate() + .map(|(index, kind)| { + let shortcut = index + 1; + div() + .id(("create-panel-kind", shortcut)) + .cursor_pointer() + .flex() + .items_center() + .gap_3() + .px_3() + .py_3() + .rounded(px(6.0)) + .border_1() + .border_color(rgb(BORDER)) + .bg(rgb(PANEL)) + .child( + div() + .flex() + .items_center() + .justify_center() + .size(px(34.0)) + .flex_none() + .rounded(px(5.0)) + .bg(rgb(PANEL_ACTIVE)) + .text_color(rgb(ACCENT)) + .child(match kind { + PanelKind::Terminal => ">_", + PanelKind::Browser => "◎", + PanelKind::Markdown => "¶", + PanelKind::Review => "±", + }), + ) + .child( + div() + .min_w_0() + .flex_1() + .child(div().text_sm().text_color(rgb(TEXT)).child(kind.label())) + .child( + div() + .mt_1() + .text_xs() + .text_color(rgb(MUTED)) + .child(kind.description()), + ), + ) + .child( + div() + .flex_none() + .text_xs() + .text_color(rgb(MUTED)) + .child(shortcut.to_string()), + ) + .on_click(cx.listener(move |shell, _, window, cx| { + cx.stop_propagation(); + shell.create_panel(kind, window, cx); + })) + }) + .collect::>(); + let detached = self + .panels + .detached_ids() + .into_iter() + .map(|id| { + let panel = self.panels.panel(id).expect("detached panel exists"); + (id, panel.title.clone(), panel.kind.label()) + }) + .collect::>(); + + div() + .absolute() + .inset_0() + .flex() + .justify_center() + .items_start() + .pt(px(72.0)) + .bg(gpui::black().opacity(0.72)) + .child( + div() + .w(px(620.0)) + .max_h(px(760.0)) + .overflow_hidden() + .rounded(px(9.0)) + .border_1() + .border_color(rgb(ACCENT)) + .bg(rgb(PANEL_ALT)) + .child( + div() + .flex() + .items_start() + .justify_between() + .px_4() + .py_3() + .border_b_1() + .border_color(rgb(BORDER)) + .child( + div() + .child( + div() + .text_lg() + .text_color(rgb(TEXT)) + .child("Add workspace panel"), + ) + .child( + div() + .mt_1() + .text_xs() + .text_color(rgb(MUTED)) + .child("Created beside the selected pane with a persistent local identity."), + ), + ) + .child( + div() + .id("close-add-panel-chooser") + .cursor_pointer() + .px_2() + .py_1() + .rounded(px(4.0)) + .border_1() + .border_color(rgb(BORDER)) + .text_xs() + .text_color(rgb(MUTED)) + .child("ESC") + .on_click(cx.listener(|shell, _, _, cx| { + shell.add_panel_chooser_open = false; + cx.notify(); + })), + ), + ) + .child(div().flex().flex_col().gap_2().p_3().children(kinds)) + .when(!detached.is_empty(), |view| { + view.child( + div() + .px_4() + .pt_2() + .pb_1() + .border_t_1() + .border_color(rgb(BORDER)) + .text_xs() + .text_color(rgb(MUTED)) + .child("REATTACH RUNNING SESSION"), + ) + .children(detached.into_iter().map(|(id, title, kind)| { + div() + .id(("chooser-reattach", id.get())) + .cursor_pointer() + .flex() + .items_center() + .justify_between() + .mx_3() + .mb_2() + .px_3() + .py_2() + .rounded(px(5.0)) + .bg(rgb(PANEL)) + .border_1() + .border_color(rgb(BORDER)) + .child( + div() + .child(div().text_sm().text_color(rgb(TEXT)).child(title)) + .child( + div() + .mt_1() + .text_xs() + .text_color(rgb(MUTED)) + .child(format!("{kind} · pane-{}", id.get())), + ), + ) + .child(div().text_xs().text_color(rgb(ACCENT)).child("REATTACH")) + .on_click(cx.listener(move |shell, _, window, cx| { + shell.add_panel_chooser_open = false; + shell.attach_panel(id, window, cx); + })) + })) + }) + .child( + div() + .flex() + .justify_between() + .px_4() + .py_2() + .border_t_1() + .border_color(rgb(BORDER)) + .text_xs() + .text_color(rgb(MUTED)) + .child("1–4 create · click reattaches") + .child("Esc closes"), + ), + ) + } + + /// Attached panels whose agent is blocked on a human answer. + /// + /// The count is derived rather than declared: a sidebar that claims one + /// pane needs input while no pane is blocked is the same class of untruth + /// as an invented usage number. + fn attention_panels(&self) -> Vec { + self.panels + .attached_ids() + .into_iter() + .map(|id| self.panel_view(id)) + .filter(PanelView::needs_input) + .collect() + } + + /// Where sessions are owned, and what each host is actually doing. + fn runtime_rows(&self) -> Vec { + let running = self + .live_terminals + .values() + .filter(|terminal| matches!(terminal.status, LiveRuntimeStatus::Running { .. })) + .count(); + let total = self.live_terminals.len(); + let local = RuntimeRow { + label: "this machine", + detail: format!("{running}/{total} live PTYs"), + tone: if running == 0 { MUTED } else { SUCCESS }, + }; + // The usage adapter is neither a host nor an endpoint, but its health + // belongs beside them: it is the reason the footer can or cannot answer. + let adapter = RuntimeRow { + label: "usage adapter", + detail: format!( + "{} · {}/{} profiles reporting", + self.usage.probe_status(), + self.usage.reporting_profile_count(), + self.usage.declared_profile_count() + ), + tone: if self.usage.reporting_profile_count() == 0 { + MUTED + } else { + SUCCESS + }, + }; + vec![local, adapter] + } + + /// The pane tab strip above the workspace row. + #[allow( + clippy::too_many_lines, + reason = "a single declarative element tree, not a sequence of steps" + )] + fn render_tabs( + attached_panes: &[PanelId], + visible_count: usize, + detached_count: usize, + cx: &mut Context, + ) -> gpui::AnyElement { + let attached_count = attached_panes.len(); + div() + .flex() + .items_center() + .h(px(38.0)) + .flex_none() + .px_2() + .gap_1() + .bg(rgb(PANEL)) + .border_b_1() + .border_color(rgb(BORDER_QUIET)) + // One tab, because there is one workspace. Two more used to sit + // here looking like navigation and doing nothing. + .child( + div() + .h_full() + .flex() + .items_center() + .px_3() + .border_b_2() + .border_color(rgb(ACCENT)) + .text_sm() + .child("Lumbridge Code"), + ) + .child(div().flex_1()) + .child(div().px_3().text_xs().text_color(rgb(MUTED)).child(format!( + "{visible_count} shown · {attached_count} attached · {detached_count} detached" + ))) + .child( + div() + .id("add-workspace-panel") + .cursor_pointer() + .ml_2() + .px_3() + .py_1() + .rounded(px(4.0)) + .border_1() + .border_color(rgb(ACCENT)) + .text_xs() + .text_color(rgb(ACCENT)) + .child("+ ADD PANEL ▾") + .on_click(cx.listener(|shell, _, window, cx| { + shell.dispatch(ShellAction::CloseCommandPalette); + shell.add_panel_chooser_open = !shell.add_panel_chooser_open; + window.focus(&shell.root_focus); + cx.notify(); + })), + ) + .into_any_element() + } + + /// Assembles the window: header, then sidebar beside the workspace, then footer. + #[allow( + clippy::too_many_lines, + reason = "a single declarative element tree, not a sequence of steps" + )] + fn render_root(&self, parts: RootParts, cx: &mut Context) -> gpui::AnyElement { + let RootParts { + sidebar, + tabs, + workspace_row, + footer_left, + timing, + runtime_summary, + running_runtime_count, + } = parts; + div() + .id("lumbridge-shell") + .relative() + .track_focus(&self.root_focus) + .key_context("LumbridgeShell") + .on_click(cx.listener(|shell, _, window, _| { + window.focus(&shell.root_focus); + })) + .on_action(cx.listener(Self::focus_left)) + .on_action(cx.listener(Self::focus_right)) + .on_action(cx.listener(Self::focus_up)) + .on_action(cx.listener(Self::focus_down)) + .on_action(cx.listener(Self::open_palette)) + .on_action(cx.listener(Self::close_palette)) + .on_action(cx.listener(Self::add_panel_action)) + .on_action(cx.listener(Self::detach_selected_panel)) + .on_action(cx.listener(Self::terminal_taller)) + .on_action(cx.listener(Self::terminal_shorter)) + .on_action(cx.listener(Self::terminal_wider)) + .on_action(cx.listener(Self::terminal_narrower)) + .on_action(cx.listener(|shell, _: &SelectPane1, window, cx| { + shell.select_pane_at(0, window, cx); + })) + .on_action(cx.listener(|shell, _: &SelectPane2, window, cx| { + shell.select_pane_at(1, window, cx); + })) + .on_action(cx.listener(|shell, _: &SelectPane3, window, cx| { + shell.select_pane_at(2, window, cx); + })) + .on_action(cx.listener(|shell, _: &SelectPane4, window, cx| { + shell.select_pane_at(3, window, cx); + })) + .on_action(cx.listener(|shell, _: &SelectPane5, window, cx| { + shell.select_pane_at(4, window, cx); + })) + .on_action(cx.listener(|shell, _: &SelectPane6, window, cx| { + shell.select_pane_at(5, window, cx); + })) + .on_key_down(cx.listener(Self::on_key_down)) + .flex() + .flex_col() + .size_full() + .bg(rgb(BG)) + .text_color(rgb(TEXT)) + .child( + div() + .flex() + .items_center() + .h(px(48.0)) + .flex_none() + .px_4() + .bg(rgb(PANEL_ALT)) + .border_b_1() + .border_color(rgb(BORDER_QUIET)) + .child(div().text_lg().child("Lumbridge")) + .child( + div() + .ml_3() + .text_sm() + .text_color(rgb(MUTED)) + .child("Lumbridge Code"), + ) + .child(div().flex_1()) + // The same tone rule runtime_rows applies: nothing live is + // not a success, and "0/5 LIVE PTYS" in green said it was. + .child( + div() + .mr_4() + .text_xs() + .text_color(rgb(if running_runtime_count == 0 { + MUTED + } else { + SUCCESS + })) + .child(runtime_summary), + ) + .child( + div() + .text_sm() + .text_color(rgb(ACCENT)) + .child("Ctrl/⌘ K · Commands"), + ), + ) + .child( + div().flex().flex_1().min_h_0().child(sidebar).child( + div() + .flex() + .flex_col() + .flex_1() + .min_w_0() + .min_h_0() + .overflow_hidden() + .child(tabs) + .child(workspace_row), + ), + ) + .child( + div() + .flex() + .items_center() + .justify_between() + .h(px(APP_FOOTER_HEIGHT)) + .flex_none() + .px_3() + .gap_4() + .bg(rgb(PANEL_ALT)) + .border_t_1() + .border_color(rgb(BORDER_QUIET)) + .text_xs() + .text_color(rgb(MUTED)) + .child( + div() + .flex() + .flex_col() + .flex_none() + .min_w_0() + .child(div().truncate().child(footer_left)) + .child(div().truncate().child(timing)), + ) + .child(div().flex_1()) + .child(self.footer_usage_zone()), + ) + .when(self.model.command_palette().is_open(), |view| { + view.child(self.command_palette()) + }) + .when(self.add_panel_chooser_open, |view| { + view.child(self.add_panel_chooser(cx)) + }) + .into_any_element() + } + + /// The left rail: what needs you, what is running, what is detached. + /// + /// Split out of `render`, which was 353 lines. It is the first thing the + /// sidebar rework needs, and a 350-line render function is where a UI stops + /// being reviewable. + #[allow( + clippy::too_many_lines, + reason = "a single declarative element tree; the sidebar rework replaces it wholesale" + )] + fn render_sidebar( + &self, + attention_panels: &[PanelView], + detached_entries: &[(PanelId, String)], + cx: &mut Context, + ) -> gpui::AnyElement { + div() + .flex() + .flex_col() + .w(px(248.0)) + .flex_none() + .bg(rgb(PANEL)) + .border_r_1() + .border_color(rgb(BORDER_QUIET)) + .child( + div() + .px_4() + .pt_4() + .pb_2() + .text_xs() + .text_color(rgb(if attention_panels.is_empty() { + MUTED + } else { + ATTENTION + })) + .child(format!("ATTENTION · {}", attention_panels.len())), + ) + .when(attention_panels.is_empty(), |view| { + view.child( + div() + .mx_2() + .mb_3() + .px_3() + .py_2() + .text_xs() + .text_color(rgb(MUTED)) + .child("No pane is waiting on you"), + ) + }) + .children(attention_panels.iter().map(|pane| { + let id = pane.id; + div() + .id(("attention-panel", id.get())) + .cursor_pointer() + .mx_2() + .mb_3() + .px_3() + .py_2() + .rounded(px(5.0)) + .bg(rgb(PANEL_ACTIVE)) + .border_1() + .border_color(rgb(ATTENTION)) + .hover(|view| view.bg(rgb(PANEL_ALT))) + .child( + div() + .text_sm() + .text_color(rgb(TEXT)) + .child(pane.title.clone()), + ) + .child( + div() + .mt_1() + .text_xs() + .text_color(rgb(MUTED)) + .child(pane.target.clone()), + ) + .on_click(cx.listener(move |shell, _, window, cx| { + shell.select_pane(id, window, cx); + })) + })) + .child( + div() + .mt_3() + .px_4() + .py_2() + .text_xs() + .text_color(rgb(MUTED)) + .child("RUNTIMES"), + ) + .children(self.runtime_rows().into_iter().map(|row| { + div() + .px_4() + .py_1() + .child(div().text_sm().text_color(rgb(row.tone)).child(row.label)) + .child(div().text_xs().text_color(rgb(MUTED)).child(row.detail)) + })) + .child( + div() + .px_4() + .pt_2() + .text_xs() + .text_color(rgb(MUTED)) + .child(self.persistence_status.clone()), + ) + .child( + div() + .mt_3() + .px_4() + .py_2() + .text_xs() + .text_color(rgb(MUTED)) + .child(format!("DETACHED SESSIONS · {}", detached_entries.len())), + ) + .children(detached_entries.iter().map(|(pane, title)| { + let (pane, title) = (*pane, title.clone()); + div() + .id(("detached-session", pane.get())) + .cursor_pointer() + .mx_2() + .mb_1() + .px_3() + .py_2() + .rounded(px(4.0)) + .border_1() + .border_color(rgb(BORDER_QUIET)) + .hover(|view| view.border_color(rgb(ACCENT)).text_color(rgb(TEXT))) + .text_xs() + .text_color(rgb(MUTED)) + .child(format!("↪ {title}")) + .on_click(cx.listener(move |shell, _, window, cx| { + shell.attach_panel(pane, window, cx); + })) + })) + .child(div().flex_1()) + .into_any_element() + } + + /// The standing of every harness, always, regardless of what is selected. + /// + /// The old footer answered only for the selected pane, so the moment you + /// focused a plain shell your quota vanished. This strip keeps every + /// harness on screen and leads with what is left, because that is the + /// question. The selected harness expands with its rate and its trust. + fn footer_usage_zone(&self) -> impl IntoElement { + let active = self + .panels + .panel(self.panels.selected()) + .and_then(|panel| self.usage.profile_for_seed(panel.seed)) + .cloned(); + let segments = self.usage.strip(); + let orphan = active.is_none(); + div() + .flex() + .items_center() + .gap_4() + .when(orphan, |view| { + view.child( + div() + .flex_none() + .text_color(rgb(MUTED)) + .child("no harness on this pane"), + ) + }) + // The harness name is printed once per group. Repeating + // "CLAUDE CODE" in front of four of its own windows spends the + // strip's width on a word the eye has already read. + .children({ + let mut previous: Option = None; + segments + .into_iter() + .map(|segment| { + let repeats = previous.as_deref() == Some(segment.label.as_str()); + previous = Some(segment.label.clone()); + let selected = active.as_ref() == Some(&segment.id); + usage_segment(segment, selected, repeats) + }) + .collect::>() + }) + } +} + +/// The provenance of a value is carried by the colour of its meter, so the +/// strip reads at a glance without a legend on every segment. +const fn provenance_color(provenance: UsageProvenance) -> u32 { + match provenance { + UsageProvenance::ProviderReported => SUCCESS, + UsageProvenance::HarnessReported => ACCENT, + UsageProvenance::LocallyMeasured => TEXT, + UsageProvenance::Estimated => ATTENTION, + UsageProvenance::Unavailable => MUTED, + } +} + +/// A quota meter. The filled part is spent; the empty part is what is left, +/// which is the way round an engineer reads it. +fn usage_meter(consumed_permille: Option, color: u32) -> impl IntoElement { + let Some(permille) = consumed_permille else { + // No capsule. A full-length empty gauge reads as "plenty left" from + // across the room, which is the opposite of the truth. A hairline is + // visibly not a measurement. + return div() + .w(px(80.0)) + .h(px(2.0)) + .flex_none() + .bg(rgb(BORDER)) + .into_any_element(); + }; + let clamped = u16::try_from(permille.min(1_000)).unwrap_or(1_000); + div() + .w(px(80.0)) + .h(px(8.0)) + .flex_none() + .rounded(px(4.0)) + .bg(rgb(BORDER_QUIET)) + .overflow_hidden() + .child( + div() + .h_full() + .w(relative(f32::from(clamped) / 1_000.0)) + .bg(rgb(color)), + ) + .into_any_element() +} + +/// One quota in the strip. +/// +/// `continues_group` means the harness above this one is the same, so its name +/// is left off and only the window is named. +fn usage_segment(segment: UsageSegment, selected: bool, continues_group: bool) -> impl IntoElement { + let color = provenance_color(segment.provenance); + let name_color = if selected { TEXT } else { MUTED }; + let headline_color = if segment.headline.is_none() { + MUTED + } else if segment.critical { + ATTENTION + } else { + TEXT + }; + div() + .flex() + .items_center() + .gap_2() + .when(selected, |view| { + view.px_2().py_1().rounded(px(4.0)).bg(rgb(PANEL_ACTIVE)) + }) + .when(!continues_group, |view| { + view.child( + div() + .flex_none() + .text_color(rgb(name_color)) + .child(segment.label), + ) + }) + // A quiet pill rather than more running text. The window's name is a + // label on the number, not another number, and at BORDER weight it was + // simply invisible. + .child( + div() + .flex_none() + .px(px(5.0)) + .py(px(1.0)) + .rounded(px(3.0)) + .bg(rgb(if selected { BORDER } else { BORDER_QUIET })) + .text_color(rgb(if selected { TEXT } else { MUTED })) + .child(segment.scope), + ) + .child(usage_meter(segment.consumed_permille, color)) + .child( + div() + .flex_none() + .text_color(rgb(headline_color)) + .child(segment.headline.unwrap_or_else(|| "no reading".to_owned())), + ) + .when_some(segment.reset, |view, reset| { + view.child(div().flex_none().text_color(rgb(MUTED)).child(reset)) + }) + // Only the harness you are looking at spends footer width on its rate + // and its trust. The rest stay one glance wide. + .when(selected, |view| { + view.child(footer_separator()) + .child( + div() + .flex_none() + .text_color(rgb(provenance_color(segment.burn_provenance))) + .child(segment.burn), + ) + .child(provenance_chip(&segment.trust, segment.provenance)) + }) +} + +/// The pieces `render` assembles, bundled so the assembly step takes one +/// argument rather than six. +struct RootParts { + sidebar: gpui::AnyElement, + tabs: gpui::AnyElement, + workspace_row: gpui::AnyElement, + footer_left: String, + timing: String, + runtime_summary: String, + running_runtime_count: usize, +} + +/// One host or endpoint row in the sidebar's runtime list. +struct RuntimeRow { + label: &'static str, + detail: String, + tone: u32, +} + +fn footer_separator() -> impl IntoElement { + div().text_color(rgb(BORDER)).child("│") +} + +/// The trust marker. Its colour is the provenance, never the value. +fn provenance_chip(text: &str, provenance: UsageProvenance) -> impl IntoElement { + let color = match provenance { + UsageProvenance::ProviderReported => SUCCESS, + UsageProvenance::HarnessReported => ACCENT, + UsageProvenance::LocallyMeasured => TEXT, + UsageProvenance::Estimated => ATTENTION, + UsageProvenance::Unavailable => MUTED, + }; + div() + .px_2() + .py(px(1.0)) + .rounded(px(3.0)) + .border_1() + .border_color(rgb(color)) + .text_color(rgb(color)) + .child(text.to_owned()) +} + +impl Render for LumbridgeShell { + fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { + let panel_capacity = visible_panel_count(window.bounds().size); + let attached_panes = self.panels.attached_ids(); + let attached_count = attached_panes.len(); + let detached_entries = self + .panels + .detached_ids() + .into_iter() + .map(|pane| { + let title = self + .panels + .panel(pane) + .expect("detached panel exists") + .title + .clone(); + (pane, title) + }) + .collect::>(); + let detached_count = detached_entries.len(); + let visible_count = panel_capacity.min(attached_count).max(1); + let running_runtime_count = self + .live_terminals + .values() + .filter(|terminal| matches!(terminal.status, LiveRuntimeStatus::Running { .. })) + .count(); + let runtime_summary = format!( + "{running_runtime_count}/{} LIVE PTYS", + self.live_terminals.len() + ); + let attention_panels = self.attention_panels(); + let sidebar = self.render_sidebar(&attention_panels, &detached_entries, cx); + + let selected_position = attached_panes + .iter() + .position(|pane| *pane == self.panels.selected()) + .expect("the selected pane must remain attached"); + let tabs = Self::render_tabs(&attached_panes, visible_count, detached_count, cx); + let panel_range = visible_panel_range(attached_count, selected_position, visible_count); + let workspace_panels = panel_range + .map(|index| { + let pane = self.panel_view(attached_panes[index]); + div() + .flex_1() + .min_w_0() + .min_h_0() + .child(self.workspace_panel(&pane, pane.id == self.panels.selected(), cx)) + }) + .collect::>(); + let workspace_row = div() + .flex() + .gap_1() + .flex_1() + .min_w_0() + .min_h_0() + .overflow_hidden() + .children(workspace_panels); + + let counters = self.model.counters(); + let terminal_revision = self + .live_terminals + .values() + .map(|terminal| terminal.terminal.revision()) + .sum::(); + let footer_left = format!( + "rev {} · {} PTYs · VT rev {} · {} focus · {} VT snapshots · {} synthetic lines", + self.model.revision(), + self.runtimes.len(), + terminal_revision, + counters.focus_moves, + counters.external_snapshot_updates, + counters.terminal_lines_appended + ); + let timing = self.timing.summary(); + + let root = self.render_root( + RootParts { + sidebar, + tabs, + workspace_row: workspace_row.into_any_element(), + footer_left, + timing, + runtime_summary, + running_runtime_count, + }, + cx, + ); + // Measured after the tree is built, which is what the sample means. + self.timing.observe_element_build(); + root + } +} + +fn key_modifiers(event: &KeyDownEvent) -> KeyModifiers { + let mut modifiers = KeyModifiers::default(); + if event.keystroke.modifiers.shift { + modifiers = modifiers.union(KeyModifiers::SHIFT); + } + if event.keystroke.modifiers.alt { + modifiers = modifiers.union(KeyModifiers::ALT); + } + if event.keystroke.modifiers.control { + modifiers = modifiers.union(KeyModifiers::CONTROL); + } + if event.keystroke.modifiers.platform { + modifiers = modifiers.union(KeyModifiers::PLATFORM); + } + modifiers +} + +fn terminal_key_from_parts( + key: &str, + key_char: Option<&str>, + modifiers: KeyModifiers, +) -> Option { + let key = match key { + "enter" => TerminalKey::Enter, + "backspace" => TerminalKey::Backspace, + "tab" => TerminalKey::Tab, + "escape" => TerminalKey::Escape, + "up" => TerminalKey::Up, + "down" => TerminalKey::Down, + "left" => TerminalKey::Left, + "right" => TerminalKey::Right, + "home" => TerminalKey::Home, + "end" => TerminalKey::End, + "insert" => TerminalKey::Insert, + "delete" => TerminalKey::Delete, + "pageup" => TerminalKey::PageUp, + "pagedown" => TerminalKey::PageDown, + function + if function.strip_prefix('f').is_some_and(|suffix| { + !suffix.is_empty() && suffix.bytes().all(|byte| byte.is_ascii_digit()) + }) => + { + let number = function.strip_prefix('f')?.parse::().ok()?; + TerminalKey::Function(number) + } + _ if !modifiers.contains(KeyModifiers::PLATFORM) => TerminalKey::Text(key_char?.to_owned()), + _ => return None, + }; + Some(TerminalKeyEvent { key, modifiers }) +} + +fn terminal_scroll_from_parts(key: &str, modifiers: KeyModifiers) -> Option { + if !modifiers.contains(KeyModifiers::SHIFT) { + return None; + } + match key { + "pageup" => Some(TerminalScroll::PageUp), + "pagedown" => Some(TerminalScroll::PageDown), + "home" => Some(TerminalScroll::Top), + "end" => Some(TerminalScroll::Bottom), + _ => None, + } +} + +fn live_pty_script(seed: Option) -> &'static str { + match seed { + Some(SeedPane::CodexRuntime) => { + "printf 'Codex runtime · independent Lumbridge PTY\\n'; exec /bin/sh -i" + } + Some(SeedPane::ClaudeUi) => { + "printf 'Claude workspace · independent Lumbridge PTY\\n'; exec /bin/sh -i" + } + Some(SeedPane::PiDocs) => { + "printf 'Pi docs · independent Lumbridge PTY\\n'; exec /bin/sh -i" + } + None => "printf 'Lumbridge terminal · persistent pane identity\\n'; exec /bin/sh -i", + Some(SeedPane::Architecture | SeedPane::AcpPreview | SeedPane::RuntimeReview) => { + unreachable!("only terminal fixtures own live PTYs") + } + } +} + +fn spawn_live_runtime( + runtimes: &mut RuntimeRegistry, + pane: PanelId, + seed: Option, + dimensions: TerminalDimensions, +) -> Result<(), RuntimeRegistryError> { + let command = CommandConfig::new("/bin/sh") + .map_err(RuntimeActorError::Start)? + .args(["-c", live_pty_script(seed)]); + let pty_size = TerminalSize::new(dimensions.rows(), dimensions.columns()) + .map_err(RuntimeActorError::Start)?; + runtimes.spawn( + pane, + command, + PtyOptions::new(pty_size), + RuntimeActorOptions::default(), + )?; + Ok(()) +} fn main() { - let status = ProductStatus::architecture_phase(Platform::current()); - println!( - "Lumbridge {} ({})", - env!("CARGO_PKG_VERSION"), - status.platform - ); - println!("{}", status.message); + Application::new().run(|cx: &mut App| { + cx.bind_keys([ + KeyBinding::new("alt-left", FocusLeft, Some("LumbridgeShell")), + KeyBinding::new("alt-right", FocusRight, Some("LumbridgeShell")), + KeyBinding::new("alt-up", FocusUp, Some("LumbridgeShell")), + KeyBinding::new("alt-down", FocusDown, Some("LumbridgeShell")), + KeyBinding::new("secondary-k", OpenPalette, Some("LumbridgeShell")), + KeyBinding::new("alt-1", SelectPane1, Some("LumbridgeShell")), + KeyBinding::new("alt-2", SelectPane2, Some("LumbridgeShell")), + KeyBinding::new("alt-3", SelectPane3, Some("LumbridgeShell")), + KeyBinding::new("alt-4", SelectPane4, Some("LumbridgeShell")), + KeyBinding::new("alt-5", SelectPane5, Some("LumbridgeShell")), + KeyBinding::new("alt-6", SelectPane6, Some("LumbridgeShell")), + KeyBinding::new("alt-shift-n", AddPanel, Some("LumbridgeShell")), + KeyBinding::new("alt-shift-w", DetachSelectedPanel, Some("LumbridgeShell")), + KeyBinding::new("alt-shift-up", TerminalTaller, Some("LumbridgeShell")), + KeyBinding::new("alt-shift-down", TerminalShorter, Some("LumbridgeShell")), + KeyBinding::new("alt-shift-right", TerminalWider, Some("LumbridgeShell")), + KeyBinding::new("alt-shift-left", TerminalNarrower, Some("LumbridgeShell")), + ]); + + let bounds = Bounds::centered(None, size(px(1500.0), px(960.0)), cx); + cx.open_window( + WindowOptions { + window_bounds: Some(WindowBounds::Windowed(bounds)), + titlebar: Some(gpui::TitlebarOptions { + title: Some("Lumbridge · GPUI workspace".into()), + ..Default::default() + }), + ..Default::default() + }, + |window, cx| cx.new(|cx| LumbridgeShell::new(window, cx)), + ) + .expect("GPUI workspace window should open"); + cx.activate(true); + }); +} + +#[cfg(test)] +mod tests { + use super::{ + KeyModifiers, TerminalEngine, TerminalEngineOptions, TerminalKey, TerminalScroll, + indexed_terminal_color, terminal_dimensions_for_window, terminal_key_from_parts, + terminal_paint_rows, terminal_scroll_from_parts, visible_panel_count, visible_panel_range, + }; + use gpui::{px, size}; + + #[test] + fn maps_named_and_composed_gpui_keys_to_terminal_input() { + let enter = terminal_key_from_parts("enter", None, KeyModifiers::default()).unwrap(); + assert_eq!(enter.key, TerminalKey::Enter); + + let literal_f = terminal_key_from_parts("f", Some("f"), KeyModifiers::default()).unwrap(); + assert_eq!(literal_f.key, TerminalKey::Text("f".into())); + + let function = terminal_key_from_parts("f12", None, KeyModifiers::default()).unwrap(); + assert_eq!(function.key, TerminalKey::Function(12)); + + let composed = terminal_key_from_parts("é", Some("é"), KeyModifiers::default()).unwrap(); + assert_eq!(composed.key, TerminalKey::Text("é".into())); + } + + #[test] + fn reserves_platform_text_shortcuts_for_the_workspace() { + assert!(terminal_key_from_parts("c", Some("c"), KeyModifiers::PLATFORM).is_none()); + let control = terminal_key_from_parts("c", Some("c"), KeyModifiers::CONTROL).unwrap(); + assert_eq!(control.key, TerminalKey::Text("c".into())); + } + + #[test] + fn terminal_geometry_tracks_middle_sixty_percent_per_panel() { + let dimensions = terminal_dimensions_for_window(size(px(1500.0), px(960.0)), 5); + assert_eq!(dimensions.rows(), 26); + assert_eq!(dimensions.columns(), 45); + + let ultrawide = size(px(3440.0), px(1440.0)); + assert_eq!(visible_panel_count(ultrawide), 5); + let dimensions = terminal_dimensions_for_window(ultrawide, 5); + assert_eq!(dimensions.rows(), 42); + assert_eq!(dimensions.columns(), 71); + + let two_panels = terminal_dimensions_for_window(ultrawide, 2); + assert_eq!(two_panels.rows(), 42); + assert_eq!(two_panels.columns(), 185); + } + + #[test] + fn panel_window_keeps_the_selected_pane_visible() { + assert_eq!(visible_panel_range(6, 0, 5), 0..5); + assert_eq!(visible_panel_range(6, 5, 5), 1..6); + assert_eq!(visible_panel_range(6, 3, 3), 2..5); + assert_eq!(visible_panel_range(6, 4, 1), 4..5); + } + + #[test] + fn shift_navigation_controls_scrollback_without_reaching_the_pty() { + assert_eq!( + terminal_scroll_from_parts("pageup", KeyModifiers::SHIFT), + Some(TerminalScroll::PageUp) + ); + assert_eq!( + terminal_scroll_from_parts("end", KeyModifiers::SHIFT), + Some(TerminalScroll::Bottom) + ); + assert_eq!( + terminal_scroll_from_parts("pageup", KeyModifiers::default()), + None + ); + } + + #[test] + fn terminal_paint_rows_merge_runs_and_preserve_cursor_boundary() { + let mut terminal = TerminalEngine::new(TerminalEngineOptions::default()); + terminal.process(b"\x1b[31mAB\x1b[0m"); + let rows = terminal_paint_rows(&terminal.snapshot()); + assert!( + rows[0] + .iter() + .any(|run| run.text == "AB" && run.columns == 2) + ); + assert!(rows[0].iter().any(|run| run.cursor.is_some())); + } + + #[test] + #[allow( + clippy::unreadable_literal, + reason = "six-digit colour hex reads whole" + )] + fn xterm_color_cube_and_grayscale_are_deterministic() { + assert_eq!(indexed_terminal_color(16), 0x000000); + assert_eq!(indexed_terminal_color(231), 0xffffff); + assert_eq!(indexed_terminal_color(232), 0x080808); + assert_eq!(indexed_terminal_color(255), 0xeeeeee); + } } diff --git a/spikes/gpui-shell/src/panel_registry.rs b/apps/lumbridge/src/panel_registry.rs similarity index 96% rename from spikes/gpui-shell/src/panel_registry.rs rename to apps/lumbridge/src/panel_registry.rs index f1d39d1..c93fcd3 100644 --- a/spikes/gpui-shell/src/panel_registry.rs +++ b/apps/lumbridge/src/panel_registry.rs @@ -1,6 +1,6 @@ use std::collections::BTreeSet; -use lumbridge_spike_model::PaneId as FixturePaneId; +use lumbridge_ui_fixture::PaneId as FixturePaneId; use serde::{Deserialize, Serialize}; #[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)] @@ -238,11 +238,16 @@ impl PanelRegistry { let Some(position) = attached.iter().position(|id| *id == self.selected) else { return false; }; - let next = position as isize + delta; - if next < 0 || next >= attached.len() as isize { + // checked_add_signed rather than a round trip through isize: the cast + // pair could wrap on a 32-bit target, and the bounds check that followed + // it was doing the work this does directly. + let Some(next) = position.checked_add_signed(delta) else { return false; - } - self.select(attached[next as usize]) + }; + let Some(id) = attached.get(next) else { + return false; + }; + self.select(*id) } pub(crate) fn create(&mut self, kind: PanelKind) -> PanelId { diff --git a/spikes/gpui-shell/src/usage_feed.rs b/apps/lumbridge/src/usage_feed.rs similarity index 99% rename from spikes/gpui-shell/src/usage_feed.rs rename to apps/lumbridge/src/usage_feed.rs index 751690e..fdf0e27 100644 --- a/spikes/gpui-shell/src/usage_feed.rs +++ b/apps/lumbridge/src/usage_feed.rs @@ -152,7 +152,7 @@ impl UsageFeed { /// when no adapter can run. fn start_codex_probe(&mut self, enabled: bool) { if !enabled { - self.probe_status = "codex probe disabled".to_owned(); + "codex probe disabled".clone_into(&mut self.probe_status); return; } match CodexProbe::start(CodexProbeOptions::default()) { @@ -165,7 +165,7 @@ impl UsageFeed { .insert(profile.id().clone(), ProbeHealth::Starting); } self.probes.push(Box::new(probe)); - self.probe_status = "codex probe starting".to_owned(); + "codex probe starting".clone_into(&mut self.probe_status); } Err(error) => { self.probe_status = format!("codex probe unavailable · {error}"); @@ -183,7 +183,7 @@ impl UsageFeed { // Say so, rather than leaving whatever the Codex path last wrote. // A disabled probe that reports nothing about itself is // indistinguishable from one that failed to start. - self.probe_status = "claude probe disabled".to_owned(); + "claude probe disabled".clone_into(&mut self.probe_status); return; } match ClaudeCodeProbe::start(ClaudeCodeProbeOptions::default()) { diff --git a/crates/lumbridge-ui-fixture/Cargo.toml b/crates/lumbridge-ui-fixture/Cargo.toml new file mode 100644 index 0000000..ae3c549 --- /dev/null +++ b/crates/lumbridge-ui-fixture/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "lumbridge-ui-fixture" +description = "Deterministic shell fixtures shared by the native UI and its comparison spike" +version.workspace = true +edition.workspace = true +rust-version.workspace = true +license.workspace = true +repository.workspace = true +publish = false + +[lib] +path = "src/lib.rs" + +[lints] +workspace = true diff --git a/spikes/ui-shell-model/src/lib.rs b/crates/lumbridge-ui-fixture/src/lib.rs similarity index 97% rename from spikes/ui-shell-model/src/lib.rs rename to crates/lumbridge-ui-fixture/src/lib.rs index 2eb70d3..0c35f50 100644 --- a/spikes/ui-shell-model/src/lib.rs +++ b/crates/lumbridge-ui-fixture/src/lib.rs @@ -200,7 +200,7 @@ pub const PANES: [PaneFixture; 6] = [ /// The one footer string the frozen Floem shell renders. /// -/// It replaces three that read like data — a pane census, "Codex · ChatGPT +/// It replaces three that read like data — a pane census, "Codex · `ChatGPT` /// subscription · 62% window remaining", and "burn 8.4%/hr · resets in 2h 14m". /// Decision 0013 names that exact form as the thing that must never be shown, /// and a comparison shell rendering a fabricated quota beside a real one is @@ -366,6 +366,10 @@ impl Default for ShellModel { } impl ShellModel { + /// # Errors + /// + /// Returns [`InvalidTerminalLineLimit`] when `limit` is zero: a terminal + /// that retains no lines is not a smaller scrollback, it is a broken one. pub fn with_terminal_line_limit(limit: usize) -> Result { if limit == 0 { return Err(InvalidTerminalLineLimit); @@ -503,6 +507,15 @@ impl ShellModel { self.counters } + /// # Panics + /// + /// Panics if a pane reported as attached is absent from the attached-ID + /// list, which would mean the attachment grid and the pane table had + /// diverged. That is an invariant break in this fixture, not an input error. + #[allow( + clippy::too_many_lines, + reason = "one match over the action enum; splitting it hides the exhaustiveness" + )] pub fn dispatch(&mut self, action: ShellAction) -> ActionOutcome { self.counters.events_dispatched += 1; let mut changed = false; @@ -510,7 +523,7 @@ impl ShellModel { match action { ShellAction::MoveFocus(direction) => { if let Some(next) = - attached_focus_neighbor(&self.attached_panels, self.selected_pane, direction) + attached_focus_neighbor(self.attached_panels, self.selected_pane, direction) { self.selected_pane = next; self.counters.focus_moves += 1; @@ -677,7 +690,7 @@ pub const fn focus_neighbor(pane: PaneId, direction: FocusDirection) -> Option

Option { @@ -732,7 +745,7 @@ mod tests { .panes() .iter() .filter(|pane| pane.needs_input()) - .map(|pane| pane.id()) + .map(super::PaneState::id) .collect::>(), vec![PaneId::ClaudeUi] ); diff --git a/deny.toml b/deny.toml new file mode 100644 index 0000000..8a914d1 --- /dev/null +++ b/deny.toml @@ -0,0 +1,57 @@ +# License policy for everything Lumbridge ships. +# +# Graduating the GPUI shell out of `spikes/` moved several hundred packages from +# a spike's dependency tree into the product's. `spikes/README.md` called GPUI's +# license closure "a hard gate" and the scorecard scored it `pending`; this is +# where that gate is enforced rather than described. +# +# cargo install cargo-deny && cargo deny check licenses +[graph] +all-features = true + +[licenses] +# Permissive, plus two weak-copyleft licenses that are file-level and do not +# reach Lumbridge's own sources. +allow = [ + "Apache-2.0", + "Apache-2.0 WITH LLVM-exception", + "BSD-2-Clause", + "BSD-3-Clause", + "BSL-1.0", + "CC0-1.0", + "ISC", + "MIT", + "MIT-0", + "MPL-2.0", + "Unicode-3.0", + "Unlicense", + "Zlib", + + # Reviewed additions, each reached by exactly one path: + # + # CDLA-Permissive-2.0 is webpki-roots, which is Mozilla's CA root store — + # data, not code, under a permissive data licence with no copyleft and no + # attribution requirement on downstream distribution. It arrives through + # ureq, which the Claude usage endpoint needs (decision 0016). + "CDLA-Permissive-2.0", + # NCSA is libfuzzer-sys, a permissive BSD/MIT-style licence. It reaches the + # graph only as rav1e -> ravif -> image -> gpui and only under + # `all-features`; no shipped build links it. Allowed rather than excluded so + # the audit stays strict everywhere else. + "NCSA", +] +# A dependency whose license cannot be determined is not a licensing question to +# settle later; it is a blocker now. +unused-allowed-license = "allow" +confidence-threshold = 0.9 + +[bans] +multiple-versions = "allow" + +[advisories] +yanked = "deny" + +[sources] +unknown-registry = "deny" +unknown-git = "deny" +allow-registry = ["https://github.com/rust-lang/crates.io-index"] diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 957eb23..7481105 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -43,7 +43,11 @@ messages should be real from the beginning. The scaffold currently contains `lumbridge-core`, `lumbridge-storage`, `lumbridge-buzz`, `lumbridge-pty`, `lumbridge-runtime`, `lumbridge-terminal`, -`lumbridge-harness`, and the entry point. `lumbridge-core` also contains the +`lumbridge-harness`, `lumbridge-ui-fixture`, and the `lumbridge` application +itself. The GPUI shell was a spike in an excluded workspace until it graduated +into `apps/lumbridge`; `scripts/ci.sh` now takes `--headless` and `--ui` so the +non-UI crates still build in seconds, and `cargo deny check licenses` gates the +dependency closure that graduation made the product's. See decision 0017. `lumbridge-core` also contains the first typed workspace command reducer and the usage ledger. Larger runtime crates are added after their architecture spikes pass. @@ -128,7 +132,16 @@ details. The measured spike compares: 1. GPUI for a Zed-like native model and excellent text-heavy interaction. 2. Floem for an independent native Rust model with existing editor primitives. -The winner must render six busy panes smoothly, keep input latency low, support +Floem is frozen: the scorecard records it failing the accessibility hard gate +with no AccessKit at its pinned revision, and comparability on the footer strip +was already lost when the usage ledger landed. It is retained as evidence at the +revision where the comparison was made, not maintained in parity. The product +ships on published `gpui 0.2.2`, which has no AccessKit either, behind a narrow +adapter that no-ops today and calls real roles on a Zed revision later — so that +gate is knowingly unmet and staged rather than quietly dropped. See decision +0017. + +The original comparison bar was that the winner must render six busy panes smoothly, keep input latency low, support IME/accessibility, package on macOS and both Linux targets, and avoid a license or upstream-stability trap. Current Zed GPUI is the provisional winner because its AccessKit semantics compile while the pinned Floem revision has no semantic diff --git a/docs/decisions/0017-gpui-dependency-and-the-floem-disposition.md b/docs/decisions/0017-gpui-dependency-and-the-floem-disposition.md new file mode 100644 index 0000000..70bfa90 --- /dev/null +++ b/docs/decisions/0017-gpui-dependency-and-the-floem-disposition.md @@ -0,0 +1,69 @@ +# 0017: The product graduates on published GPUI, behind an accessibility adapter, and Floem is frozen + +Status: accepted. Supersedes the provisional direction in `UI_SPIKE_SCORECARD.md`. + +Until now the product was `spikes/gpui-shell`: a cargo workspace of its own, +listed in the root manifest's `exclude`, so it inherited neither +`unsafe_code = "forbid"` nor `clippy pedantic`, and `./scripts/ci.sh` never +compiled it. Every test written into it silently never ran. That is the reason +this record exists before any feature work: the sidebar, settings, and devices +pages are all substantial new code, and writing them into an unlinted directory +would mean writing them twice. + +## The GPUI dependency + +The product ships on published `gpui 0.2.2` from crates.io, not on a Zed git +revision. + +The scorecard's provisional direction was "GPUI-first using current Zed GPUI +behind a narrow Lumbridge UI adapter", and that is being inverted here, so the +cost is stated plainly: **published 0.2.2 has no AccessKit dependency.** There +is no `Role`, no `aria_label`. Every pane and every sidebar row ships +screen-reader-silent, and `UX_VERTICAL_SLICE.md`'s hard gate — "the +accessibility tree names each pane, selected state, execution target, and +waiting state" — is knowingly unmet. + +It is chosen anyway because a git dependency on an unpinned upstream, plus an +MSRV move from 1.94 to 1.97.1 across every crate in the workspace, is a large +standing cost to carry for a capability we can stage. + +The mitigation is a narrow `a11y` adapter trait, introduced now while there are +few call sites: it no-ops on 0.2.2 and calls real roles and labels on a git +revision. The migration is then a swap rather than a rewrite. +`spikes/gpui-accessibility-probe` (Zed revision `ce48461e`, toolchain 1.97.1) is +retained, not deleted, as the standing proof that the semantics compile with +stable IDs and roles. Reversing this decision means changing one dependency line +and one adapter implementation. + +The scorecard's `pending` row for GPUI's dependency-license closure stops being +a spike question the moment 746 lockfile packages enter the root workspace: it +becomes the product's license closure. `deny.toml` and `cargo deny check +licenses` land in the same change, and the result is pasted into that row. + +## Floem + +`spikes/floem-shell` is **frozen**. It is no longer described as a comparable +candidate, and `ARCHITECTURE.md`'s "UI decision gate" and `TESTING.md`'s +"identical GPUI/Floem action replay" line are corrected to match. + +Comparability was already gone and already conceded — the scorecard records that +"the Floem shell still renders the static footer fixtures, so the two candidates +are no longer comparable on that strip", which the usage ledger work caused. It +also records Floem failing the accessibility gate outright, with no AccessKit at +its pinned revision. Keeping true parity would mean theming it alongside every +visual change forever, which is a recurring cost for a candidate that has +already lost on a hard gate. + +Freezing rather than deleting keeps the evidence trail: if the GPUI bet ever +needs revisiting, the comparison exists at the revision where it was made. What +freezing does not license is leaving falsehoods on screen — its fabricated +footer quota and its fixture worktree list naming a developer's machines were +deleted in the same pass as the GPUI shell's. + +## The default theme and accent + +The UI accent stays cool blue. `BRAND.md` scopes Ember (`#FF6B35`) to the +application icon and warns against low-contrast orange behind the mark; +`UX_VERTICAL_SLICE.md` commits the UI to one cool-blue action accent. Ember is +offered as a user-selectable accent rather than made the default, so neither +document needs amending. diff --git a/scripts/ci.sh b/scripts/ci.sh index 1b9d78b..7fc368c 100755 --- a/scripts/ci.sh +++ b/scripts/ci.sh @@ -1,15 +1,70 @@ #!/usr/bin/env bash +# Lumbridge CI. +# +# scripts/ci.sh headless and UI +# scripts/ci.sh --headless everything except the GPUI product +# scripts/ci.sh --ui only the GPUI product and its fixture +# +# The split exists because the UI crates pull GPUI's dependency tree — several +# hundred packages and a large target directory — while the headless crates +# build in seconds. A contributor changing lumbridge-core should not wait for a +# window toolkit, and a CI runner that cannot carry the UI job can still gate +# everything else. set -euo pipefail -cargo fmt --all --check -cargo clippy --workspace --all-targets --all-features -- -D warnings +run_headless=1 +run_ui=1 +case "${1:-}" in + --headless) run_ui=0 ;; + --ui) run_headless=0 ;; + "") ;; + *) echo "usage: $0 [--headless|--ui]" >&2; exit 2 ;; +esac -if command -v cargo-nextest >/dev/null 2>&1; then - cargo nextest run --workspace --all-features --profile "${NEXTEST_PROFILE:-default}" +# The UI crates. Excluded from the headless pass by name so a new crate is +# headless by default rather than silently joining the slow job. +ui_packages=(lumbridge lumbridge-ui-fixture) + +cargo fmt --all --check + +# The product's licence closure. Graduating GPUI into the workspace made this +# the product's problem rather than a spike's; deny.toml records which licences +# were reviewed and why. Skipped rather than failed when the tool is absent, so +# a contributor without it is not blocked. +if command -v cargo-deny >/dev/null 2>&1; then + cargo deny check licenses else - echo "cargo-nextest not installed; using cargo test" >&2 - cargo test --workspace --all-features + echo "cargo-deny not installed; skipping the licence gate (cargo install cargo-deny)" >&2 fi -# nextest deliberately does not run doctests on stable Rust. -cargo test --workspace --all-features --doc +test_runner() { + if command -v cargo-nextest >/dev/null 2>&1; then + cargo nextest run "$@" --all-features --profile "${NEXTEST_PROFILE:-default}" + else + echo "cargo-nextest not installed; using cargo test" >&2 + cargo test "$@" --all-features + fi +} + +if [ "$run_headless" = 1 ]; then + exclusions=() + for package in "${ui_packages[@]}"; do + exclusions+=(--exclude "$package") + done + cargo clippy --workspace "${exclusions[@]}" --all-targets --all-features -- -D warnings + test_runner --workspace "${exclusions[@]}" + # nextest deliberately does not run doctests on stable Rust. + cargo test --workspace "${exclusions[@]}" --all-features --doc +fi + +if [ "$run_ui" = 1 ]; then + # shellcheck source=/dev/null + . "$(dirname "$0")/native-libs.sh" + selections=() + for package in "${ui_packages[@]}"; do + selections+=(-p "$package") + done + cargo clippy "${selections[@]}" --all-targets --all-features -- -D warnings + test_runner "${selections[@]}" + cargo test "${selections[@]}" --all-features --doc +fi diff --git a/scripts/native-libs.sh b/scripts/native-libs.sh new file mode 100755 index 0000000..aef5432 --- /dev/null +++ b/scripts/native-libs.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +# Makes GPUI's X11 backend linkable on distributions that ship +# libxkbcommon-x11.so.0 without the unversioned development symlink. +# +# The real fix is installing libxkbcommon-x11-dev. When that package is absent +# this creates the one symlink the linker needs in a cache directory and exports +# LIBRARY_PATH, so a UI build works without root. Source it, do not run it. +# +# source scripts/native-libs.sh + +lumbridge_native_libs() { + local runtime=/usr/lib/x86_64-linux-gnu/libxkbcommon-x11.so.0 + local devlink=/usr/lib/x86_64-linux-gnu/libxkbcommon-x11.so + if [ -e "$devlink" ]; then + return 0 + fi + if [ ! -e "$runtime" ]; then + echo "libxkbcommon-x11 is not installed; a UI build will fail to link" >&2 + echo " install it with: sudo apt install libxkbcommon-x11-dev" >&2 + return 0 + fi + local cache="${XDG_CACHE_HOME:-$HOME/.cache}/lumbridge-native-libs" + mkdir -p "$cache" + ln -sfn "$runtime" "$cache/libxkbcommon-x11.so" + export LIBRARY_PATH="$cache${LIBRARY_PATH:+:$LIBRARY_PATH}" + echo "using $cache for libxkbcommon-x11.so (install libxkbcommon-x11-dev to avoid this)" >&2 +} + +lumbridge_native_libs diff --git a/scripts/open-metal-lumbridge.sh b/scripts/open-metal-lumbridge.sh index c1dfb63..d89790b 100755 --- a/scripts/open-metal-lumbridge.sh +++ b/scripts/open-metal-lumbridge.sh @@ -4,8 +4,8 @@ set -euo pipefail repo_path=${LUMBRIDGE_REPO:-/home/metal/Desktop/Lumbridge Code/lumbridge} window_title='Lumbridge · GPUI workspace' bacon_title='Lumbridge · Bacon' -manifest_path="$repo_path/spikes/gpui-shell/Cargo.toml" -binary_path="$repo_path/spikes/gpui-shell/target/debug/lumbridge-spike-gpui" +manifest_path="$repo_path/Cargo.toml" +binary_path="$repo_path/target/debug/lumbridge" if [[ ! -d "$repo_path/.git" ]]; then echo "Lumbridge repository not found at $repo_path" >&2 @@ -34,14 +34,9 @@ if [[ ! -x "$binary_path" ]]; then echo "required command not found: cargo" >&2 exit 1 fi - xkb_runtime=/usr/lib/x86_64-linux-gnu/libxkbcommon-x11.so.0 - if [[ -e "$xkb_runtime" ]]; then - native_libs="$repo_path/spikes/gpui-shell/target/native-libs" - mkdir -p "$native_libs" - ln -sfn "$xkb_runtime" "$native_libs/libxkbcommon-x11.so" - export LIBRARY_PATH="$native_libs${LIBRARY_PATH:+:$LIBRARY_PATH}" - fi - cargo build --locked --manifest-path "$manifest_path" + # shellcheck source=/dev/null + source "$repo_path/scripts/native-libs.sh" + cargo build --locked --manifest-path "$manifest_path" -p lumbridge fi # GPUI's X11 client sets WM_NAME but not _NET_WM_NAME, so wmctrl's window list diff --git a/spikes/floem-shell/Cargo.toml b/spikes/floem-shell/Cargo.toml index 243a04b..25fbd39 100644 --- a/spikes/floem-shell/Cargo.toml +++ b/spikes/floem-shell/Cargo.toml @@ -9,6 +9,6 @@ publish = false [dependencies] floem = { git = "https://github.com/lapce/floem", rev = "778bb5f2aa08429e579ee2e6ac97e84fbf18b618", default-features = false, features = ["editor", "vger"] } -lumbridge-spike-model = { path = "../ui-shell-model" } +lumbridge-ui-fixture = { path = "../../crates/lumbridge-ui-fixture" } [workspace] diff --git a/spikes/floem-shell/src/main.rs b/spikes/floem-shell/src/main.rs index f6dc4cf..aa78155 100644 --- a/spikes/floem-shell/src/main.rs +++ b/spikes/floem-shell/src/main.rs @@ -11,7 +11,7 @@ use floem::{ style::Position, window::WindowConfig, }; -use lumbridge_spike_model::{ +use lumbridge_ui_fixture::{ FOOTER_FIXTURE_NOTICE, FocusDirection, PaneId, PaneState, ShellAction, ShellModel, SurfaceKind, }; diff --git a/spikes/gpui-shell/Cargo.lock b/spikes/gpui-shell/Cargo.lock deleted file mode 100644 index 21dbc9c..0000000 --- a/spikes/gpui-shell/Cargo.lock +++ /dev/null @@ -1,7589 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - -[[package]] -name = "aes" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures 0.2.17", - "zeroize", -] - -[[package]] -name = "ahash" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" -dependencies = [ - "cfg-if", - "const-random", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" -dependencies = [ - "memchr", -] - -[[package]] -name = "alacritty_terminal" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda177466b9524d59f1b12f0dd30b68696788e9992a7e959021c4a0ed96fcf59" -dependencies = [ - "base64 0.22.1", - "bitflags 2.13.1", - "home", - "libc", - "log", - "miow", - "parking_lot", - "piper", - "polling", - "regex-automata", - "rustix 1.1.4", - "rustix-openpty", - "signal-hook", - "unicode-width", - "vte", - "windows-sys 0.59.0", -] - -[[package]] -name = "aligned" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685" -dependencies = [ - "as-slice", -] - -[[package]] -name = "aligned-vec" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" -dependencies = [ - "equator", -] - -[[package]] -name = "anyhow" -version = "1.0.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" - -[[package]] -name = "ar_archive_writer" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73cd58deff2140a0a8eae87e417bd01db68a33e148aa93d1e8cd837e55e312b6" -dependencies = [ - "object", -] - -[[package]] -name = "arbitrary" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" - -[[package]] -name = "arg_enum_proc_macro" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" - -[[package]] -name = "as-raw-xcb-connection" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" - -[[package]] -name = "as-slice" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" -dependencies = [ - "stable_deref_trait", -] - -[[package]] -name = "ash" -version = "0.38.0+1.3.281" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" -dependencies = [ - "libloading", -] - -[[package]] -name = "ash-window" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52bca67b61cb81e5553babde81b8211f713cb6db79766f80168f3e5f40ea6c82" -dependencies = [ - "ash", - "raw-window-handle", - "raw-window-metal", -] - -[[package]] -name = "ashpd" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f3f79755c74fd155000314eb349864caa787c6592eace6c6882dad873d9c39" -dependencies = [ - "async-fs", - "async-net", - "enumflags2", - "futures-channel", - "futures-util", - "rand 0.9.5", - "serde", - "serde_repr", - "url", - "wayland-backend", - "wayland-client", - "wayland-protocols 0.32.13", - "zbus", -] - -[[package]] -name = "ashpd" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33a3c86f3fd70c0ffa500ed189abfa90b5a52398a45d5dc372fcc38ebeb7a645" -dependencies = [ - "async-fs", - "async-net", - "enumflags2", - "futures-channel", - "futures-util", - "rand 0.9.5", - "serde", - "serde_repr", - "url", - "zbus", -] - -[[package]] -name = "async-broadcast" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" -dependencies = [ - "event-listener 5.4.2", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-channel" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" -dependencies = [ - "concurrent-queue", - "event-listener 2.5.3", - "futures-core", -] - -[[package]] -name = "async-channel" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" -dependencies = [ - "concurrent-queue", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-compression" -version = "0.4.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3976abdc8fe7d1133d43d304afd42abdf5bc3e1319d263d223bde07b5efc4be8" -dependencies = [ - "compression-codecs", - "compression-core", - "futures-io", - "pin-project-lite", -] - -[[package]] -name = "async-executor" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" -dependencies = [ - "async-task", - "concurrent-queue", - "fastrand 2.5.0", - "futures-lite 2.6.1", - "pin-project-lite", - "slab", -] - -[[package]] -name = "async-fs" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" -dependencies = [ - "async-lock", - "blocking", - "futures-lite 2.6.1", -] - -[[package]] -name = "async-global-executor" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" -dependencies = [ - "async-channel 2.5.0", - "async-executor", - "async-io", - "async-lock", - "blocking", - "futures-lite 2.6.1", - "once_cell", -] - -[[package]] -name = "async-io" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" -dependencies = [ - "autocfg", - "cfg-if", - "concurrent-queue", - "futures-io", - "futures-lite 2.6.1", - "parking", - "polling", - "rustix 1.1.4", - "slab", - "windows-sys 0.61.2", -] - -[[package]] -name = "async-lock" -version = "3.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" -dependencies = [ - "event-listener 5.4.2", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-net" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" -dependencies = [ - "async-io", - "blocking", - "futures-lite 2.6.1", -] - -[[package]] -name = "async-process" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" -dependencies = [ - "async-channel 2.5.0", - "async-io", - "async-lock", - "async-signal", - "async-task", - "blocking", - "cfg-if", - "event-listener 5.4.2", - "futures-lite 2.6.1", - "rustix 1.1.4", -] - -[[package]] -name = "async-recursion" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "async-signal" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" -dependencies = [ - "async-io", - "async-lock", - "atomic-waker", - "cfg-if", - "futures-core", - "futures-io", - "rustix 1.1.4", - "signal-hook-registry", - "slab", - "windows-sys 0.61.2", -] - -[[package]] -name = "async-std" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c8e079a4ab67ae52b7403632e4618815d6db36d2a010cfe41b02c1b1578f93b" -dependencies = [ - "async-channel 1.9.0", - "async-global-executor", - "async-io", - "async-lock", - "async-process", - "crossbeam-utils", - "futures-channel", - "futures-core", - "futures-io", - "futures-lite 2.6.1", - "gloo-timers", - "kv-log-macro", - "log", - "memchr", - "once_cell", - "pin-project-lite", - "pin-utils", - "slab", - "wasm-bindgen-futures", -] - -[[package]] -name = "async-task" -version = "4.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" - -[[package]] -name = "async-trait" -version = "0.1.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.4", -] - -[[package]] -name = "async_zip" -version = "0.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b9f7252833d5ed4b00aa9604b563529dd5e11de9c23615de2dcdf91eb87b52" -dependencies = [ - "async-compression", - "crc32fast", - "futures-lite 2.6.1", - "pin-project", - "thiserror 1.0.69", -] - -[[package]] -name = "atomic" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "autocfg" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" - -[[package]] -name = "av-scenechange" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394" -dependencies = [ - "aligned", - "anyhow", - "arg_enum_proc_macro", - "arrayvec", - "log", - "num-rational", - "num-traits", - "pastey", - "rayon", - "thiserror 2.0.20", - "v_frame", - "y4m", -] - -[[package]] -name = "av1-grain" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8" -dependencies = [ - "anyhow", - "arrayvec", - "log", - "nom 8.0.0", - "num-rational", - "v_frame", -] - -[[package]] -name = "avif-serialize" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7178fe5f7d460b13895ebb9dcb28a3a6216d2df2574a0806cb51b555d297f38" -dependencies = [ - "arrayvec", -] - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64" -version = "0.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" - -[[package]] -name = "bindgen" -version = "0.71.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" -dependencies = [ - "bitflags 2.13.1", - "cexpr", - "clang-sys", - "itertools 0.13.0", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash 2.1.3", - "shlex 1.3.0", - "syn 2.0.119", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" - -[[package]] -name = "bitstream-io" -version = "4.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eff00be299a18769011411c9def0d827e8f2d7bf0c3dbf53633147a8867fd1f" -dependencies = [ - "no_std_io2", -] - -[[package]] -name = "blade-graphics" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e71cfb73b98eb9f58ee84048aa1bdf4e7497fd20c141b57523499fa066b48fed" -dependencies = [ - "ash", - "ash-window", - "bitflags 2.13.1", - "bytemuck", - "codespan-reporting", - "glow", - "gpu-alloc", - "gpu-alloc-ash", - "hidden-trait", - "js-sys", - "khronos-egl", - "libloading", - "log", - "mint", - "naga", - "objc2", - "objc2-app-kit", - "objc2-core-foundation", - "objc2-foundation", - "objc2-metal", - "objc2-quartz-core", - "objc2-ui-kit", - "once_cell", - "raw-window-handle", - "slab", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "blade-macros" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27142319e2f4c264581067eaccb9f80acccdde60d8b4bf57cc50cd3152f109ca" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "blade-util" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a6be3a82c001ba7a17b6f8e413ede5d1004e6047213f8efaf0ffc15b5c4904c" -dependencies = [ - "blade-graphics", - "bytemuck", - "log", - "profiling", -] - -[[package]] -name = "block" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-buffer" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" -dependencies = [ - "hybrid-array", -] - -[[package]] -name = "block-padding" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block2" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" -dependencies = [ - "objc2", -] - -[[package]] -name = "blocking" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a70e4329df6cb94385eed412ec92375c3cdd8a6e502493d1229b6414e4036dfa" -dependencies = [ - "async-channel 2.5.0", - "async-task", - "futures-io", - "futures-lite 2.6.1", - "piper", -] - -[[package]] -name = "bstr" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bb31b46c14244e20ee9984b11bf5c992b91fb6939fea616e3512c8baecdbe5f" -dependencies = [ - "memchr", - "serde_core", -] - -[[package]] -name = "built" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c0e531d93d39c34eef561e929e8a7f86d77a5af08aac4f6d6e39976c51858e9" - -[[package]] -name = "bumpalo" -version = "3.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" - -[[package]] -name = "bytemuck" -version = "1.25.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0e56a716f1e132ff6bf4bdac1c944a3fcdc1cae65f70a4a2a1ac3b401d2d1f" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.4", -] - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "byteorder-lite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" - -[[package]] -name = "bytes" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" - -[[package]] -name = "calloop" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" -dependencies = [ - "bitflags 2.13.1", - "log", - "polling", - "rustix 0.38.44", - "slab", - "thiserror 1.0.69", -] - -[[package]] -name = "calloop-wayland-source" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" -dependencies = [ - "calloop", - "rustix 0.38.44", - "wayland-backend", - "wayland-client", -] - -[[package]] -name = "cbc" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" -dependencies = [ - "cipher", -] - -[[package]] -name = "cbindgen" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadd868a2ce9ca38de7eeafdcec9c7065ef89b42b32f0839278d55f35c54d1ff" -dependencies = [ - "heck 0.4.1", - "indexmap", - "log", - "proc-macro2", - "quote", - "serde", - "serde_json", - "syn 2.0.119", - "tempfile", - "toml 0.8.23", -] - -[[package]] -name = "cc" -version = "1.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad534f4357a5264cce5019c989cf66a4f0dc4e0d1b1d15f8aacec0ff7360273" -dependencies = [ - "find-msvc-tools", - "jobserver", - "libc", - "shlex 2.0.1", -] - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom 7.1.3", -] - -[[package]] -name = "cfg-if" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" - -[[package]] -name = "cfg_aliases" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" - -[[package]] -name = "cfg_aliases" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" - -[[package]] -name = "cgl" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" -dependencies = [ - "libc", -] - -[[package]] -name = "chacha20" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06" -dependencies = [ - "cfg-if", - "cpufeatures 0.3.1", - "rand_core 0.10.1", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common 0.1.7", - "inout", - "zeroize", -] - -[[package]] -name = "clang-sys" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "157a8ba7b480713b56f4c09fd13fc3e0a22a5dfab8097ba61cbc5feef950788a" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "cocoa" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6140449f97a6e97f9511815c5632d84c8aacf8ac271ad77c559218161a1373c" -dependencies = [ - "bitflags 1.3.2", - "block", - "cocoa-foundation 0.1.2", - "core-foundation 0.9.4", - "core-graphics 0.23.2", - "foreign-types", - "libc", - "objc", -] - -[[package]] -name = "cocoa" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79398230a6e2c08f5c9760610eb6924b52aa9e7950a619602baba59dcbbdbb2" -dependencies = [ - "bitflags 2.13.1", - "block", - "cocoa-foundation 0.2.0", - "core-foundation 0.10.0", - "core-graphics 0.24.0", - "foreign-types", - "libc", - "objc", -] - -[[package]] -name = "cocoa-foundation" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" -dependencies = [ - "bitflags 1.3.2", - "block", - "core-foundation 0.9.4", - "core-graphics-types 0.1.3", - "libc", - "objc", -] - -[[package]] -name = "cocoa-foundation" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14045fb83be07b5acf1c0884b2180461635b433455fa35d1cd6f17f1450679d" -dependencies = [ - "bitflags 2.13.1", - "block", - "core-foundation 0.10.0", - "core-graphics-types 0.2.0", - "libc", - "objc", -] - -[[package]] -name = "codespan-reporting" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" -dependencies = [ - "serde", - "termcolor", - "unicode-width", -] - -[[package]] -name = "color_quant" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" - -[[package]] -name = "command-fds" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b60b5124979fccd9addd89d8b97a1d6eebb4950694520c75ddd722535ea443f" -dependencies = [ - "nix 0.31.3", - "thiserror 2.0.20", -] - -[[package]] -name = "compression-codecs" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce2548391e9c1929c21bf6aa2680af86fe4c1b33e6cea9ac1cfeec0bd11218cf" -dependencies = [ - "compression-core", - "deflate64", - "flate2", - "memchr", -] - -[[package]] -name = "compression-core" -version = "0.4.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc14f565cf027a105f7a44ccf9e5b424348421a1d8952a8fc9d499d313107789" - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "const-oid" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" - -[[package]] -name = "const-random" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" -dependencies = [ - "const-random-macro", -] - -[[package]] -name = "const-random-macro" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" -dependencies = [ - "getrandom 0.2.17", - "once_cell", - "tiny-keccak", -] - -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[package]] -name = "cookie" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a373e3602691c3cdea496d2f0ee5935151e6168fe87739483c463db1b2f2f87" -dependencies = [ - "percent-encoding", - "time", - "version_check", -] - -[[package]] -name = "cookie_store" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15b2c103cf610ec6cae3da84a766285b42fd16aad564758459e6ecf128c75206" -dependencies = [ - "cookie", - "document-features", - "idna", - "indexmap", - "log", - "serde", - "serde_derive", - "serde_json", - "time", - "url", -] - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "core-graphics" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "core-graphics-types 0.1.3", - "foreign-types", - "libc", -] - -[[package]] -name = "core-graphics" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" -dependencies = [ - "bitflags 2.13.1", - "core-foundation 0.10.0", - "core-graphics-types 0.2.0", - "foreign-types", - "libc", -] - -[[package]] -name = "core-graphics-helmer-fork" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32eb7c354ae9f6d437a6039099ce7ecd049337a8109b23d73e48e8ffba8e9cd5" -dependencies = [ - "bitflags 2.13.1", - "core-foundation 0.9.4", - "core-graphics-types 0.1.3", - "foreign-types", - "libc", -] - -[[package]] -name = "core-graphics-types" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "libc", -] - -[[package]] -name = "core-graphics-types" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" -dependencies = [ - "bitflags 2.13.1", - "core-foundation 0.10.0", - "libc", -] - -[[package]] -name = "core-graphics2" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4583956b9806b69f73fcb23aee05eb3620efc282972f08f6a6db7504f8334d" -dependencies = [ - "bitflags 2.13.1", - "block", - "cfg-if", - "core-foundation 0.10.0", - "libc", -] - -[[package]] -name = "core-text" -version = "21.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a593227b66cbd4007b2a050dfdd9e1d1318311409c8d600dc82ba1b15ca9c130" -dependencies = [ - "core-foundation 0.10.0", - "core-graphics 0.24.0", - "foreign-types", - "libc", -] - -[[package]] -name = "core-video" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d45e71d5be22206bed53c3c3cb99315fc4c3d31b8963808c6bc4538168c4f8ef" -dependencies = [ - "block", - "core-foundation 0.10.0", - "core-graphics2", - "io-surface", - "libc", - "metal", -] - -[[package]] -name = "core_maths" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30" -dependencies = [ - "libm", -] - -[[package]] -name = "cosmic-text" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da46a9d5a8905cc538a4a5bceb6a4510de7a51049c5588c0114efce102bcbbe8" -dependencies = [ - "bitflags 2.13.1", - "fontdb 0.16.2", - "log", - "rangemap", - "rustc-hash 1.1.0", - "rustybuzz 0.14.1", - "self_cell", - "smol_str", - "swash", - "sys-locale", - "ttf-parser 0.21.1", - "unicode-bidi", - "unicode-linebreak", - "unicode-script", - "unicode-segmentation", -] - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "cpufeatures" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8498c871161e1742aaa9d52551b2d6ebdd4c3d45a3be423e3728f33b955be550" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-queue" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "803d13fb3b09d88be9f4dbc29062c66b19bf7170867ceb746d2a8689bf6c7a26" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" - -[[package]] -name = "crunchy" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" - -[[package]] -name = "crypto-common" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "typenum", -] - -[[package]] -name = "crypto-common" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" -dependencies = [ - "hybrid-array", -] - -[[package]] -name = "ctor" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec09e802f5081de6157da9a75701d6c713d8dc3ba52571fd4bd25f412644e8a6" -dependencies = [ - "ctor-proc-macro", - "dtor", -] - -[[package]] -name = "ctor-proc-macro" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2931af7e13dc045d8e9d26afccc6fa115d64e115c9c84b1166288b46f6782c2" - -[[package]] -name = "cursor-icon" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" - -[[package]] -name = "data-url" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" - -[[package]] -name = "deflate64" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac6b926516df9c60bfa16e107b21086399f8285a44ca9711344b9e553c5146e2" - -[[package]] -name = "deranged" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" - -[[package]] -name = "derive_more" -version = "0.99.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.119", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer 0.10.4", - "crypto-common 0.1.7", - "subtle", -] - -[[package]] -name = "digest" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" -dependencies = [ - "block-buffer 0.12.1", - "const-oid", - "crypto-common 0.2.2", -] - -[[package]] -name = "dirs" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" -dependencies = [ - "dirs-sys 0.3.7", -] - -[[package]] -name = "dirs" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" -dependencies = [ - "dirs-sys 0.4.1", -] - -[[package]] -name = "dirs-sys" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - -[[package]] -name = "dirs-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.48.0", -] - -[[package]] -name = "dispatch" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" - -[[package]] -name = "dispatch2" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" -dependencies = [ - "bitflags 2.13.1", - "objc2", -] - -[[package]] -name = "displaydoc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.4", -] - -[[package]] -name = "dlib" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a" -dependencies = [ - "libloading", -] - -[[package]] -name = "document-features" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" -dependencies = [ - "litrs", -] - -[[package]] -name = "downcast-rs" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" - -[[package]] -name = "dtor" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97cbdf2ad6846025e8e25df05171abfb30e3ababa12ee0a0e44b9bbe570633a8" -dependencies = [ - "dtor-proc-macro", -] - -[[package]] -name = "dtor-proc-macro" -version = "0.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7454e41ff9012c00d53cf7f475c5e3afa3b91b7c90568495495e8d9bf47a1055" - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "dwrote" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b35532432acc8b19ceed096e35dfa088d3ea037fe4f3c085f1f97f33b4d02" -dependencies = [ - "lazy_static", - "libc", - "winapi", - "wio", -] - -[[package]] -name = "dyn-clone" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" - -[[package]] -name = "either" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" - -[[package]] -name = "embed-resource" -version = "3.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbfdaacccebec3b28e4866b8973543c7647797db5ada1bdab552e48fe665fbbd" -dependencies = [ - "cc", - "memchr", - "rustc_version", - "toml 1.1.4+spec-1.1.0", - "vswhom", - "winreg 0.55.0", -] - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "endi" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" - -[[package]] -name = "enumflags2" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" -dependencies = [ - "enumflags2_derive", - "serde", -] - -[[package]] -name = "enumflags2_derive" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "equator" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" -dependencies = [ - "equator-macro", -] - -[[package]] -name = "equator-macro" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "erased-serde" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" -dependencies = [ - "serde", - "serde_core", - "typeid", -] - -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "etagere" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc89bf99e5dc15954a60f707c1e09d7540e5cd9af85fa75caa0b510bc08c5342" -dependencies = [ - "euclid", - "svg_fmt", -] - -[[package]] -name = "euclid" -version = "0.22.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a05365e3b1c6d1650318537c7460c6923f1abdd272ad6842baa2b509957a06" -dependencies = [ - "num-traits", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "event-listener" -version = "5.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" -dependencies = [ - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" -dependencies = [ - "event-listener 5.4.2", - "pin-project-lite", -] - -[[package]] -name = "exr" -version = "1.74.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711fe42c9964295e01ee3fba3f9fe0e1d24b98886950d68efe81b1c76e21adf3" -dependencies = [ - "bit_field", - "half", - "lebe", - "miniz_oxide 0.8.9", - "num-complex", - "pulp", - "rayon-core", - "smallvec", - "zune-inflate", -] - -[[package]] -name = "fallible-iterator" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" - -[[package]] -name = "fallible-streaming-iterator" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" - -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - -[[package]] -name = "fastrand" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" - -[[package]] -name = "fax" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf1079563223d5d59d83c85886a56e586cfd5c1a26292e971a0fa266531ac5a" - -[[package]] -name = "fdeflate" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "filedescriptor" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e40758ed24c9b2eeb76c35fb0aebc66c626084edd827e07e1552279814c6682d" -dependencies = [ - "libc", - "thiserror 1.0.69", - "winapi", -] - -[[package]] -name = "filetime" -version = "0.2.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759" -dependencies = [ - "cfg-if", - "libc", -] - -[[package]] -name = "find-msvc-tools" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" - -[[package]] -name = "flate2" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb" -dependencies = [ - "crc32fast", - "miniz_oxide 0.9.1", - "zlib-rs", -] - -[[package]] -name = "float-cmp" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" - -[[package]] -name = "float-ord" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce81f49ae8a0482e4c55ea62ebbd7e5a686af544c00b9d090bba3ff9be97b3d" - -[[package]] -name = "float_next_after" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf7cc16383c4b8d58b9905a8509f02926ce3058053c056376248d958c9df1e8" - -[[package]] -name = "flume" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" -dependencies = [ - "futures-core", - "futures-sink", - "nanorand", - "spin", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - -[[package]] -name = "font-types" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64eb721ca85a34323425f4041adc5d82704d3782d5f8f03793bc012419dce23" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "fontconfig-parser" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbc773e24e02d4ddd8395fd30dc147524273a83e54e0f312d986ea30de5f5646" -dependencies = [ - "roxmltree", -] - -[[package]] -name = "fontdb" -version = "0.16.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0299020c3ef3f60f526a4f64ab4a3d4ce116b1acbf24cdd22da0068e5d81dc3" -dependencies = [ - "fontconfig-parser", - "log", - "memmap2", - "slotmap", - "tinyvec", - "ttf-parser 0.20.0", -] - -[[package]] -name = "fontdb" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "457e789b3d1202543297a350643cf459f836cade38934e7a4cf6a39e7cde2905" -dependencies = [ - "fontconfig-parser", - "log", - "memmap2", - "slotmap", - "tinyvec", - "ttf-parser 0.25.1", -] - -[[package]] -name = "foreign-types" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" -dependencies = [ - "foreign-types-macros", - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-macros" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.4", -] - -[[package]] -name = "foreign-types-shared" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" - -[[package]] -name = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "freetype-sys" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7edc5b9669349acfda99533e9e0bcf26a51862ab43b08ee7745c55d28eb134" -dependencies = [ - "cc", - "libc", - "pkg-config", -] - -[[package]] -name = "futf" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" -dependencies = [ - "mac", - "new_debug_unreachable", -] - -[[package]] -name = "futures" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a31d2a3fbaaeb2af2368bbdd904aa8e812d3c04a1ee10d3171f52d556e5d0a3" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" - -[[package]] -name = "futures-executor" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" - -[[package]] -name = "futures-lite" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand 1.9.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] - -[[package]] -name = "futures-lite" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" -dependencies = [ - "fastrand 2.5.0", - "futures-core", - "futures-io", - "parking", - "pin-project-lite", -] - -[[package]] -name = "futures-macro" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.4", -] - -[[package]] -name = "futures-sink" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" - -[[package]] -name = "futures-task" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" - -[[package]] -name = "futures-util" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "gethostname" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" -dependencies = [ - "rustix 1.1.4", - "windows-link 0.2.1", -] - -[[package]] -name = "getrandom" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "libc", - "r-efi 5.3.0", - "wasip2", -] - -[[package]] -name = "getrandom" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "r-efi 6.0.0", - "rand_core 0.10.1", - "wasm-bindgen", -] - -[[package]] -name = "gif" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159" -dependencies = [ - "color_quant", - "weezl", -] - -[[package]] -name = "glob" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" - -[[package]] -name = "globset" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07c34a9410465b45bd9787443bc7370f37735bad04b0f0cd57ff1a3186c98988" -dependencies = [ - "aho-corasick", - "bstr", - "log", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "gloo-timers" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "glow" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" -dependencies = [ - "js-sys", - "slotmap", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "gpu-alloc" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45cf04b2726f02df5508c6de726acdc90cdf97ac771a9a0ffd8ba10a6e696bf9" -dependencies = [ - "bitflags 2.13.1", - "gpu-alloc-types", -] - -[[package]] -name = "gpu-alloc-ash" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643756f08ef6def813c776199e4766596395a4c6530373c9a4374a64de2f53a1" -dependencies = [ - "ash", - "gpu-alloc-types", - "tinyvec", -] - -[[package]] -name = "gpu-alloc-types" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2bbed164dd10ed526c2e4fe3e721ca4a71c61730e5aafac6844b417b3227058" -dependencies = [ - "bitflags 2.13.1", -] - -[[package]] -name = "gpui" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "979b45cfa6ec723b6f42330915a1b3769b930d02b2d505f9697f8ca602bee707" -dependencies = [ - "anyhow", - "as-raw-xcb-connection", - "ashpd 0.11.1", - "async-task", - "bindgen", - "blade-graphics", - "blade-macros", - "blade-util", - "block", - "bytemuck", - "calloop", - "calloop-wayland-source", - "cbindgen", - "cocoa 0.26.0", - "cocoa-foundation 0.2.0", - "core-foundation 0.10.0", - "core-foundation-sys", - "core-graphics 0.24.0", - "core-text", - "core-video", - "cosmic-text", - "ctor", - "derive_more", - "embed-resource", - "etagere", - "filedescriptor", - "flume", - "foreign-types", - "futures", - "gpui-macros", - "gpui_collections", - "gpui_http_client", - "gpui_media", - "gpui_refineable", - "gpui_semantic_version", - "gpui_sum_tree", - "gpui_util", - "gpui_util_macros", - "image", - "inventory", - "itertools 0.14.0", - "libc", - "log", - "lyon", - "metal", - "naga", - "num_cpus", - "objc", - "oo7", - "open", - "parking", - "parking_lot", - "pathfinder_geometry", - "pin-project", - "postage", - "profiling", - "rand 0.9.5", - "raw-window-handle", - "resvg", - "schemars", - "seahash", - "serde", - "serde_json", - "slotmap", - "smallvec", - "smol", - "stacksafe", - "strum 0.27.2", - "taffy", - "thiserror 2.0.20", - "usvg", - "uuid", - "waker-fn", - "wayland-backend", - "wayland-client", - "wayland-cursor", - "wayland-protocols 0.31.2", - "wayland-protocols-plasma", - "windows 0.61.3", - "windows-core 0.61.2", - "windows-numerics", - "windows-registry 0.5.3", - "x11-clipboard", - "x11rb", - "xkbcommon", - "zed-font-kit", - "zed-scap", - "zed-xim", -] - -[[package]] -name = "gpui-macros" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcb02dd63a2859714ac7b6b476937617c3c744157af1b49f7c904023a79039be" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "gpui_collections" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae39dc6d3d201be97e4bc08d96dbef2bc5b5c3d5734e05786e8cc3043342351c" -dependencies = [ - "indexmap", - "rustc-hash 2.1.3", -] - -[[package]] -name = "gpui_derive_refineable" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644de174341a87b3478bd65b66bca38af868bcf2b2e865700523734f83cfc664" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "gpui_http_client" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23822b0a6d2c5e6a42507980a0ab3848610ea908942c8ef98187f646f690335e" -dependencies = [ - "anyhow", - "async-compression", - "async-fs", - "bytes", - "derive_more", - "futures", - "gpui_util", - "http", - "http-body", - "log", - "parking_lot", - "serde", - "serde_json", - "sha2 0.10.9", - "tempfile", - "url", - "zed-async-tar", - "zed-reqwest", -] - -[[package]] -name = "gpui_media" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05cb8912ae17371725132d2b7eec6797a255accc95d58ee5c1134b529810f14b" -dependencies = [ - "anyhow", - "bindgen", - "core-foundation 0.10.0", - "core-video", - "ctor", - "foreign-types", - "metal", - "objc", -] - -[[package]] -name = "gpui_perf" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40a0961dcf598955130e867f4b731150a20546427b41b1a63767c1037a86d77" -dependencies = [ - "gpui_collections", - "serde", - "serde_json", -] - -[[package]] -name = "gpui_refineable" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "258cb099254e9468181aee5614410fba61db4ae115fc1d51b4a0b985f60d6641" -dependencies = [ - "gpui_derive_refineable", -] - -[[package]] -name = "gpui_semantic_version" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "201e45eff7b695528fb3af6560a534943fbc2db5323d755b9d198bd743948e35" -dependencies = [ - "anyhow", - "serde", -] - -[[package]] -name = "gpui_sum_tree" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4f3bedd573fafafa13d1200b356c588cf094fb2786e3684bb3f5ea59b549fa9" -dependencies = [ - "arrayvec", - "log", - "rayon", -] - -[[package]] -name = "gpui_util" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68faea25903ae524de9af83990b9aa51bcbc8dd085929ac0aea7fd41905e05c3" -dependencies = [ - "anyhow", - "async-fs", - "async_zip", - "command-fds", - "dirs 4.0.0", - "dunce", - "futures", - "futures-lite 1.13.0", - "globset", - "gpui_collections", - "itertools 0.14.0", - "libc", - "log", - "nix 0.29.0", - "regex", - "rust-embed", - "schemars", - "serde", - "serde_json", - "serde_json_lenient", - "shlex 1.3.0", - "smol", - "take-until", - "tempfile", - "tendril", - "unicase", - "walkdir", - "which", -] - -[[package]] -name = "gpui_util_macros" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c28f65ef47fb97e21e82fd4dd75ccc2506eda010c846dc8054015ea234f1a22" -dependencies = [ - "gpui_perf", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "grid" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12101ecc8225ea6d675bc70263074eab6169079621c2186fe0c66590b2df9681" - -[[package]] -name = "h2" -version = "0.4.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8e5e5a340588f4452631496976cf8636d4a7ecf600239fdc27615d2530bc16" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "half" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" -dependencies = [ - "cfg-if", - "crunchy", - "num-traits", - "zerocopy", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - -[[package]] -name = "hashbrown" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" -dependencies = [ - "foldhash", -] - -[[package]] -name = "hashbrown" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17592d60ebacc7d5e169f4663c5f84f9161cc90328abcfe8456f41e4dfcb284" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hexf-parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" - -[[package]] -name = "hidden-trait" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ed9e850438ac849bec07e7d09fbe9309cbd396a5988c30b010580ce08860df" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "hkdf" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" -dependencies = [ - "hmac", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "home" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "http" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" -dependencies = [ - "bytes", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "hybrid-array" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" -dependencies = [ - "typenum", -] - -[[package]] -name = "hyper" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b501faa50e7a26c3d3560ca625132f4078a17771f4810baf70475ae48cbe43" -dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "h2", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" -dependencies = [ - "http", - "hyper", - "hyper-util", - "rustls", - "rustls-native-certs", - "tokio", - "tokio-rustls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "libc", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "icu_collections" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513" -dependencies = [ - "displaydoc", - "potential_utf", - "utf8_iter", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0" - -[[package]] -name = "icu_properties" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa" - -[[package]] -name = "icu_provider" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "idna" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "image" -version = "0.25.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" -dependencies = [ - "bytemuck", - "byteorder-lite", - "color_quant", - "exr", - "gif", - "image-webp", - "moxcms", - "num-traits", - "png 0.18.1", - "qoi", - "ravif", - "rayon", - "rgb", - "tiff", - "zune-core", - "zune-jpeg", -] - -[[package]] -name = "image-webp" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" -dependencies = [ - "byteorder-lite", - "quick-error", -] - -[[package]] -name = "imagesize" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" - -[[package]] -name = "imgref" -version = "1.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e44b0a4eaa4c82f441d50a963f2d5f05a787240aeee097597033e72accfd22f" - -[[package]] -name = "indexmap" -version = "2.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07aa2048142242915a31d35844fb311e0e53fcca590c3a0a40dcf1b841fa09eb" -dependencies = [ - "equivalent", - "hashbrown 0.17.1", - "serde", - "serde_core", -] - -[[package]] -name = "inout" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" -dependencies = [ - "block-padding", - "generic-array", -] - -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "interpolate_name" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "inventory" -version = "0.3.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b" -dependencies = [ - "rustversion", -] - -[[package]] -name = "io-surface" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "554b8c5d64ec09a3a520fe58e4d48a73e00ff32899cdcbe32a4877afd4968b8e" -dependencies = [ - "cgl", - "core-foundation 0.10.0", - "core-foundation-sys", - "leaky-cow", -] - -[[package]] -name = "ipnet" -version = "2.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a756c3fac73139e83f14c2d742155dd2b78d3ee56597b419a0579b7bdd6dd78" - -[[package]] -name = "is-docker" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" -dependencies = [ - "once_cell", -] - -[[package]] -name = "is-wsl" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" -dependencies = [ - "is-docker", - "once_cell", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" - -[[package]] -name = "jobserver" -version = "0.1.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" -dependencies = [ - "getrandom 0.4.3", - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" -dependencies = [ - "cfg-if", - "futures-util", - "wasm-bindgen", -] - -[[package]] -name = "khronos-egl" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" -dependencies = [ - "libc", - "libloading", -] - -[[package]] -name = "kurbo" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62026ae44756f8a599ba21140f350303d4f08dcdcc71b5ad9c9bb8128c13c62" -dependencies = [ - "arrayvec", - "euclid", - "smallvec", -] - -[[package]] -name = "kv-log-macro" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" -dependencies = [ - "log", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin", -] - -[[package]] -name = "leak" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd100e01f1154f2908dfa7d02219aeab25d0b9c7fa955164192e3245255a0c73" - -[[package]] -name = "leaky-cow" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a8225d44241fd324a8af2806ba635fc7c8a7e9a7de4d5cf3ef54e71f5926fc" -dependencies = [ - "leak", -] - -[[package]] -name = "lebe" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" - -[[package]] -name = "libc" -version = "0.2.189" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" - -[[package]] -name = "libfuzzer-sys" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9fd2f41a1cba099f79a0b6b6c35656cf7c03351a7bae8ff0f28f25270f929d2" -dependencies = [ - "arbitrary", - "cc", -] - -[[package]] -name = "libloading" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" -dependencies = [ - "cfg-if", - "windows-link 0.2.1", -] - -[[package]] -name = "libm" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" - -[[package]] -name = "libredox" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7955dfc218a8afb29dfeffd540e3a6e96baeb94fe7138228dd7cc6937fbbf96" -dependencies = [ - "libc", -] - -[[package]] -name = "libsqlite3-sys" -version = "0.38.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1d20bef17f513b9b3004532233187769cd072d790971f4e4da0e346eb6401e8" -dependencies = [ - "cc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - -[[package]] -name = "linux-raw-sys" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" - -[[package]] -name = "litemap" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" - -[[package]] -name = "litrs" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" - -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" -dependencies = [ - "serde_core", - "value-bag", -] - -[[package]] -name = "loop9" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" -dependencies = [ - "imgref", -] - -[[package]] -name = "lru-slab" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" - -[[package]] -name = "lumbridge-core" -version = "0.0.1" -dependencies = [ - "thiserror 2.0.20", -] - -[[package]] -name = "lumbridge-harness" -version = "0.0.1" -dependencies = [ - "lumbridge-core", - "nix 0.28.0", - "serde", - "serde_json", - "thiserror 2.0.20", - "ureq", -] - -[[package]] -name = "lumbridge-pty" -version = "0.0.1" -dependencies = [ - "nix 0.28.0", - "portable-pty", - "thiserror 2.0.20", -] - -[[package]] -name = "lumbridge-runtime" -version = "0.0.1" -dependencies = [ - "lumbridge-pty", - "thiserror 2.0.20", -] - -[[package]] -name = "lumbridge-spike-gpui" -version = "0.0.1" -dependencies = [ - "gpui", - "lumbridge-core", - "lumbridge-harness", - "lumbridge-runtime", - "lumbridge-spike-model", - "lumbridge-storage", - "lumbridge-terminal", - "serde", - "serde_json", -] - -[[package]] -name = "lumbridge-spike-model" -version = "0.0.1" - -[[package]] -name = "lumbridge-storage" -version = "0.0.1" -dependencies = [ - "lumbridge-core", - "rusqlite", -] - -[[package]] -name = "lumbridge-terminal" -version = "0.0.1" -dependencies = [ - "alacritty_terminal", - "thiserror 2.0.20", -] - -[[package]] -name = "lyon" -version = "1.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0578bdecb7d6d88987b8b2b1e3a4e2f81df9d0ece1078623324a567904e7b7" -dependencies = [ - "lyon_algorithms", - "lyon_tessellation", -] - -[[package]] -name = "lyon_algorithms" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdfa8785f95e57914ddb35e3b59994aeba6f5e79e9cfd03da1c269f010f36009" -dependencies = [ - "lyon_path", - "num-traits", -] - -[[package]] -name = "lyon_geom" -version = "1.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4336502e29e32af93cf2dad2214ed6003c17ceb5bd499df77b1de663b9042b92" -dependencies = [ - "arrayvec", - "euclid", - "num-traits", -] - -[[package]] -name = "lyon_path" -version = "1.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c463f9c428b7fc5ec885dcd39ce4aa61e29111d0e33483f6f98c74e89d8621e" -dependencies = [ - "lyon_geom", - "num-traits", -] - -[[package]] -name = "lyon_tessellation" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dabea159dc6eea9171a541b458134b70ca95e3162d068132b2b3b9bc01aad06e" -dependencies = [ - "float_next_after", - "lyon_path", - "num-traits", -] - -[[package]] -name = "mac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" - -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -dependencies = [ - "libc", -] - -[[package]] -name = "maybe-rayon" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" -dependencies = [ - "cfg-if", - "rayon", -] - -[[package]] -name = "md-5" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" -dependencies = [ - "cfg-if", - "digest 0.10.7", -] - -[[package]] -name = "memchr" -version = "2.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" - -[[package]] -name = "memmap2" -version = "0.9.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0" -dependencies = [ - "libc", -] - -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg", -] - -[[package]] -name = "metal" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" -dependencies = [ - "bitflags 2.13.1", - "block", - "core-graphics-types 0.1.3", - "foreign-types", - "log", - "objc", - "paste", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime_guess" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" -dependencies = [ - "mime", - "unicase", -] - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", - "simd-adler32", -] - -[[package]] -name = "miniz_oxide" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" -dependencies = [ - "adler2", - "simd-adler32", -] - -[[package]] -name = "mint" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e53debba6bda7a793e5f99b8dacf19e626084f525f7829104ba9898f367d85ff" - -[[package]] -name = "mio" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.61.2", -] - -[[package]] -name = "miow" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "536bfad37a309d62069485248eeaba1e8d9853aaf951caaeaed0585a95346f08" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "moxcms" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" -dependencies = [ - "num-traits", - "pxfm", -] - -[[package]] -name = "naga" -version = "25.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b977c445f26e49757f9aca3631c3b8b836942cb278d69a92e7b80d3b24da632" -dependencies = [ - "arrayvec", - "bit-set", - "bitflags 2.13.1", - "cfg_aliases 0.2.2", - "codespan-reporting", - "half", - "hashbrown 0.15.5", - "hexf-parse", - "indexmap", - "log", - "num-traits", - "once_cell", - "rustc-hash 1.1.0", - "spirv", - "strum 0.26.3", - "thiserror 2.0.20", - "unicode-ident", -] - -[[package]] -name = "nanorand" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" -dependencies = [ - "getrandom 0.2.17", -] - -[[package]] -name = "new_debug_unreachable" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" - -[[package]] -name = "nix" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" -dependencies = [ - "bitflags 2.13.1", - "cfg-if", - "cfg_aliases 0.1.1", - "libc", -] - -[[package]] -name = "nix" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" -dependencies = [ - "bitflags 2.13.1", - "cfg-if", - "cfg_aliases 0.2.2", - "libc", -] - -[[package]] -name = "nix" -version = "0.31.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" -dependencies = [ - "bitflags 2.13.1", - "cfg-if", - "cfg_aliases 0.2.2", - "libc", -] - -[[package]] -name = "no_std_io2" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418abd1b6d34fbf6cae440dc874771b0525a604428704c76e48b29a5e67b8003" -dependencies = [ - "memchr", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "nom" -version = "8.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" -dependencies = [ - "memchr", -] - -[[package]] -name = "noop_proc_macro" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" - -[[package]] -name = "ntapi" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3b335231dfd352ffb0f8017f3b6027a4917f7df785ea2143d8af2adc66980ae" -dependencies = [ - "winapi", -] - -[[package]] -name = "num" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" -dependencies = [ - "num-bigint", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-bigint-dig" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" -dependencies = [ - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand 0.8.8", - "serde", - "smallvec", - "zeroize", -] - -[[package]] -name = "num-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "bytemuck", - "num-traits", -] - -[[package]] -name = "num-conv" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" - -[[package]] -name = "num-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "num-integer" -version = "0.1.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" -dependencies = [ - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", - "objc_exception", -] - -[[package]] -name = "objc-foundation" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" -dependencies = [ - "block", - "objc", - "objc_id", -] - -[[package]] -name = "objc2" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" -dependencies = [ - "objc2-encode", -] - -[[package]] -name = "objc2-app-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" -dependencies = [ - "bitflags 2.13.1", - "objc2", - "objc2-core-foundation", - "objc2-foundation", - "objc2-quartz-core", -] - -[[package]] -name = "objc2-core-foundation" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" -dependencies = [ - "bitflags 2.13.1", - "dispatch2", - "objc2", -] - -[[package]] -name = "objc2-encode" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" - -[[package]] -name = "objc2-foundation" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" -dependencies = [ - "bitflags 2.13.1", - "objc2", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-metal" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0125f776a10d00af4152d74616409f0d4a2053a6f57fa5b7d6aa2854ac04794" -dependencies = [ - "bitflags 2.13.1", - "block2", - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-quartz-core" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" -dependencies = [ - "bitflags 2.13.1", - "objc2", - "objc2-core-foundation", - "objc2-foundation", - "objc2-metal", -] - -[[package]] -name = "objc2-ui-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" -dependencies = [ - "bitflags 2.13.1", - "objc2", - "objc2-core-foundation", - "objc2-foundation", - "objc2-quartz-core", -] - -[[package]] -name = "objc_exception" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" -dependencies = [ - "cc", -] - -[[package]] -name = "objc_id" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" -dependencies = [ - "objc", -] - -[[package]] -name = "object" -version = "0.39.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e5a6c098c7a3b6547378093f5cc30bc54fd361ce711e05293a5cc589562739b" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" - -[[package]] -name = "oo7" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3299dd401feaf1d45afd8fd1c0586f10fcfb22f244bb9afa942cec73503b89d" -dependencies = [ - "aes", - "ashpd 0.12.3", - "async-fs", - "async-io", - "async-lock", - "blocking", - "cbc", - "cipher", - "digest 0.10.7", - "endi", - "futures-lite 2.6.1", - "futures-util", - "getrandom 0.3.4", - "hkdf", - "hmac", - "md-5", - "num", - "num-bigint-dig", - "pbkdf2", - "rand 0.9.5", - "serde", - "sha2 0.10.9", - "subtle", - "zbus", - "zbus_macros", - "zeroize", - "zvariant", -] - -[[package]] -name = "open" -version = "5.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade3be4664bc1ef537ce133015f04c176b737815c2ba9fd60edf212d6e90dd55" -dependencies = [ - "is-wsl", - "libc", -] - -[[package]] -name = "openssl-probe" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "ordered-stream" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" -dependencies = [ - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - -[[package]] -name = "parking_lot" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.5.18", - "smallvec", - "windows-link 0.2.1", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pastey" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" - -[[package]] -name = "pathfinder_geometry" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b7e7b4ea703700ce73ebf128e1450eb69c3a8329199ffbfb9b2a0418e5ad3" -dependencies = [ - "log", - "pathfinder_simd", -] - -[[package]] -name = "pathfinder_simd" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4500030c302e4af1d423f36f3b958d1aecb6c04184356ed5a833bf6b60435777" -dependencies = [ - "rustc_version", -] - -[[package]] -name = "pbkdf2" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" -dependencies = [ - "digest 0.10.7", - "hmac", -] - -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "pico-args" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" - -[[package]] -name = "pin-project" -version = "1.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "piper" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" -dependencies = [ - "atomic-waker", - "fastrand 2.5.0", - "futures-io", -] - -[[package]] -name = "pkg-config" -version = "0.3.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" - -[[package]] -name = "png" -version = "0.17.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" -dependencies = [ - "bitflags 1.3.2", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide 0.8.9", -] - -[[package]] -name = "png" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" -dependencies = [ - "bitflags 2.13.1", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide 0.8.9", -] - -[[package]] -name = "polling" -version = "3.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" -dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi", - "pin-project-lite", - "rustix 1.1.4", - "windows-sys 0.61.2", -] - -[[package]] -name = "pollster" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5da3b0203fd7ee5720aa0b5e790b591aa5d3f41c3ed2c34a3a393382198af2f7" - -[[package]] -name = "portable-pty" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4a596a2b3d2752d94f51fac2d4a96737b8705dddd311a32b9af47211f08671e" -dependencies = [ - "anyhow", - "bitflags 1.3.2", - "downcast-rs", - "filedescriptor", - "lazy_static", - "libc", - "log", - "nix 0.28.0", - "serial2", - "shared_library", - "shell-words", - "winapi", - "winreg 0.10.1", -] - -[[package]] -name = "postage" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af3fb618632874fb76937c2361a7f22afd393c982a2165595407edc75b06d3c1" -dependencies = [ - "atomic", - "crossbeam-queue", - "futures", - "log", - "parking_lot", - "pin-project", - "pollster", - "static_assertions", - "thiserror 1.0.69", -] - -[[package]] -name = "potential_utf" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" -dependencies = [ - "zerovec", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "prettyplease" -version = "0.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" -dependencies = [ - "proc-macro2", - "syn 2.0.119", -] - -[[package]] -name = "proc-macro-crate" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" -dependencies = [ - "toml_edit 0.25.13+spec-1.1.0", -] - -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "proc-macro2" -version = "1.0.107" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "profiling" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" -dependencies = [ - "profiling-procmacros", -] - -[[package]] -name = "profiling-procmacros" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4488a4a36b9a4ba6b9334a32a39971f77c1436ec82c38707bce707699cc3bbcb" -dependencies = [ - "quote", - "syn 2.0.119", -] - -[[package]] -name = "psm" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd034599e63b970727f70d79e02d62390a4a84f7c6b827c27c46d5ac3fa622" -dependencies = [ - "ar_archive_writer", - "cc", -] - -[[package]] -name = "pulp" -version = "0.22.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046aa45b989642ec2e4717c8e72d677b13edd831a4d3b6cf37d9a3e54912496a" -dependencies = [ - "bytemuck", - "cfg-if", - "libm", - "num-complex", - "paste", - "pulp-wasm-simd-flag", - "raw-cpuid", - "reborrow", - "version_check", -] - -[[package]] -name = "pulp-wasm-simd-flag" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d8f70e07b9c3962945a74e59ca1c511bba65b6419468acc217c457d93f3c740" - -[[package]] -name = "pxfm" -version = "0.1.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea" - -[[package]] -name = "qoi" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "quick-error" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" - -[[package]] -name = "quick-xml" -version = "0.41.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1" -dependencies = [ - "memchr", -] - -[[package]] -name = "quinn" -version = "0.11.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" -dependencies = [ - "bytes", - "cfg_aliases 0.2.2", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash 2.1.3", - "rustls", - "socket2", - "thiserror 2.0.20", - "tokio", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-proto" -version = "0.11.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04759210543be93709136e28212294a659ef5001836ff4eab4d663e4529bba83" -dependencies = [ - "bytes", - "getrandom 0.4.3", - "lru-slab", - "rand 0.10.2", - "rand_pcg", - "ring", - "rustc-hash 2.1.3", - "rustls", - "rustls-pki-types", - "slab", - "thiserror 2.0.20", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" -dependencies = [ - "cfg_aliases 0.2.2", - "libc", - "once_cell", - "socket2", - "tracing", - "windows-sys 0.61.2", -] - -[[package]] -name = "quote" -version = "1.0.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - -[[package]] -name = "r-efi" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" - -[[package]] -name = "rand" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e058c7de0b26af77780c769414d6257830bb240f3c38477dbc2c16e5f54d6d4c" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.5", -] - -[[package]] -name = "rand" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" -dependencies = [ - "chacha20", - "getrandom 0.4.3", - "rand_core 0.10.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.5", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.17", -] - -[[package]] -name = "rand_core" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" -dependencies = [ - "getrandom 0.3.4", -] - -[[package]] -name = "rand_core" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" - -[[package]] -name = "rand_pcg" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" -dependencies = [ - "rand_core 0.10.1", -] - -[[package]] -name = "rangemap" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a611d15b50743feb4c76b7d03edcb0e64f399c26961e4efe6975bc398be6aa3d" - -[[package]] -name = "rav1e" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" -dependencies = [ - "aligned-vec", - "arbitrary", - "arg_enum_proc_macro", - "arrayvec", - "av-scenechange", - "av1-grain", - "bitstream-io", - "built", - "cfg-if", - "interpolate_name", - "itertools 0.14.0", - "libc", - "libfuzzer-sys", - "log", - "maybe-rayon", - "new_debug_unreachable", - "noop_proc_macro", - "num-derive", - "num-traits", - "paste", - "profiling", - "rand 0.9.5", - "rand_chacha 0.9.0", - "simd_helpers", - "thiserror 2.0.20", - "v_frame", - "wasm-bindgen", -] - -[[package]] -name = "ravif" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e52310197d971b0f5be7fe6b57530dcd27beb35c1b013f29d66c1ad73fbbcc45" -dependencies = [ - "avif-serialize", - "imgref", - "loop9", - "quick-error", - "rav1e", - "rayon", - "rgb", -] - -[[package]] -name = "raw-cpuid" -version = "11.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" -dependencies = [ - "bitflags 2.13.1", -] - -[[package]] -name = "raw-window-handle" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" - -[[package]] -name = "raw-window-metal" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76e8caa82e31bb98fee12fa8f051c94a6aa36b07cddb03f0d4fc558988360ff1" -dependencies = [ - "cocoa 0.25.0", - "core-graphics 0.23.2", - "objc", - "raw-window-handle", -] - -[[package]] -name = "rayon" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "read-fonts" -version = "0.41.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046a7d674daf459825b32f5062056d6882db0d2f5a479fbd76ccfc870ac18709" -dependencies = [ - "bytemuck", - "font-types", - "once_cell", -] - -[[package]] -name = "reborrow" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" - -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags 2.13.1", -] - -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom 0.2.17", - "libredox", - "thiserror 1.0.69", -] - -[[package]] -name = "ref-cast" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e440fb4e4b4147295338efb76001ab9e4efc0e5839df2c47fc5ac2381d365c3" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecd8964f8453721699a1ed72037b0db49ce2f5a5138486ee89bed6f67cdf3a" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.4", -] - -[[package]] -name = "regex" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" - -[[package]] -name = "resvg" -version = "0.45.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8928798c0a55e03c9ca6c4c6846f76377427d2c1e1f7e6de3c06ae57942df43" -dependencies = [ - "log", - "pico-args", - "rgb", - "svgtypes", - "tiny-skia", - "usvg", -] - -[[package]] -name = "rgb" -version = "0.8.53" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.17", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "roxmltree" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" - -[[package]] -name = "rusqlite" -version = "0.40.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23f2a97da3e3873c73cb2a2e71b35c40ff95e0b1eefa8d72d8499a6928c3b5b3" -dependencies = [ - "bitflags 2.13.1", - "fallible-iterator", - "fallible-streaming-iterator", - "libsqlite3-sys", - "smallvec", -] - -[[package]] -name = "rust-embed" -version = "8.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9e7760e252aaba7b09f4be00e36476cf585bdb68a53552ac954cdf504ab4bc9" -dependencies = [ - "rust-embed-impl", - "rust-embed-utils", - "walkdir", -] - -[[package]] -name = "rust-embed-impl" -version = "8.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bcfc4d6f53af43755f7a723e4b6b8794fcce052a178dd8c6c1dadc5f5343097" -dependencies = [ - "mime_guess", - "proc-macro2", - "quote", - "rust-embed-utils", - "syn 2.0.119", - "walkdir", -] - -[[package]] -name = "rust-embed-utils" -version = "8.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ffa149f6aa81b58a5b3011d01a857c4ed12c7a732d2c51947a4c7c692185f0" -dependencies = [ - "globset", - "sha2 0.11.0", - "walkdir", -] - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc-hash" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags 2.13.1", - "errno", - "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustix" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" -dependencies = [ - "bitflags 2.13.1", - "errno", - "libc", - "linux-raw-sys 0.12.1", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustix-openpty" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1de16c7c59892b870a6336f185dc10943517f1327447096bbb7bb32cd85e2393" -dependencies = [ - "errno", - "libc", - "rustix 1.1.4", -] - -[[package]] -name = "rustls" -version = "0.23.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" -dependencies = [ - "log", - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" -dependencies = [ - "openssl-probe", - "rustls-pki-types", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" -dependencies = [ - "web-time", - "zeroize", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" - -[[package]] -name = "rustybuzz" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfb9cf8877777222e4a3bc7eb247e398b56baba500c38c1c46842431adc8b55c" -dependencies = [ - "bitflags 2.13.1", - "bytemuck", - "libm", - "smallvec", - "ttf-parser 0.21.1", - "unicode-bidi-mirroring 0.2.0", - "unicode-ccc 0.2.0", - "unicode-properties", - "unicode-script", -] - -[[package]] -name = "rustybuzz" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702" -dependencies = [ - "bitflags 2.13.1", - "bytemuck", - "core_maths", - "log", - "smallvec", - "ttf-parser 0.25.1", - "unicode-bidi-mirroring 0.4.0", - "unicode-ccc 0.4.0", - "unicode-properties", - "unicode-script", -] - -[[package]] -name = "ryu" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schannel" -version = "0.1.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "schemars" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a" -dependencies = [ - "dyn-clone", - "indexmap", - "ref-cast", - "schemars_derive", - "serde", - "serde_json", -] - -[[package]] -name = "schemars_derive" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98c67716b46af2f0b8cf752abc930f6f9aecfbf671ecfb531db8a31dbe4e2ba" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals", - "syn 3.0.4", -] - -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "screencapturekit" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5eeeb57ac94960cfe5ff4c402be6585ae4c8d29a2cf41b276048c2e849d64e" -dependencies = [ - "screencapturekit-sys", -] - -[[package]] -name = "screencapturekit-sys" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22411b57f7d49e7fe08025198813ee6fd65e1ee5eff4ebc7880c12c82bde4c60" -dependencies = [ - "block", - "dispatch", - "objc", - "objc-foundation", - "objc_id", - "once_cell", -] - -[[package]] -name = "seahash" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" - -[[package]] -name = "security-framework" -version = "3.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" -dependencies = [ - "bitflags 2.13.1", - "core-foundation 0.10.0", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "self_cell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab42ca02749e120097e328d91d415325bdf43b1c72c4c8badf37375fe40a813" - -[[package]] -name = "semver" -version = "1.0.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" - -[[package]] -name = "serde" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde_core" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.229" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.4", -] - -[[package]] -name = "serde_derive_internals" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f852137cce035d6a4df67ccce505ff6b3e9fd3a10e3e52b24dc71e650bb1a9bd" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.4", -] - -[[package]] -name = "serde_fmt" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e497af288b3b95d067a23a4f749f2861121ffcb2f6d8379310dcda040c345ed" -dependencies = [ - "serde_core", -] - -[[package]] -name = "serde_json" -version = "1.0.151" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" -dependencies = [ - "indexmap", - "itoa", - "memchr", - "serde", - "serde_core", - "zmij", -] - -[[package]] -name = "serde_json_lenient" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e033097bf0d2b59a62b42c18ebbb797503839b26afdda2c4e1415cb6c813540" -dependencies = [ - "indexmap", - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "serde_repr" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.4", -] - -[[package]] -name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_spanned" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" -dependencies = [ - "serde_core", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serial2" -version = "0.2.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16809bc35793b19ce4e0c53924bc0dce3937f15487997cfdaed936004180730" -dependencies = [ - "cfg-if", - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "sha1_smol" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "digest 0.10.7", -] - -[[package]] -name = "sha2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" -dependencies = [ - "cfg-if", - "cpufeatures 0.3.1", - "digest 0.11.3", -] - -[[package]] -name = "shared_library" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9e7e0f2bfae24d8a5b5a66c5b257a83c7412304311512a0c054cd5e619da11" -dependencies = [ - "lazy_static", - "libc", -] - -[[package]] -name = "shell-words" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "shlex" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" - -[[package]] -name = "signal-hook" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a0c28ca5908dbdbcd52e6fdaa00358ab88637f8ab33e1f188dd510eb44b53d" -dependencies = [ - "libc", - "signal-hook-registry", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" -dependencies = [ - "errno", - "libc", -] - -[[package]] -name = "simd-adler32" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" - -[[package]] -name = "simd_helpers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" -dependencies = [ - "quote", -] - -[[package]] -name = "simplecss" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9c6883ca9c3c7c90e888de77b7a5c849c779d25d74a1269b0218b14e8b136c" -dependencies = [ - "log", -] - -[[package]] -name = "siphasher" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" - -[[package]] -name = "skrifa" -version = "0.44.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819ab7d62b1d3e72d9d9dea5650bac30424f9111364bb94928dbf5ecad1baa68" -dependencies = [ - "bytemuck", - "read-fonts", -] - -[[package]] -name = "slab" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" - -[[package]] -name = "slotmap" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" -dependencies = [ - "version_check", -] - -[[package]] -name = "smallvec" -version = "1.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" - -[[package]] -name = "smol" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33bd3e260892199c3ccfc487c88b2da2265080acb316cd920da72fdfd7c599f" -dependencies = [ - "async-channel 2.5.0", - "async-executor", - "async-fs", - "async-io", - "async-lock", - "async-net", - "async-process", - "blocking", - "futures-lite 2.6.1", -] - -[[package]] -name = "smol_str" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" - -[[package]] -name = "socket2" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "spin" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" -dependencies = [ - "lock_api", -] - -[[package]] -name = "spirv" -version = "0.3.0+sdk-1.3.268.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" -dependencies = [ - "bitflags 2.13.1", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[package]] -name = "stacker" -version = "0.1.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707f49d46706bacf8a2b00d51dace3f9de527c13eec3778f570c411f89e69967" -dependencies = [ - "cc", - "cfg-if", - "libc", - "psm", - "windows-sys 0.61.2", -] - -[[package]] -name = "stacksafe" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d9c1172965d317e87ddb6d364a040d958b40a1db82b6ef97da26253a8b3d090" -dependencies = [ - "stacker", - "stacksafe-macro", -] - -[[package]] -name = "stacksafe-macro" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "172175341049678163e979d9107ca3508046d4d2a7c6682bee46ac541b17db69" -dependencies = [ - "proc-macro-error2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "strict-num" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" -dependencies = [ - "float-cmp", -] - -[[package]] -name = "strum" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" -dependencies = [ - "strum_macros 0.26.4", -] - -[[package]] -name = "strum" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" -dependencies = [ - "strum_macros 0.27.2", -] - -[[package]] -name = "strum_macros" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.119", -] - -[[package]] -name = "strum_macros" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "sval" -version = "2.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b81b254da21fe1fcc4e3a74fe39b46e25e3a863078f8b71c954d47f84889dbc6" - -[[package]] -name = "sval_buffer" -version = "2.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50be352d2822ffafb59e3e2ddac9d5ee60f2eeadbb7b5a2a951b9f3651e87a6f" -dependencies = [ - "sval", - "sval_ref", - "zerocopy", -] - -[[package]] -name = "sval_dynamic" -version = "2.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048ca293b998d9a45659159f94a64063791e74cdc670164943dbb434405573d" -dependencies = [ - "sval", -] - -[[package]] -name = "sval_fmt" -version = "2.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6b5888e40f80568733217f27b7317b845f463400ced36c424b1a804730e53b2" -dependencies = [ - "itoa", - "ryu", - "sval", -] - -[[package]] -name = "sval_json" -version = "2.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17664d6bb6b74947afaab9d7c991caa9bf5638d4dee16fcbef637f440796049" -dependencies = [ - "itoa", - "ryu", - "sval", -] - -[[package]] -name = "sval_nested" -version = "2.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07c059969ca5ca163ea7fef6c9661758973d17691aba92abdcf5c428f4ec122c" -dependencies = [ - "sval", - "sval_buffer", - "sval_ref", -] - -[[package]] -name = "sval_ref" -version = "2.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d6b29ff568c85c87561807f51d2adfff4b6016c6363133f7cd1652a12548f3" -dependencies = [ - "sval", -] - -[[package]] -name = "sval_serde" -version = "2.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f33ec9edc42b12764d5c90ca0a1d84189c6bde81ed27507f1e661c6e4e05853" -dependencies = [ - "serde_core", - "sval", - "sval_nested", -] - -[[package]] -name = "svg_fmt" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0193cc4331cfd2f3d2011ef287590868599a2f33c3e69bc22c1a3d3acf9e02fb" - -[[package]] -name = "svgtypes" -version = "0.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" -dependencies = [ - "kurbo", - "siphasher", -] - -[[package]] -name = "swash" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c2499c2d826531388872b2268718aed907a39bd785ab0dcfe57fab26283f92e" -dependencies = [ - "skrifa", - "yazi", - "zeno", -] - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.119" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6275cddf4610d1775e6d1fe9469b2e77d0f39fd98fb7450901b821e0c53649f" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "sys-locale" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" -dependencies = [ - "libc", -] - -[[package]] -name = "sysinfo" -version = "0.31.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "355dbe4f8799b304b05e1b0f05fc59b2a18d36645cf169607da45bde2f69a1be" -dependencies = [ - "core-foundation-sys", - "libc", - "memchr", - "ntapi", - "rayon", - "windows 0.57.0", -] - -[[package]] -name = "system-configuration" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" -dependencies = [ - "bitflags 2.13.1", - "core-foundation 0.9.4", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "taffy" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a13e5d13f79d558b5d353a98072ca8ca0e99da429467804de959aa8c83c9a004" -dependencies = [ - "arrayvec", - "grid", - "serde", - "slotmap", -] - -[[package]] -name = "take-until" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bdb6fa0dfa67b38c1e66b7041ba9dcf23b99d8121907cd31c807a332f7a0bbb" - -[[package]] -name = "tao-core-video-sys" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271450eb289cb4d8d0720c6ce70c72c8c858c93dd61fc625881616752e6b98f6" -dependencies = [ - "cfg-if", - "core-foundation-sys", - "libc", - "objc", -] - -[[package]] -name = "tempfile" -version = "3.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" -dependencies = [ - "fastrand 2.5.0", - "getrandom 0.4.3", - "once_cell", - "rustix 1.1.4", - "windows-sys 0.61.2", -] - -[[package]] -name = "tendril" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" -dependencies = [ - "futf", - "mac", - "utf-8", -] - -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" -dependencies = [ - "thiserror-impl 2.0.20", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.4", -] - -[[package]] -name = "tiff" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52" -dependencies = [ - "fax", - "flate2", - "half", - "quick-error", - "weezl", - "zune-jpeg", -] - -[[package]] -name = "time" -version = "0.3.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" -dependencies = [ - "deranged", - "num-conv", - "powerfmt", - "serde_core", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" - -[[package]] -name = "time-macros" -version = "0.2.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - -[[package]] -name = "tiny-skia" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" -dependencies = [ - "arrayref", - "arrayvec", - "bytemuck", - "cfg-if", - "log", - "png 0.17.16", - "tiny-skia-path", -] - -[[package]] -name = "tiny-skia-path" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" -dependencies = [ - "arrayref", - "bytemuck", - "strict-num", -] - -[[package]] -name = "tinystr" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinyvec" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" -dependencies = [ - "bytes", - "libc", - "mio", - "pin-project-lite", - "socket2", - "windows-sys 0.61.2", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-socks" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7e2948f60dbe26b35f2c7fb74ac2854c1fddded0fe9d7548fcc674a246f7615" -dependencies = [ - "either", - "futures-util", - "thiserror 1.0.69", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "libc", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" -dependencies = [ - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "toml_edit 0.22.27", -] - -[[package]] -name = "toml" -version = "1.1.4+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5" -dependencies = [ - "indexmap", - "serde_core", - "serde_spanned 1.1.1", - "toml_datetime 1.1.1+spec-1.1.0", - "toml_parser", - "toml_writer", - "winnow 1.0.4", -] - -[[package]] -name = "toml_datetime" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_datetime" -version = "1.1.1+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" -dependencies = [ - "serde_core", -] - -[[package]] -name = "toml_edit" -version = "0.22.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" -dependencies = [ - "indexmap", - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "toml_write", - "winnow 0.7.15", -] - -[[package]] -name = "toml_edit" -version = "0.25.13+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" -dependencies = [ - "indexmap", - "toml_datetime 1.1.1+spec-1.1.0", - "toml_parser", - "winnow 1.0.4", -] - -[[package]] -name = "toml_parser" -version = "1.1.3+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" -dependencies = [ - "winnow 1.0.4", -] - -[[package]] -name = "toml_write" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" - -[[package]] -name = "toml_writer" -version = "1.1.2+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" - -[[package]] -name = "tower" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" -dependencies = [ - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "tracing-core" -version = "0.1.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" -dependencies = [ - "once_cell", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "ttf-parser" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" - -[[package]] -name = "ttf-parser" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c591d83f69777866b9126b24c6dd9a18351f177e49d625920d19f989fd31cf8" - -[[package]] -name = "ttf-parser" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" -dependencies = [ - "core_maths", -] - -[[package]] -name = "typeid" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" - -[[package]] -name = "typenum" -version = "1.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" - -[[package]] -name = "uds_windows" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" -dependencies = [ - "memoffset", - "tempfile", - "windows-sys 0.61.2", -] - -[[package]] -name = "unicase" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" - -[[package]] -name = "unicode-bidi" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" - -[[package]] -name = "unicode-bidi-mirroring" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23cb788ffebc92c5948d0e997106233eeb1d8b9512f93f41651f52b6c5f5af86" - -[[package]] -name = "unicode-bidi-mirroring" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfa6e8c60bb66d49db113e0125ee8711b7647b5579dc7f5f19c42357ed039fe" - -[[package]] -name = "unicode-ccc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df77b101bcc4ea3d78dafc5ad7e4f58ceffe0b2b16bf446aeb50b6cb4157656" - -[[package]] -name = "unicode-ccc" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce61d488bcdc9bc8b5d1772c404828b17fc481c0a582b5581e95fb233aef503e" - -[[package]] -name = "unicode-ident" -version = "1.0.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" - -[[package]] -name = "unicode-linebreak" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" - -[[package]] -name = "unicode-properties" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" - -[[package]] -name = "unicode-script" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "383ad40bb927465ec0ce7720e033cb4ca06912855fc35db31b5755d0de75b1ee" - -[[package]] -name = "unicode-segmentation" -version = "1.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" - -[[package]] -name = "unicode-vo" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" - -[[package]] -name = "unicode-width" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "ureq" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "972d7902c8735f2695410b8aed7df6ed12a47394aa1c8d7af49f0497b731a94d" -dependencies = [ - "base64 0.23.1", - "cookie_store", - "log", - "percent-encoding", - "rustls", - "rustls-pki-types", - "serde", - "serde_json", - "ureq-proto", - "utf8-zero", - "webpki-roots", -] - -[[package]] -name = "ureq-proto" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da5f78b09e6941e1a0f2e30e695e4b120377b54d5e0aec11b594bb57b3971613" -dependencies = [ - "base64 0.23.1", - "http", - "httparse", - "log", -] - -[[package]] -name = "url" -version = "2.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", - "serde_derive", -] - -[[package]] -name = "usvg" -version = "0.45.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80be9b06fbae3b8b303400ab20778c80bbaf338f563afe567cf3c9eea17b47ef" -dependencies = [ - "base64 0.22.1", - "data-url", - "flate2", - "fontdb 0.23.0", - "imagesize", - "kurbo", - "log", - "pico-args", - "roxmltree", - "rustybuzz 0.20.1", - "simplecss", - "siphasher", - "strict-num", - "svgtypes", - "tiny-skia-path", - "unicode-bidi", - "unicode-script", - "unicode-vo", - "xmlwriter", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "utf8-zero" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8c0a043c9540bae7c578c88f91dda8bd82e59ae27c21baca69c8b191aaf5a6e" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "uuid" -version = "1.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5772d71c9be8a8a6ac2117d949c5b224c1b72241bb611d9a3012edcf8af7812" -dependencies = [ - "getrandom 0.4.3", - "js-sys", - "serde_core", - "sha1_smol", - "wasm-bindgen", -] - -[[package]] -name = "v_frame" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" -dependencies = [ - "aligned-vec", - "num-traits", - "wasm-bindgen", -] - -[[package]] -name = "value-bag" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "068e763e8279de7ab94b6afebded2cb701678af094feb1c12ccb061b4783c1be" -dependencies = [ - "value-bag-serde1", - "value-bag-sval2", -] - -[[package]] -name = "value-bag-serde1" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27780e3aec98b13ac796bc0d5770205ee6e976d1ccb33a52da70b73ff0ff880d" -dependencies = [ - "erased-serde", - "serde_core", - "serde_fmt", -] - -[[package]] -name = "value-bag-sval2" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c093d229c7ead9974b640e61170976e0eff3dac447cf6792c645f0b7f28b3de" -dependencies = [ - "sval", - "sval_buffer", - "sval_dynamic", - "sval_fmt", - "sval_json", - "sval_ref", - "sval_serde", -] - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "vswhom" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" -dependencies = [ - "libc", - "vswhom-sys", -] - -[[package]] -name = "vswhom-sys" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "vte" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5924018406ce0063cd67f8e008104968b74b563ee1b85dde3ed1f7cb87d3dbd" -dependencies = [ - "arrayvec", - "bitflags 2.13.1", - "cursor-icon", - "log", - "memchr", -] - -[[package]] -name = "waker-fn" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "wasip2" -version = "1.0.4+wasi-0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.127" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7777d5cc23d0e91404e53ce2d5e8ec7acae3026b16233dba62cd3246457950" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.127" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.127" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284" -dependencies = [ - "bumpalo", - "proc-macro2", - "quote", - "syn 2.0.119", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.127" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasm-streams" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wayland-backend" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38a91b4eaddff87b1cd1074985e3713da4af2c49742d1b356b2c01670a67a078" -dependencies = [ - "cc", - "downcast-rs", - "rustix 1.1.4", - "scoped-tls", - "smallvec", - "wayland-sys", -] - -[[package]] -name = "wayland-client" -version = "0.31.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c36a0f861ad76d0901f2800b46321410d9f73f2ea88aac0650d86c32688073" -dependencies = [ - "bitflags 2.13.1", - "rustix 1.1.4", - "wayland-backend", - "wayland-scanner", -] - -[[package]] -name = "wayland-cursor" -version = "0.31.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a52d18780be9b1314328a3de5f930b73d2200112e3849ca6cb11822793fb34d" -dependencies = [ - "rustix 1.1.4", - "wayland-client", - "xcursor", -] - -[[package]] -name = "wayland-protocols" -version = "0.31.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4" -dependencies = [ - "bitflags 2.13.1", - "wayland-backend", - "wayland-client", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols" -version = "0.32.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d0c813de3daa2ed6520af85a3bd49b0e722a3078506899aa9686fea58dc4b6" -dependencies = [ - "bitflags 2.13.1", - "wayland-backend", - "wayland-client", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols-plasma" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23803551115ff9ea9bce586860c5c5a971e360825a0309264102a9495a5ff479" -dependencies = [ - "bitflags 2.13.1", - "wayland-backend", - "wayland-client", - "wayland-protocols 0.31.2", - "wayland-scanner", -] - -[[package]] -name = "wayland-scanner" -version = "0.31.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "338e30461b3a2b67d70eb30a6d89f8e0c93a833e07d2ae89085cd070c4a00ac0" -dependencies = [ - "proc-macro2", - "quick-xml", - "quote", -] - -[[package]] -name = "wayland-sys" -version = "0.31.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8eab23fefc9e41f8e841df4a9c707e8a8c4ed26e944ef69297184de2785e3be" -dependencies = [ - "dlib", - "log", - "once_cell", - "pkg-config", -] - -[[package]] -name = "web-sys" -version = "0.3.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c435338968042f4f59a557f690a253676d47ce13ceb55d70100e7facf6620a30" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "weezl" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" - -[[package]] -name = "which" -version = "6.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ee928febd44d98f2f459a4a79bd4d928591333a494a10a868418ac1b39cf1f" -dependencies = [ - "either", - "home", - "rustix 0.38.44", - "winsafe", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" -dependencies = [ - "windows-core 0.57.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows" -version = "0.61.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" -dependencies = [ - "windows-collections", - "windows-core 0.61.2", - "windows-future", - "windows-link 0.1.3", - "windows-numerics", -] - -[[package]] -name = "windows-capture" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a4df73e95feddb9ec1a7e9c2ca6323b8c97d5eeeff78d28f1eccdf19c882b24" -dependencies = [ - "parking_lot", - "rayon", - "thiserror 2.0.20", - "windows 0.61.3", - "windows-future", -] - -[[package]] -name = "windows-collections" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" -dependencies = [ - "windows-core 0.61.2", -] - -[[package]] -name = "windows-core" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" -dependencies = [ - "windows-implement 0.57.0", - "windows-interface 0.57.0", - "windows-result 0.1.2", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" -dependencies = [ - "windows-implement 0.60.2", - "windows-interface 0.59.3", - "windows-link 0.1.3", - "windows-result 0.3.4", - "windows-strings 0.4.2", -] - -[[package]] -name = "windows-future" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" -dependencies = [ - "windows-core 0.61.2", - "windows-link 0.1.3", - "windows-threading", -] - -[[package]] -name = "windows-implement" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "windows-implement" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "windows-interface" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "windows-interface" -version = "0.59.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-numerics" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" -dependencies = [ - "windows-core 0.61.2", - "windows-link 0.1.3", -] - -[[package]] -name = "windows-registry" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" -dependencies = [ - "windows-result 0.3.4", - "windows-strings 0.3.1", - "windows-targets 0.53.5", -] - -[[package]] -name = "windows-registry" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" -dependencies = [ - "windows-link 0.1.3", - "windows-result 0.3.4", - "windows-strings 0.4.2", -] - -[[package]] -name = "windows-result" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-strings" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link 0.2.1", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - -[[package]] -name = "windows-threading" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - -[[package]] -name = "winnow" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" -dependencies = [ - "memchr", -] - -[[package]] -name = "winnow" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" -dependencies = [ - "winapi", -] - -[[package]] -name = "winreg" -version = "0.55.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" -dependencies = [ - "cfg-if", - "windows-sys 0.59.0", -] - -[[package]] -name = "winsafe" -version = "0.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" - -[[package]] -name = "wio" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5" -dependencies = [ - "winapi", -] - -[[package]] -name = "wit-bindgen" -version = "0.57.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" - -[[package]] -name = "writeable" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" - -[[package]] -name = "x11" -version = "2.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" -dependencies = [ - "libc", - "pkg-config", -] - -[[package]] -name = "x11-clipboard" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "662d74b3d77e396b8e5beb00b9cad6a9eccf40b2ef68cc858784b14c41d535a3" -dependencies = [ - "libc", - "x11rb", -] - -[[package]] -name = "x11rb" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" -dependencies = [ - "as-raw-xcb-connection", - "gethostname", - "libc", - "rustix 1.1.4", - "x11rb-protocol", - "xcursor", -] - -[[package]] -name = "x11rb-protocol" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" - -[[package]] -name = "xattr" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" -dependencies = [ - "libc", -] - -[[package]] -name = "xcb" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6c2ad15e0e922856ee89afe862b8992334bbe7953adad56cd1199358cb30566" -dependencies = [ - "bitflags 2.13.1", - "libc", - "quick-xml", - "x11", -] - -[[package]] -name = "xcursor" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "163b33ed8786455e2fa5d72f554057ce3f3182425434f756cd39c99839d88e23" - -[[package]] -name = "xim-ctext" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ac61a7062c40f3c37b6e82eeeef835d5cc7824b632a72784a89b3963c33284c" -dependencies = [ - "encoding_rs", -] - -[[package]] -name = "xim-parser" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dcee45f89572d5a65180af3a84e7ddb24f5ea690a6d3aa9de231281544dd7b7" -dependencies = [ - "bitflags 2.13.1", -] - -[[package]] -name = "xkbcommon" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d66ca9352cbd4eecbbc40871d8a11b4ac8107cfc528a6e14d7c19c69d0e1ac9" -dependencies = [ - "as-raw-xcb-connection", - "libc", - "memmap2", - "xkeysym", -] - -[[package]] -name = "xkeysym" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" - -[[package]] -name = "xmlwriter" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" - -[[package]] -name = "y4m" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" - -[[package]] -name = "yazi" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01738255b5a16e78bbb83e7fbba0a1e7dd506905cfc53f4622d89015a03fbb5" - -[[package]] -name = "yeslogic-fontconfig-sys" -version = "6.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d8b8abf912b9a29ff112e1671c97c33636903d13a69712037190e6805af4f76" -dependencies = [ - "dlib", - "once_cell", - "pkg-config", -] - -[[package]] -name = "yoke" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", - "synstructure", -] - -[[package]] -name = "zbus" -version = "5.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5db4be7c075cb421e4b7ee645541604239bd243ba7c357511f4ff3a74b555907" -dependencies = [ - "async-broadcast", - "async-executor", - "async-io", - "async-lock", - "async-process", - "async-recursion", - "async-task", - "async-trait", - "blocking", - "enumflags2", - "event-listener 5.4.2", - "futures-core", - "futures-lite 2.6.1", - "hex", - "libc", - "ordered-stream", - "rustix 1.1.4", - "serde", - "serde_repr", - "tracing", - "uds_windows", - "uuid", - "windows-sys 0.61.2", - "winnow 1.0.4", - "zbus_macros", - "zbus_names", - "zvariant", -] - -[[package]] -name = "zbus_macros" -version = "5.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2990635d09ade6df1868f72f8cac69a876a90981e8bd3c40b1be413f8dc88f40" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 3.0.4", - "zbus_names", - "zvariant", - "zvariant_utils", -] - -[[package]] -name = "zbus_names" -version = "4.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8bf88b4a3ff53e883001e0e0115b297a9d53c31b9c1edd2bfdd853e3428624e" -dependencies = [ - "serde", - "winnow 1.0.4", - "zvariant", -] - -[[package]] -name = "zcheapstr" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1afec51604565183aeb5c54c20aeab286120d4e4460f7f76e3e8bb8c0d99473" -dependencies = [ - "serde", -] - -[[package]] -name = "zed-async-tar" -version = "0.5.0-zed" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cf4b5f655e29700e473cb1acd914ab112b37b62f96f7e642d5fc6a0c02eb881" -dependencies = [ - "async-std", - "filetime", - "libc", - "pin-project", - "redox_syscall 0.2.16", - "xattr", -] - -[[package]] -name = "zed-font-kit" -version = "0.14.1-zed" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3898e450f36f852edda72e3f985c34426042c4951790b23b107f93394f9bff5" -dependencies = [ - "bitflags 2.13.1", - "byteorder", - "core-foundation 0.10.0", - "core-graphics 0.24.0", - "core-text", - "dirs 5.0.1", - "dwrote", - "float-ord", - "freetype-sys", - "lazy_static", - "libc", - "log", - "pathfinder_geometry", - "pathfinder_simd", - "walkdir", - "winapi", - "yeslogic-fontconfig-sys", -] - -[[package]] -name = "zed-reqwest" -version = "0.12.15-zed" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac2d05756ff48539950c3282ad7acf3817ad3f08797c205ad1c34a2ce03b9970" -dependencies = [ - "base64 0.22.1", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "mime_guess", - "once_cell", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls", - "rustls-native-certs", - "rustls-pemfile", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "system-configuration", - "tokio", - "tokio-rustls", - "tokio-socks", - "tokio-util", - "tower", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "windows-registry 0.4.0", -] - -[[package]] -name = "zed-scap" -version = "0.0.8-zed" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b338d705ae33a43ca00287c11129303a7a0aa57b101b72a1c08c863f698ac8" -dependencies = [ - "anyhow", - "cocoa 0.25.0", - "core-graphics-helmer-fork", - "log", - "objc", - "rand 0.8.8", - "screencapturekit", - "screencapturekit-sys", - "sysinfo", - "tao-core-video-sys", - "windows 0.61.3", - "windows-capture", - "x11", - "xcb", -] - -[[package]] -name = "zed-xim" -version = "0.4.0-zed" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0b46ed118eba34d9ba53d94ddc0b665e0e06a2cf874cfa2dd5dec278148642" -dependencies = [ - "ahash", - "hashbrown 0.14.5", - "log", - "x11rb", - "xim-ctext", - "xim-parser", -] - -[[package]] -name = "zeno" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" - -[[package]] -name = "zerocopy" -version = "0.8.56" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.56" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "zerofrom" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - -[[package]] -name = "zerotrie" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" -dependencies = [ - "proc-macro2", - "quote", - "syn 3.0.4", -] - -[[package]] -name = "zlib-rs" -version = "0.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34b31d188d9d685a4f9c7b46d6e36631b07058d2cfe190267adce54dc230bf12" - -[[package]] -name = "zmij" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" - -[[package]] -name = "zune-core" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56377fd46368984a170bc5aac5567e52ca5da874caa60bea39fcbca78fb658b" - -[[package]] -name = "zune-inflate" -version = "0.2.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "zune-jpeg" -version = "0.5.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296" -dependencies = [ - "zune-core", -] - -[[package]] -name = "zvariant" -version = "5.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1d34c27cc6cdd1f458427519dd6b8612f7b7e3f7b9a0b2355d041dda9869147" -dependencies = [ - "endi", - "enumflags2", - "serde", - "url", - "winnow 1.0.4", - "zcheapstr", - "zvariant_derive", - "zvariant_utils", -] - -[[package]] -name = "zvariant_derive" -version = "5.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "864155e69b4352db0c7f374917bf45d1e0c8d17659c8b3dbf9795f3673f8c497" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 3.0.4", - "zvariant_utils", -] - -[[package]] -name = "zvariant_utils" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bad0294361a320b694a328460dc73add56c306150f5cb6bfafc44446120008a3" -dependencies = [ - "proc-macro2", - "quote", - "serde", - "syn 3.0.4", - "winnow 1.0.4", -] diff --git a/spikes/gpui-shell/Cargo.toml b/spikes/gpui-shell/Cargo.toml deleted file mode 100644 index 9a25250..0000000 --- a/spikes/gpui-shell/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "lumbridge-spike-gpui" -description = "GPUI implementation of the Lumbridge native shell spike" -version = "0.0.1" -edition = "2024" -rust-version = "1.94" -license = "Apache-2.0" -publish = false - -[dependencies] -gpui = "0.2.2" -lumbridge-core = { path = "../../crates/lumbridge-core" } -lumbridge-harness = { path = "../../crates/lumbridge-harness" } -lumbridge-runtime = { path = "../../crates/lumbridge-runtime" } -lumbridge-spike-model = { path = "../ui-shell-model" } -lumbridge-storage = { path = "../../crates/lumbridge-storage" } -lumbridge-terminal = { path = "../../crates/lumbridge-terminal" } -serde = { version = "1.0.228", features = ["derive"] } -serde_json = "1.0.149" - -[workspace] diff --git a/spikes/gpui-shell/src/main.rs b/spikes/gpui-shell/src/main.rs deleted file mode 100644 index 4139333..0000000 --- a/spikes/gpui-shell/src/main.rs +++ /dev/null @@ -1,2951 +0,0 @@ -mod panel_registry; -mod usage_feed; - -use std::collections::{BTreeMap, VecDeque}; -use std::path::PathBuf; -use std::time::{Duration, Instant}; - -use gpui::{ - App, Application, Bounds, Context, FocusHandle, FontWeight, KeyBinding, KeyDownEvent, Pixels, - Size, Window, WindowBounds, WindowOptions, actions, div, prelude::*, px, relative, rgb, size, -}; -use lumbridge_core::UsageProvenance; -use lumbridge_runtime::{ - CommandConfig, PtyOptions, RuntimeActorError, RuntimeActorOptions, RuntimeCommand, - RuntimeEvent, RuntimeRegistry, RuntimeRegistryError, TerminalSize, -}; -use lumbridge_spike_model::{ - ActionOutcome, OutputSource, PaneId as FixturePaneId, PaneStatus, ShellAction, ShellModel, - SurfaceKind, -}; -use lumbridge_storage::Store; -use lumbridge_terminal::{ - KeyModifiers, TerminalCellStyle, TerminalColor, TerminalCursorShape, TerminalDimensions, - TerminalEngine, TerminalEngineOptions, TerminalKey, TerminalKeyEvent, TerminalNamedColor, - TerminalScroll, TerminalSnapshot, -}; - -use panel_registry::{PanelId, PanelKind, PanelRegistry, SeedPane}; -use usage_feed::{UsageFeed, UsageSegment}; - -// A colour is read as six hex digits, so `0x8b_c8ff` would be harder to check -// against a design token than `0x8bc8ff`, not easier. Scoped to the palette and -// the two terminal colour tables; every other literal keeps the lint. -#[allow( - clippy::unreadable_literal, - reason = "six-digit colour hex reads whole" -)] -const BG: u32 = 0x090c12; -#[allow( - clippy::unreadable_literal, - reason = "six-digit colour hex reads whole" -)] -const PANEL: u32 = 0x101620; -#[allow( - clippy::unreadable_literal, - reason = "six-digit colour hex reads whole" -)] -const PANEL_ALT: u32 = 0x151d29; -#[allow( - clippy::unreadable_literal, - reason = "six-digit colour hex reads whole" -)] -const PANEL_ACTIVE: u32 = 0x182334; -#[allow( - clippy::unreadable_literal, - reason = "six-digit colour hex reads whole" -)] -const BORDER: u32 = 0x263246; -#[allow( - clippy::unreadable_literal, - reason = "six-digit colour hex reads whole" -)] -const BORDER_QUIET: u32 = 0x1c2636; -#[allow( - clippy::unreadable_literal, - reason = "six-digit colour hex reads whole" -)] -const TEXT: u32 = 0xdbe5f4; -#[allow( - clippy::unreadable_literal, - reason = "six-digit colour hex reads whole" -)] -const MUTED: u32 = 0x8290a8; -#[allow( - clippy::unreadable_literal, - reason = "six-digit colour hex reads whole" -)] -const ACCENT: u32 = 0x68b5f8; -#[allow( - clippy::unreadable_literal, - reason = "six-digit colour hex reads whole" -)] -const ATTENTION: u32 = 0xf1b96a; -#[allow( - clippy::unreadable_literal, - reason = "six-digit colour hex reads whole" -)] -const SUCCESS: u32 = 0x70d6a8; -const TIMING_SAMPLE_LIMIT: usize = 256; -const RUNTIME_POLL_INTERVAL: Duration = Duration::from_millis(16); -const RUNTIME_DRAIN_LIMIT: usize = 64; -const WORKSPACE_SNAPSHOT_ID: &str = "lumbridge-code-gpui-spike"; -const SIDEBAR_WIDTH: f32 = 248.0; -const APP_HEADER_HEIGHT: f32 = 48.0; -const TAB_BAR_HEIGHT: f32 = 38.0; -const APP_FOOTER_HEIGHT: f32 = 46.0; -const TERMINAL_CONTENT_VERTICAL_INSET: f32 = 24.0; -const TERMINAL_HORIZONTAL_INSET: f32 = 32.0; -const TERMINAL_CELL_WIDTH: f32 = 8.4; -const TERMINAL_CELL_HEIGHT: f32 = 18.0; -const WORK_PANEL_GAP: f32 = 4.0; -const TERMINAL_ROW_STEP: u16 = 2; -const TERMINAL_COLUMN_STEP: u16 = 10; - -actions!( - lumbridge, - [ - FocusLeft, - FocusRight, - FocusUp, - FocusDown, - OpenPalette, - ClosePalette, - SelectPane1, - SelectPane2, - SelectPane3, - SelectPane4, - SelectPane5, - SelectPane6, - AddPanel, - DetachSelectedPanel, - TerminalTaller, - TerminalShorter, - TerminalWider, - TerminalNarrower, - ] -); - -struct LumbridgeShell { - model: ShellModel, - panels: PanelRegistry, - timing: RenderTiming, - runtimes: RuntimeRegistry, - live_terminals: BTreeMap, - store: Option, - persistence_status: String, - usage: UsageFeed, - /// Which surface tab each panel is showing. A panel is absent until the - /// user picks something other than the surface it provides natively. - surfaces: BTreeMap, - /// Which decision-shelf choice each panel has selected. Selecting one is - /// inert by design: it prepares nothing and runs nothing. - shelf_choice: BTreeMap, - add_panel_chooser_open: bool, - root_focus: FocusHandle, -} - -/// The surfaces a pane can be viewed through. -/// -/// A pane is the durable unit of work and its surface is a view over that work. -/// Switching one never launches a process, moves the pane, or changes which -/// agent owns the session — it only changes what is drawn. -#[derive(Clone, Copy, Debug, Eq, PartialEq)] -enum SurfaceTab { - Terminal, - Browser, - Tools, - Context, - Goal, - Review, -} - -impl SurfaceTab { - const ALL: [Self; 6] = [ - Self::Terminal, - Self::Browser, - Self::Tools, - Self::Context, - Self::Goal, - Self::Review, - ]; - - const fn label(self) -> &'static str { - match self { - Self::Terminal => "TERMINAL", - Self::Browser => "BROWSER", - Self::Tools => "TOOLS", - Self::Context => "CONTEXT", - Self::Goal => "GOAL", - Self::Review => "REVIEW", - } - } - - const fn ordinal(self) -> u64 { - match self { - Self::Terminal => 0, - Self::Browser => 1, - Self::Tools => 2, - Self::Context => 3, - Self::Goal => 4, - Self::Review => 5, - } - } - - /// The one surface a pane of this kind actually provides. - const fn native_for(kind: SurfaceKind) -> Self { - match kind { - SurfaceKind::Terminal => Self::Terminal, - SurfaceKind::Browser => Self::Browser, - SurfaceKind::Markdown => Self::Context, - SurfaceKind::Review => Self::Review, - } - } - - /// Why this pane cannot show this surface. Stated plainly, because the - /// product boundary says an unsupported surface is shown as unavailable - /// rather than simulated. - const fn unavailable_reason(self) -> &'static str { - match self { - Self::Terminal => "Only a terminal pane owns a live shell.", - Self::Browser => "No isolated web engine is wired yet.", - Self::Tools => "Tool calls arrive with the ACP client.", - Self::Context => "Context projection is not built yet.", - Self::Goal => "Goal tracking is not built yet.", - Self::Review => "Review is not wired to Git yet.", - } - } -} - -#[derive(Clone)] -struct PanelView { - id: PanelId, - kind: SurfaceKind, - title: String, - badge: String, - target: String, - status: PaneStatus, - lines: Vec, - output_source: OutputSource, -} - -impl PanelView { - const fn needs_input(&self) -> bool { - matches!(self.status, PaneStatus::NeedsInput) - } -} - -struct LiveTerminalState { - status: LiveRuntimeStatus, - terminal: TerminalEngine, - snapshot: TerminalSnapshot, - last_runtime_sequence: u64, -} - -impl LiveTerminalState { - fn new(dimensions: TerminalDimensions) -> Self { - let terminal = TerminalEngine::new(TerminalEngineOptions { - dimensions, - ..TerminalEngineOptions::default() - }); - let snapshot = terminal.snapshot(); - Self { - status: LiveRuntimeStatus::Starting, - terminal, - snapshot, - last_runtime_sequence: 0, - } - } -} - -#[derive(Clone, Debug, Eq, PartialEq)] -enum LiveRuntimeStatus { - Starting, - Running { - session_id: u64, - process_id: Option, - }, - Exited(String), - Fault(String), -} - -impl LiveRuntimeStatus { - fn badge(&self) -> &'static str { - match self { - Self::Starting => "PTY STARTING", - Self::Running { .. } => "LIVE PTY", - Self::Exited(_) => "PTY EXITED", - Self::Fault(_) => "PTY FAULT", - } - } - - fn detail(&self) -> String { - match self { - Self::Starting => "local · runtime actor starting".to_owned(), - Self::Running { - session_id, - process_id, - } => match process_id { - Some(process_id) => { - format!("local · runtime session {session_id} · pid {process_id}") - } - None => format!("local · runtime session {session_id}"), - }, - Self::Exited(status) => format!("local · {status}"), - Self::Fault(message) => format!("local · {message}"), - } - } - - const fn is_terminal(&self) -> bool { - matches!(self, Self::Exited(_) | Self::Fault(_)) - } -} - -#[derive(Default)] -struct RenderTiming { - pending_dispatch: Option, - dispatch_to_element_micros: VecDeque, -} - -#[derive(Clone, Eq, PartialEq)] -struct TerminalPaintRun { - text: String, - columns: u16, - foreground: u32, - background: u32, - style: TerminalCellStyle, - cursor: Option, - hyperlink: bool, -} - -impl TerminalPaintRun { - fn can_merge(&self, other: &Self) -> bool { - self.foreground == other.foreground - && self.background == other.background - && self.style == other.style - && self.cursor == other.cursor - && self.hyperlink == other.hyperlink - } -} - -fn terminal_paint_rows(snapshot: &TerminalSnapshot) -> Vec> { - (0..snapshot.dimensions.rows()) - .map(|row| { - let mut runs: Vec = Vec::new(); - for column in 0..snapshot.dimensions.columns() { - let Some(cell) = snapshot.cell(row, column) else { - continue; - }; - if cell.wide_spacer { - continue; - } - - let mut foreground = terminal_color(cell.foreground); - let mut background = terminal_color(cell.background); - if cell.style.contains(TerminalCellStyle::INVERSE) { - std::mem::swap(&mut foreground, &mut background); - } - if cell.style.contains(TerminalCellStyle::DIM) { - foreground = dim_color(foreground); - } - if cell.style.contains(TerminalCellStyle::HIDDEN) { - foreground = background; - } - - let cursor = (snapshot.cursor.row == row - && snapshot.cursor.column == column - && snapshot.cursor.shape != TerminalCursorShape::Hidden) - .then_some(snapshot.cursor.shape); - let text = if cell.text.is_empty() { - " ".to_owned() - } else { - cell.text.clone() - }; - let next = TerminalPaintRun { - text, - columns: if cell.wide { 2 } else { 1 }, - foreground, - background, - style: cell.style, - cursor, - hyperlink: cell.hyperlink.is_some(), - }; - - if let Some(current) = runs.last_mut() - && current.can_merge(&next) - { - current.text.push_str(&next.text); - current.columns = current.columns.saturating_add(next.columns); - continue; - } - runs.push(next); - } - runs - }) - .collect() -} - -#[allow( - clippy::unreadable_literal, - reason = "six-digit colour hex reads whole" -)] -/// Narrows an already-clamped dimension. -/// -/// Every caller clamps into `2.0..=u16::MAX` first, so this is a narrowing of a -/// value known to fit — but `as` would silently produce garbage if a caller ever -/// stopped clamping, and a NaN would become zero. This saturates instead, which -/// is why the `with_cell_size` expect below is honest rather than hopeful. -fn clamp_to_u16(value: f32) -> u16 { - if value.is_nan() { - return 1; - } - #[allow( - clippy::cast_possible_truncation, - clippy::cast_sign_loss, - reason = "clamped into u16 range on the line above" - )] - { - value.clamp(0.0, f32::from(u16::MAX)) as u16 - } -} - -#[allow( - clippy::unreadable_literal, - reason = "six-digit colour hex reads whole" -)] -fn terminal_color(color: TerminalColor) -> u32 { - match color { - TerminalColor::Rgb { red, green, blue } => { - (u32::from(red) << 16) | (u32::from(green) << 8) | u32::from(blue) - } - TerminalColor::Indexed(index) => indexed_terminal_color(index), - TerminalColor::Named(named) => match named { - TerminalNamedColor::Black => 0x1d2430, - TerminalNamedColor::Red => 0xff6b6b, - TerminalNamedColor::Green => 0x70d6a8, - TerminalNamedColor::Yellow => 0xf1c76a, - TerminalNamedColor::Blue => 0x68b5f8, - TerminalNamedColor::Magenta => 0xc79bf2, - TerminalNamedColor::Cyan => 0x63d5da, - TerminalNamedColor::White => 0xdbe5f4, - TerminalNamedColor::BrightBlack => 0x6d7a91, - TerminalNamedColor::BrightRed => 0xff8b8b, - TerminalNamedColor::BrightGreen => 0x93e6be, - TerminalNamedColor::BrightYellow => 0xf8d98c, - TerminalNamedColor::BrightBlue => 0x8bc8ff, - TerminalNamedColor::BrightMagenta => 0xd9b4fb, - TerminalNamedColor::BrightCyan => 0x86e7eb, - TerminalNamedColor::BrightWhite | TerminalNamedColor::BrightForeground => 0xf4f8ff, - TerminalNamedColor::Foreground => TEXT, - TerminalNamedColor::Background => BG, - TerminalNamedColor::Cursor => 0xf4f8ff, - TerminalNamedColor::DimBlack => 0x121820, - TerminalNamedColor::DimRed => 0x9f4a4a, - TerminalNamedColor::DimGreen => 0x4e9878, - TerminalNamedColor::DimYellow => 0xa88a49, - TerminalNamedColor::DimBlue => 0x477fac, - TerminalNamedColor::DimMagenta => 0x896ca4, - TerminalNamedColor::DimCyan => 0x459397, - TerminalNamedColor::DimWhite | TerminalNamedColor::DimForeground => MUTED, - }, - } -} - -#[allow( - clippy::unreadable_literal, - reason = "six-digit colour hex reads whole" -)] -fn indexed_terminal_color(index: u8) -> u32 { - const ANSI: [u32; 16] = [ - 0x1d2430, 0xff6b6b, 0x70d6a8, 0xf1c76a, 0x68b5f8, 0xc79bf2, 0x63d5da, 0xdbe5f4, 0x6d7a91, - 0xff8b8b, 0x93e6be, 0xf8d98c, 0x8bc8ff, 0xd9b4fb, 0x86e7eb, 0xf4f8ff, - ]; - match index { - 0..=15 => ANSI[usize::from(index)], - 16..=231 => { - const LEVELS: [u32; 6] = [0, 95, 135, 175, 215, 255]; - let offset = u32::from(index - 16); - let red = LEVELS[(offset / 36) as usize]; - let green = LEVELS[((offset % 36) / 6) as usize]; - let blue = LEVELS[(offset % 6) as usize]; - (red << 16) | (green << 8) | blue - } - 232..=255 => { - let level = 8 + 10 * u32::from(index - 232); - (level << 16) | (level << 8) | level - } - } -} - -fn dim_color(color: u32) -> u32 { - let dim = |channel: u32| channel * 13 / 20; - (dim((color >> 16) & 0xff) << 16) | (dim((color >> 8) & 0xff) << 8) | dim(color & 0xff) -} - -fn terminal_dimensions_for_window( - window_size: Size, - attached_panel_count: usize, -) -> TerminalDimensions { - let width = f32::from(window_size.width); - let height = f32::from(window_size.height); - let panel_count = visible_panel_count(window_size) - .min(attached_panel_count) - .max(1); - let workspace_height = - (height - APP_HEADER_HEIGHT - TAB_BAR_HEIGHT - APP_FOOTER_HEIGHT).max(0.0); - let terminal_height = (workspace_height * 0.60 - TERMINAL_CONTENT_VERTICAL_INSET).max(0.0); - let workspace_width = (width - SIDEBAR_WIDTH).max(0.0); - let panel_gaps = WORK_PANEL_GAP * panel_count.saturating_sub(1) as f32; - let panel_width = ((workspace_width - panel_gaps).max(0.0) / panel_count as f32).max(0.0); - let terminal_width = (panel_width - TERMINAL_HORIZONTAL_INSET).max(0.0); - let rows = (terminal_height / TERMINAL_CELL_HEIGHT) - .floor() - .clamp(2.0, f32::from(u16::MAX)); - let columns = (terminal_width / TERMINAL_CELL_WIDTH) - .floor() - .clamp(20.0, f32::from(u16::MAX)); - TerminalDimensions::with_cell_size( - clamp_to_u16(rows), - clamp_to_u16(columns), - clamp_to_u16(TERMINAL_CELL_WIDTH.round()), - clamp_to_u16(TERMINAL_CELL_HEIGHT.round()), - ) - .expect("geometry clamps terminal dimensions above zero") -} - -fn visible_panel_count(window_size: Size) -> usize { - let workspace_width = (f32::from(window_size.width) - SIDEBAR_WIDTH).max(0.0); - if workspace_width >= 2_800.0 { - 5 - } else if workspace_width >= 1_100.0 { - 3 - } else { - 1 - } -} - -fn visible_panel_range( - total: usize, - selected: usize, - panel_count: usize, -) -> std::ops::Range { - let count = panel_count.clamp(1, total.max(1)).min(total); - let start = selected - .saturating_sub(count / 2) - .min(total.saturating_sub(count)); - start..start + count -} - -impl RenderTiming { - fn mark_dispatch(&mut self) { - self.pending_dispatch = Some(Instant::now()); - } - - fn observe_element_build(&mut self) { - let Some(started) = self.pending_dispatch.take() else { - return; - }; - if self.dispatch_to_element_micros.len() == TIMING_SAMPLE_LIMIT { - self.dispatch_to_element_micros.pop_front(); - } - self.dispatch_to_element_micros - .push_back(started.elapsed().as_micros()); - } - - fn summary(&self) -> String { - if self.dispatch_to_element_micros.is_empty() { - return "dispatch→element collecting…".to_owned(); - } - let mut samples = self - .dispatch_to_element_micros - .iter() - .copied() - .collect::>(); - samples.sort_unstable(); - let percentile = |percent: usize| { - let index = ((samples.len() - 1) * percent) / 100; - samples[index] - }; - format!( - "dispatch→element p50 {}µs · p95 {}µs · n{}", - percentile(50), - percentile(95), - samples.len() - ) - } -} - -fn workspace_database_path() -> Option { - if let Some(path) = std::env::var_os("LUMBRIDGE_SPIKE_DB") { - return Some(PathBuf::from(path)); - } - if let Some(root) = std::env::var_os("XDG_DATA_HOME") { - return Some(PathBuf::from(root).join("lumbridge/lumbridge.db")); - } - std::env::var_os("HOME") - .map(PathBuf::from) - .map(|home| home.join(".local/share/lumbridge/lumbridge.db")) -} - -fn load_panel_registry() -> (Option, PanelRegistry, String) { - let Some(path) = workspace_database_path() else { - return ( - None, - PanelRegistry::first_run(), - "layout memory-only · no data directory".to_owned(), - ); - }; - if let Some(parent) = path.parent() - && let Err(error) = std::fs::create_dir_all(parent) - { - return ( - None, - PanelRegistry::first_run(), - format!("layout memory-only · {error}"), - ); - } - let store = match Store::open(&path) { - Ok(store) => store, - Err(error) => { - return ( - None, - PanelRegistry::first_run(), - format!("layout memory-only · {error}"), - ); - } - }; - match store.workspace_snapshot(WORKSPACE_SNAPSHOT_ID) { - Ok(Some(json)) => match PanelRegistry::from_json(&json) { - Ok(panels) => (Some(store), panels, "layout restored · SQLite".to_owned()), - Err(error) => ( - Some(store), - PanelRegistry::first_run(), - format!("invalid layout ignored · {error}"), - ), - }, - Ok(None) => ( - Some(store), - PanelRegistry::first_run(), - "layout ready · SQLite".to_owned(), - ), - Err(error) => ( - Some(store), - PanelRegistry::first_run(), - format!("layout read failed · {error}"), - ), - } -} - -impl LumbridgeShell { - fn new(window: &mut Window, cx: &mut Context) -> Self { - let root_focus = cx.focus_handle(); - window.focus(&root_focus); - - cx.spawn(async move |this, cx| { - loop { - cx.background_executor() - .timer(Duration::from_millis(650)) - .await; - if this - .update(cx, |shell, cx| { - shell.dispatch(ShellAction::SyntheticStreamTick); - shell.usage.advance(); - shell.usage.tick(); - cx.notify(); - }) - .is_err() - { - break; - } - } - }) - .detach(); - - cx.spawn(async move |this, cx| { - loop { - cx.background_executor().timer(RUNTIME_POLL_INTERVAL).await; - if this - .update(cx, |shell, cx| { - if shell.drain_runtime_events() { - cx.notify(); - } - }) - .is_err() - { - break; - } - } - }) - .detach(); - - let (store, panels, persistence_status) = load_panel_registry(); - let terminal_dimensions = - terminal_dimensions_for_window(window.bounds().size, panels.attached_count()); - let mut runtimes = RuntimeRegistry::new(); - let mut live_terminals = BTreeMap::new(); - for panel in panels - .panels() - .iter() - .filter(|panel| panel.kind == PanelKind::Terminal) - { - let mut terminal = LiveTerminalState::new(terminal_dimensions); - if let Err(error) = - spawn_live_runtime(&mut runtimes, panel.id, panel.seed, terminal_dimensions) - { - terminal.status = LiveRuntimeStatus::Fault(error.to_string()); - } - live_terminals.insert(panel.id, terminal); - } - - cx.observe_window_bounds(window, |shell, window, cx| { - let dimensions = - terminal_dimensions_for_window(window.bounds().size, shell.panels.attached_count()); - shell.resize_attached_terminals(dimensions.rows(), dimensions.columns(), cx); - }) - .detach(); - - Self { - model: ShellModel::with_external_outputs([ - FixturePaneId::CodexRuntime, - FixturePaneId::ClaudeUi, - FixturePaneId::PiDocs, - ]) - .expect("all live comparison panes are terminals"), - panels, - timing: RenderTiming::default(), - runtimes, - live_terminals, - store, - persistence_status, - usage: UsageFeed::start(), - surfaces: BTreeMap::new(), - shelf_choice: BTreeMap::new(), - add_panel_chooser_open: false, - root_focus, - } - } - - fn persist_panels(&mut self) { - let Some(store) = &self.store else { - return; - }; - let result = self - .panels - .to_json() - .map_err(|error| error.clone()) - .and_then(|json| { - store - .save_workspace_snapshot(WORKSPACE_SNAPSHOT_ID, &json) - .map_err(|error| error.to_string()) - }); - self.persistence_status = match result { - Ok(()) => "layout saved · SQLite".to_owned(), - Err(error) => format!("layout save failed · {error}"), - }; - } - - fn dispatch(&mut self, action: ShellAction) -> ActionOutcome { - self.timing.mark_dispatch(); - self.model.dispatch(action) - } - - fn drain_runtime_events(&mut self) -> bool { - let mut changed = false; - let panes = self.live_terminals.keys().copied().collect::>(); - for pane in panes { - if self - .live_terminals - .get(&pane) - .is_none_or(|terminal| terminal.status.is_terminal()) - { - continue; - } - for _ in 0..RUNTIME_DRAIN_LIMIT { - let event = match self.runtimes.try_recv(&pane) { - Ok(Some(event)) => event, - Ok(None) => break, - Err(RuntimeRegistryError::Actor(RuntimeActorError::Disconnected)) => { - self.live_terminals - .get_mut(&pane) - .expect("live terminal state exists") - .status = - LiveRuntimeStatus::Fault("runtime actor disconnected".to_owned()); - changed = true; - break; - } - Err(error) => { - self.live_terminals - .get_mut(&pane) - .expect("live terminal state exists") - .status = LiveRuntimeStatus::Fault(error.to_string()); - changed = true; - break; - } - }; - - match event { - RuntimeEvent::Started { - session_id, - process_id, - } => { - self.live_terminals - .get_mut(&pane) - .expect("live terminal state exists") - .status = LiveRuntimeStatus::Running { - session_id: session_id.get(), - process_id, - }; - changed = true; - } - RuntimeEvent::Output { - sequence, bytes, .. - } => { - let responses = { - let terminal = self - .live_terminals - .get_mut(&pane) - .expect("live terminal state exists"); - if sequence <= terminal.last_runtime_sequence { - terminal.status = LiveRuntimeStatus::Fault(format!( - "non-monotonic PTY output sequence {sequence}" - )); - changed = true; - break; - } - terminal.last_runtime_sequence = sequence; - terminal.terminal.process(&bytes).outbound - }; - for response in responses { - if let Err(error) = - self.send_runtime_command(pane, RuntimeCommand::Input(response)) - { - self.live_terminals - .get_mut(&pane) - .expect("live terminal state exists") - .status = LiveRuntimeStatus::Fault(error.to_string()); - return true; - } - } - self.publish_terminal_snapshot(pane); - changed = true; - } - RuntimeEvent::InputClosed { .. } => {} - RuntimeEvent::Exited { status, .. } => { - self.live_terminals - .get_mut(&pane) - .expect("live terminal state exists") - .status = LiveRuntimeStatus::Exited(format!( - "PTY exited with code {}", - status.code - )); - changed = true; - break; - } - RuntimeEvent::Fault { - operation, message, .. - } => { - self.live_terminals - .get_mut(&pane) - .expect("live terminal state exists") - .status = LiveRuntimeStatus::Fault(format!("{operation:?}: {message}")); - changed = true; - break; - } - } - } - } - changed - } - - fn send_runtime_command( - &self, - pane: PanelId, - command: RuntimeCommand, - ) -> Result<(), RuntimeRegistryError> { - self.runtimes.try_send(&pane, command) - } - - fn publish_terminal_snapshot(&mut self, pane: PanelId) { - let lines = { - let terminal = self - .live_terminals - .get_mut(&pane) - .expect("live terminal state exists"); - let snapshot = terminal.terminal.snapshot(); - let lines = snapshot.plain_rows(); - terminal.snapshot = snapshot; - lines - }; - let fixture = self - .panels - .panel(pane) - .and_then(|panel| panel.seed) - .map(SeedPane::fixture_id); - if let Some(pane) = fixture { - self.dispatch(ShellAction::ReplaceExternalOutput { pane, lines }); - } - } - - fn resize_terminal(&mut self, pane: PanelId, rows: u16, columns: u16) -> bool { - let dimensions = TerminalDimensions::new(rows, columns) - .expect("resize actions always retain non-zero dimensions"); - let terminal = self - .live_terminals - .get_mut(&pane) - .expect("live terminal state exists"); - if !terminal.terminal.resize(dimensions) { - return false; - } - let pty_size = TerminalSize::new(rows, columns) - .expect("terminal engine dimensions are valid PTY dimensions"); - if let Err(error) = self.send_runtime_command(pane, RuntimeCommand::Resize(pty_size)) { - self.live_terminals - .get_mut(&pane) - .expect("live terminal state exists") - .status = LiveRuntimeStatus::Fault(error.to_string()); - } - self.publish_terminal_snapshot(pane); - true - } - - fn resize_attached_terminals(&mut self, rows: u16, columns: u16, cx: &mut Context) { - let mut changed = false; - let panes = self.live_terminals.keys().copied().collect::>(); - for pane in panes { - if self.panels.panel(pane).is_some_and(|panel| panel.attached) { - changed |= self.resize_terminal(pane, rows, columns); - } - } - if changed { - cx.notify(); - } - } - - fn scroll_terminal(&mut self, pane: PanelId, scroll: TerminalScroll, cx: &mut Context) { - if !self - .live_terminals - .get_mut(&pane) - .expect("live terminal state exists") - .terminal - .scroll_display(scroll) - { - return; - } - self.publish_terminal_snapshot(pane); - cx.notify(); - } - - fn select_pane(&mut self, pane: PanelId, window: &mut Window, cx: &mut Context) { - self.timing.mark_dispatch(); - if self.panels.select(pane) { - self.persist_panels(); - } - window.focus(&self.root_focus); - cx.notify(); - } - - /// Changes which surface a pane is viewed through. - /// - /// This is a view change only. It never touches the PTY, the agent, or the - /// pane's execution target, so a pane keeps running whatever it was running. - fn select_surface( - &mut self, - pane: PanelId, - tab: SurfaceTab, - window: &mut Window, - cx: &mut Context, - ) { - self.timing.mark_dispatch(); - self.surfaces.insert(pane, tab); - if self.panels.select(pane) { - self.persist_panels(); - } - window.focus(&self.root_focus); - cx.notify(); - } - - /// Records which suggestion the user picked. Deliberately does nothing else. - fn select_shelf_choice( - &mut self, - pane: PanelId, - index: usize, - window: &mut Window, - cx: &mut Context, - ) { - self.timing.mark_dispatch(); - if self.shelf_choice.get(&pane) == Some(&index) { - self.shelf_choice.remove(&pane); - } else { - self.shelf_choice.insert(pane, index); - } - if self.panels.select(pane) { - self.persist_panels(); - } - window.focus(&self.root_focus); - cx.notify(); - } - - fn select_pane_at(&mut self, index: usize, window: &mut Window, cx: &mut Context) { - self.timing.mark_dispatch(); - if self.panels.select_attached_at(index) { - self.persist_panels(); - } - window.focus(&self.root_focus); - cx.notify(); - } - - fn resize_terminal_for_workspace(&mut self, window: &Window, cx: &mut Context) { - let dimensions = - terminal_dimensions_for_window(window.bounds().size, self.panels.attached_count()); - self.resize_attached_terminals(dimensions.rows(), dimensions.columns(), cx); - } - - fn attach_panel(&mut self, pane: PanelId, window: &mut Window, cx: &mut Context) { - self.timing.mark_dispatch(); - if self.panels.attach(pane) { - self.persist_panels(); - self.resize_terminal_for_workspace(window, cx); - } - window.focus(&self.root_focus); - cx.notify(); - } - - fn create_panel(&mut self, kind: PanelKind, window: &mut Window, cx: &mut Context) { - self.timing.mark_dispatch(); - let pane = self.panels.create(kind); - if kind == PanelKind::Terminal { - let dimensions = - terminal_dimensions_for_window(window.bounds().size, self.panels.attached_count()); - let mut terminal = LiveTerminalState::new(dimensions); - if let Err(error) = spawn_live_runtime(&mut self.runtimes, pane, None, dimensions) { - terminal.status = LiveRuntimeStatus::Fault(error.to_string()); - } - self.live_terminals.insert(pane, terminal); - } - self.add_panel_chooser_open = false; - self.persist_panels(); - self.resize_terminal_for_workspace(window, cx); - window.focus(&self.root_focus); - cx.notify(); - } - - fn detach_panel(&mut self, pane: PanelId, window: &mut Window, cx: &mut Context) { - self.timing.mark_dispatch(); - if self.panels.detach(pane) { - self.persist_panels(); - self.resize_terminal_for_workspace(window, cx); - } - window.focus(&self.root_focus); - cx.notify(); - } - - fn add_panel_action(&mut self, _: &AddPanel, window: &mut Window, cx: &mut Context) { - self.dispatch(ShellAction::CloseCommandPalette); - self.add_panel_chooser_open = !self.add_panel_chooser_open; - window.focus(&self.root_focus); - cx.notify(); - } - - fn detach_selected_panel( - &mut self, - _: &DetachSelectedPanel, - window: &mut Window, - cx: &mut Context, - ) { - self.detach_panel(self.panels.selected(), window, cx); - } - - fn move_focus(&mut self, delta: isize, window: &mut Window, cx: &mut Context) { - self.timing.mark_dispatch(); - if self.panels.move_horizontal(delta) { - self.persist_panels(); - } - window.focus(&self.root_focus); - cx.notify(); - } - - fn focus_left(&mut self, _: &FocusLeft, window: &mut Window, cx: &mut Context) { - self.move_focus(-1, window, cx); - } - - fn focus_right(&mut self, _: &FocusRight, window: &mut Window, cx: &mut Context) { - self.move_focus(1, window, cx); - } - - fn focus_up(&mut self, _: &FocusUp, window: &mut Window, cx: &mut Context) { - self.move_focus(-1, window, cx); - } - - fn focus_down(&mut self, _: &FocusDown, window: &mut Window, cx: &mut Context) { - self.move_focus(1, window, cx); - } - - fn open_palette(&mut self, _: &OpenPalette, _: &mut Window, cx: &mut Context) { - self.add_panel_chooser_open = false; - self.dispatch(ShellAction::OpenCommandPalette); - cx.notify(); - } - - fn close_palette(&mut self, _: &ClosePalette, _: &mut Window, cx: &mut Context) { - self.dispatch(ShellAction::CloseCommandPalette); - cx.notify(); - } - - fn selected_terminal_dimensions(&self) -> Option<(PanelId, TerminalDimensions)> { - let pane = self.panels.selected(); - self.live_terminals - .get(&pane) - .map(|terminal| (pane, terminal.terminal.dimensions())) - } - - fn terminal_taller(&mut self, _: &TerminalTaller, _: &mut Window, cx: &mut Context) { - let Some((pane, dimensions)) = self.selected_terminal_dimensions() else { - return; - }; - if self.resize_terminal( - pane, - dimensions.rows().saturating_add(TERMINAL_ROW_STEP), - dimensions.columns(), - ) { - cx.notify(); - } - } - - fn terminal_shorter(&mut self, _: &TerminalShorter, _: &mut Window, cx: &mut Context) { - let Some((pane, dimensions)) = self.selected_terminal_dimensions() else { - return; - }; - if self.resize_terminal( - pane, - dimensions.rows().saturating_sub(TERMINAL_ROW_STEP).max(2), - dimensions.columns(), - ) { - cx.notify(); - } - } - - fn terminal_wider(&mut self, _: &TerminalWider, _: &mut Window, cx: &mut Context) { - let Some((pane, dimensions)) = self.selected_terminal_dimensions() else { - return; - }; - if self.resize_terminal( - pane, - dimensions.rows(), - dimensions.columns().saturating_add(TERMINAL_COLUMN_STEP), - ) { - cx.notify(); - } - } - - fn terminal_narrower(&mut self, _: &TerminalNarrower, _: &mut Window, cx: &mut Context) { - let Some((pane, dimensions)) = self.selected_terminal_dimensions() else { - return; - }; - if self.resize_terminal( - pane, - dimensions.rows(), - dimensions - .columns() - .saturating_sub(TERMINAL_COLUMN_STEP) - .max(20), - ) { - cx.notify(); - } - } - - fn on_key_down(&mut self, event: &KeyDownEvent, window: &mut Window, cx: &mut Context) { - if self.add_panel_chooser_open { - match event.keystroke.key.as_str() { - "escape" => { - self.add_panel_chooser_open = false; - cx.notify(); - } - "1" => self.create_panel(PanelKind::Terminal, window, cx), - "2" => self.create_panel(PanelKind::Browser, window, cx), - "3" => self.create_panel(PanelKind::Markdown, window, cx), - "4" => self.create_panel(PanelKind::Review, window, cx), - _ => {} - } - return; - } - if !self.model.command_palette().is_open() { - let pane = self.panels.selected(); - if self - .live_terminals - .get(&pane) - .is_none_or(|terminal| terminal.status.is_terminal()) - { - return; - } - let modifiers = key_modifiers(event); - if let Some(scroll) = - terminal_scroll_from_parts(event.keystroke.key.as_str(), modifiers) - { - self.scroll_terminal(pane, scroll, cx); - return; - } - let Some(event) = terminal_key_from_parts( - event.keystroke.key.as_str(), - event.keystroke.key_char.as_deref(), - modifiers, - ) else { - return; - }; - let bytes = self - .live_terminals - .get(&pane) - .expect("selected live terminal exists") - .terminal - .encode_key(&event); - if bytes.is_empty() { - return; - } - if let Err(error) = self.send_runtime_command(pane, RuntimeCommand::Input(bytes)) { - self.live_terminals - .get_mut(&pane) - .expect("selected live terminal exists") - .status = LiveRuntimeStatus::Fault(error.to_string()); - } - let moved_to_bottom = { - let terminal = self - .live_terminals - .get_mut(&pane) - .expect("selected live terminal exists"); - terminal.terminal.display_offset() > 0 - && terminal.terminal.scroll_display(TerminalScroll::Bottom) - }; - if moved_to_bottom { - self.publish_terminal_snapshot(pane); - } - cx.notify(); - return; - } - - let mut query = self.model.command_palette().query().to_owned(); - match event.keystroke.key.as_str() { - "backspace" => { - query.pop(); - } - "enter" => { - self.dispatch(ShellAction::CloseCommandPalette); - cx.notify(); - return; - } - "escape" => { - self.dispatch(ShellAction::CloseCommandPalette); - cx.notify(); - return; - } - _ => { - if let Some(character) = event.keystroke.key_char.as_deref() - && !event.keystroke.modifiers.control - && !event.keystroke.modifiers.platform - { - query.push_str(character); - } else { - return; - } - } - } - self.dispatch(ShellAction::SetCommandPaletteQuery(query)); - cx.notify(); - } - - fn terminal_run(run: TerminalPaintRun) -> gpui::AnyElement { - let cursor = run.cursor; - div() - .flex_none() - .h(px(TERMINAL_CELL_HEIGHT)) - .w(px(f32::from(run.columns) * TERMINAL_CELL_WIDTH)) - .overflow_hidden() - .whitespace_nowrap() - .text_color(rgb(run.foreground)) - .bg(rgb(run.background)) - .when(run.style.contains(TerminalCellStyle::BOLD), |view| { - view.font_weight(FontWeight::BOLD) - }) - .when(run.style.contains(TerminalCellStyle::ITALIC), |view| { - view.italic() - }) - .when( - run.style.contains(TerminalCellStyle::UNDERLINE) - || run.style.contains(TerminalCellStyle::DOUBLE_UNDERLINE) - || run.style.contains(TerminalCellStyle::UNDERCURL) - || run.style.contains(TerminalCellStyle::DOTTED_UNDERLINE) - || run.style.contains(TerminalCellStyle::DASHED_UNDERLINE) - || run.hyperlink, - gpui::Styled::underline, - ) - .when(run.style.contains(TerminalCellStyle::STRIKEOUT), |view| { - view.line_through() - }) - .when(cursor == Some(TerminalCursorShape::Block), |view| { - view.bg(rgb(TEXT)).text_color(rgb(BG)) - }) - .when(cursor == Some(TerminalCursorShape::HollowBlock), |view| { - view.border_1().border_color(rgb(TEXT)) - }) - .when(cursor == Some(TerminalCursorShape::Underline), |view| { - view.border_b_2().border_color(rgb(TEXT)) - }) - .when(cursor == Some(TerminalCursorShape::Beam), |view| { - view.border_l_2().border_color(rgb(TEXT)) - }) - .child(run.text) - .into_any_element() - } - - fn panel_view(&self, id: PanelId) -> PanelView { - let panel = self.panels.panel(id).expect("workspace panel exists"); - if let Some(seed) = panel.seed { - let fixture = self.model.pane(seed.fixture_id()); - return PanelView { - id, - kind: fixture.kind(), - title: panel.title.clone(), - badge: fixture.fixture().badge.to_owned(), - target: panel.target.clone(), - status: fixture.status(), - lines: fixture.lines().to_vec(), - output_source: fixture.output_source(), - }; - } - let (kind, badge, lines) = match panel.kind { - PanelKind::Terminal => (SurfaceKind::Terminal, "TERMINAL", Vec::new()), - PanelKind::Browser => ( - SurfaceKind::Browser, - "BROWSER", - vec![ - "about:blank".to_owned(), - "No web engine is embedded in this build.".to_owned(), - "Choose a URL or open externally ↗".to_owned(), - ], - ), - PanelKind::Markdown => ( - SurfaceKind::Markdown, - "MARKDOWN", - vec![ - "# Untitled note".to_owned(), - String::new(), - "Local-first workspace document.".to_owned(), - ], - ), - PanelKind::Review => ( - SurfaceKind::Review, - "REVIEW", - vec![ - "No working tree is loaded.".to_owned(), - "No approval has been requested.".to_owned(), - "0 files selected".to_owned(), - ], - ), - }; - PanelView { - id, - kind, - title: panel.title.clone(), - badge: badge.to_owned(), - target: panel.target.clone(), - status: PaneStatus::Ready, - lines, - output_source: if panel.kind == PanelKind::Terminal { - OutputSource::External - } else { - OutputSource::Deterministic - }, - } - } - - fn terminal_view(&self, pane: PanelId) -> gpui::AnyElement { - let terminal = self - .live_terminals - .get(&pane) - .expect("external terminal pane has live state"); - let rows = terminal_paint_rows(&terminal.snapshot) - .into_iter() - .map(|runs| { - div() - .flex() - .h(px(TERMINAL_CELL_HEIGHT)) - .flex_none() - .children(runs.into_iter().map(Self::terminal_run)) - }) - .collect::>(); - div() - .flex() - .flex_col() - .size_full() - .overflow_hidden() - .bg(rgb(BG)) - .font_family("monospace") - .text_size(px(13.0)) - .children(rows) - .into_any_element() - } - - fn pane_context( - &self, - pane: &PanelView, - selected: bool, - cx: &mut Context, - ) -> gpui::AnyElement { - let pane_id = pane.id; - let can_detach = self.panels.attached_count() > 1; - let external = pane.output_source == OutputSource::External; - let live_terminal = external.then(|| { - self.live_terminals - .get(&pane_id) - .expect("external terminal pane has live state") - }); - let status = live_terminal.map_or(pane.badge.as_str(), |terminal| terminal.status.badge()); - let detail = - live_terminal.map_or_else(|| pane.target.clone(), |terminal| terminal.status.detail()); - let surface_status = live_terminal.map_or_else( - || status.to_owned(), - |terminal| { - let dimensions = terminal.terminal.dimensions(); - if terminal.snapshot.display_offset > 0 { - format!( - "{} · ↑{} · {}×{}", - status, - terminal.snapshot.display_offset, - dimensions.columns(), - dimensions.rows() - ) - } else { - format!( - "{} · {}×{}", - status, - dimensions.columns(), - dimensions.rows() - ) - } - }, - ); - let native = SurfaceTab::native_for(pane.kind); - let shown = self.surface_for(pane.id, pane.kind); - let tabs = SurfaceTab::ALL - .into_iter() - .map(|tab| { - let active = tab == shown; - let provided = tab == native; - div() - .id(("surface-tab", pane_id.get() * 16 + tab.ordinal())) - .cursor_pointer() - .h_full() - .flex() - .items_center() - .px_3() - .text_xs() - // Provided but unselected reads as available; unprovided - // stays dim, so the tab strip shows what this pane can do - // before you click rather than after. - .text_color(rgb(if active { - ACCENT - } else if provided { - TEXT - } else { - MUTED - })) - .when(active, |view| view.border_b_2().border_color(rgb(ACCENT))) - .hover(|view| view.bg(rgb(PANEL_ACTIVE)).text_color(rgb(TEXT))) - .child(tab.label()) - .on_click(cx.listener(move |shell, _, window, cx| { - cx.stop_propagation(); - shell.select_surface(pane_id, tab, window, cx); - })) - }) - .collect::>(); - - div() - .flex() - .flex_col() - .size_full() - .min_h_0() - .overflow_hidden() - .px_3() - .py_2() - .bg(rgb(if selected { PANEL_ACTIVE } else { PANEL_ALT })) - .border_b_1() - .border_color(rgb(BORDER)) - .child( - div() - .flex() - .items_center() - .justify_between() - .gap_2() - .child( - div() - .min_w_0() - .child( - div() - .truncate() - .text_sm() - .text_color(rgb(TEXT)) - .child(pane.title.clone()), - ) - .child( - div() - .mt_1() - .truncate() - .text_xs() - .text_color(rgb(MUTED)) - .child(detail), - ), - ) - .child( - div() - .flex() - .flex_col() - .items_end() - .flex_none() - .gap_1() - .child( - div() - .text_xs() - .text_color(rgb(if pane.needs_input() { - ATTENTION - } else if selected { - SUCCESS - } else { - MUTED - })) - .child(surface_status), - ) - .child( - div() - .id(("detach-panel", pane_id.get())) - .cursor_pointer() - .px_2() - .py_1() - .rounded(px(4.0)) - .border_1() - .border_color(rgb(BORDER)) - .text_xs() - .text_color(rgb(if can_detach { MUTED } else { BORDER })) - .when(can_detach, |view| { - view.hover(|view| { - view.border_color(rgb(ATTENTION)) - .text_color(rgb(ATTENTION)) - }) - }) - .child(if can_detach { - "− DETACH" - } else { - "LAST PANEL" - }) - .on_click(cx.listener(move |shell, _, window, cx| { - cx.stop_propagation(); - shell.detach_panel(pane_id, window, cx); - })), - ), - ), - ) - .child( - div() - .flex() - .h(px(28.0)) - .flex_none() - .mt_2() - .overflow_hidden() - .border_t_1() - .border_color(rgb(BORDER_QUIET)) - .children(tabs), - ) - .child( - div() - .flex() - .items_center() - .justify_between() - .mt_2() - .text_xs() - .text_color(rgb(MUTED)) - .child("TOOLS · CONTEXT · GOAL") - .child(if pane.needs_input() { - "NEEDS INPUT" - } else if selected { - "KEYBOARD OWNER" - } else { - "RUNNING" - }), - ) - .into_any_element() - } - - /// The surface a panel is currently being viewed through. - fn surface_for(&self, id: PanelId, kind: SurfaceKind) -> SurfaceTab { - self.surfaces - .get(&id) - .copied() - .unwrap_or_else(|| SurfaceTab::native_for(kind)) - } - - /// What a pane shows when asked for a surface it does not provide. - /// - /// It says so, and it says what is still running underneath, because the - /// pane's process identity does not change when the view does. - fn unavailable_surface(&self, pane: &PanelView, shown: SurfaceTab) -> gpui::AnyElement { - let native = SurfaceTab::native_for(pane.kind); - div() - .flex() - .flex_col() - .size_full() - .min_w_0() - .min_h_0() - .overflow_hidden() - .bg(rgb(BG)) - .border_y_1() - .border_color(rgb(BORDER)) - .child( - div() - .flex() - .flex_col() - .gap_2() - .p_4() - .child( - div() - .text_sm() - .text_color(rgb(TEXT)) - .child(format!("{} unavailable", shown.label())), - ) - .child( - div() - .text_xs() - .text_color(rgb(MUTED)) - .child(shown.unavailable_reason()), - ) - .child( - div() - .mt_2() - .text_xs() - .text_color(rgb(SUCCESS)) - .child(format!( - "{} is still this pane's live surface. Nothing was stopped.", - native.label() - )), - ), - ) - .into_any_element() - } - - fn pane_work_surface(&self, pane: &PanelView) -> gpui::AnyElement { - let shown = self.surface_for(pane.id, pane.kind); - if shown != SurfaceTab::native_for(pane.kind) { - return self.unavailable_surface(pane, shown); - } - let external = pane.output_source == OutputSource::External; - let content = if external { - self.terminal_view(pane.id) - } else { - let start = pane.lines.len().saturating_sub(18); - div() - .flex() - .flex_col() - .gap_1() - .size_full() - .overflow_hidden() - .font_family("monospace") - .text_sm() - .text_color(rgb(TEXT)) - .children(pane.lines[start..].iter().cloned()) - .into_any_element() - }; - - div() - .flex() - .flex_col() - .size_full() - .min_w_0() - .min_h_0() - .overflow_hidden() - .bg(rgb(BG)) - .border_y_1() - .border_color(rgb(BORDER)) - .child( - div() - .flex_1() - .min_h_0() - .overflow_hidden() - .p_3() - .child(content), - ) - .into_any_element() - } - - fn pane_decision_region(&self, pane: &PanelView, cx: &mut Context) -> gpui::AnyElement { - let pane_id = pane.id; - let picked = self.shelf_choice.get(&pane_id).copied(); - // Every choice names the capability it would need. None of them holds - // that capability: choosing prepares, the command plane executes. - let choices: [(&'static str, &'static str, &'static str, bool); 3] = if pane.needs_input() { - [ - ("Review request", "inspect scope", "needs Observe", true), - ("Steer…", "edit response", "needs Execute", false), - ("Dismiss", "leave inert", "inert", false), - ] - } else { - [ - ("Continue", "keep moving", "needs Execute", false), - ("Review plan", "inspect commands", "needs Observe", false), - ("Ask…", "refine prompt", "inert", false), - ] - }; - div() - .flex() - .flex_col() - .size_full() - .min_h_0() - .overflow_hidden() - .px_2() - .py_2() - .bg(rgb(PANEL)) - .border_t_1() - .border_color(rgb(BORDER)) - .child( - div() - .flex() - .items_center() - .justify_between() - .text_xs() - .child(div().text_color(rgb(MUTED)).child("DECISION SHELF")) - .child( - div() - .text_color(rgb(if pane.needs_input() { ATTENTION } else { MUTED })) - .child(if pane.needs_input() { - "REVIEW REQUIRED" - } else { - "SUGGESTIONS INERT" - }), - ), - ) - .child(div().flex().flex_col().gap_1().mt_2().children( - choices.into_iter().enumerate().map( - |(index, (label, detail, _capability, attention))| { - let chosen = picked == Some(index); - div() - .id(("shelf-choice", pane_id.get() * 8 + index as u64)) - .cursor_pointer() - .flex() - .items_center() - .justify_between() - .min_w_0() - .px_2() - .py_1() - .rounded(px(4.0)) - .border_1() - .border_color(rgb(if chosen { - ACCENT - } else if attention { - ATTENTION - } else { - BORDER - })) - .bg(rgb(if chosen { PANEL_ACTIVE } else { PANEL_ALT })) - .hover(|view| view.border_color(rgb(ACCENT))) - .text_xs() - .text_color(rgb(TEXT)) - .child(label) - .child(div().truncate().text_color(rgb(MUTED)).child(detail)) - .on_click(cx.listener(move |shell, _, window, cx| { - cx.stop_propagation(); - shell.select_shelf_choice(pane_id, index, window, cx); - })) - }, - ), - )) - .child( - div() - .mt_2() - .text_xs() - .text_color(rgb(if picked.is_some() { ACCENT } else { MUTED })) - .child(picked.map_or_else( - || "Pick one to see what it would need".to_owned(), - |index| { - format!( - "{} · {} · nothing has run", - choices[index].0, choices[index].2 - ) - }, - )), - ) - .into_any_element() - } - - fn workspace_panel( - &self, - pane: &PanelView, - selected: bool, - cx: &mut Context, - ) -> gpui::AnyElement { - let pane_id = pane.id; - div() - .id(("workspace-panel", pane_id.get())) - .cursor_pointer() - .on_click(cx.listener(move |shell, _, window, cx| { - shell.select_pane(pane_id, window, cx); - })) - .flex() - .flex_col() - .size_full() - .min_w_0() - .min_h_0() - .overflow_hidden() - .border_1() - .border_color(rgb(if selected { ACCENT } else { BORDER })) - .child( - div() - .h(relative(0.20)) - .flex_none() - .min_h_0() - .overflow_hidden() - .child(self.pane_context(pane, selected, cx)), - ) - .child( - div() - .h(relative(0.60)) - .flex_none() - .min_h_0() - .overflow_hidden() - .child(self.pane_work_surface(pane)), - ) - .child( - div() - .h(relative(0.20)) - .flex_none() - .min_h_0() - .overflow_hidden() - .child(self.pane_decision_region(pane, cx)), - ) - .into_any_element() - } - - fn command_palette(&self) -> impl IntoElement { - let query = self.model.command_palette().query(); - let prompt = if query.is_empty() { - "Type a command…".to_owned() - } else { - query.to_owned() - }; - - div() - .absolute() - .inset_0() - .flex() - .justify_center() - .items_start() - .pt(px(92.0)) - .bg(gpui::black().opacity(0.72)) - .child( - div() - .w(px(620.0)) - .overflow_hidden() - .bg(rgb(PANEL_ALT)) - .border_1() - .border_color(rgb(ACCENT)) - .rounded(px(8.0)) - .child( - div() - .px_4() - .py_3() - .border_b_1() - .border_color(rgb(BORDER)) - .text_color(rgb(if query.is_empty() { MUTED } else { TEXT })) - .child(prompt), - ) - .child( - div() - .flex() - .flex_col() - .p_2() - .text_sm() - .child( - div() - .px_3() - .py_2() - .rounded(px(5.0)) - .bg(rgb(PANEL_ACTIVE)) - .child("Focus next pane") - .child( - div() - .mt_1() - .text_xs() - .text_color(rgb(MUTED)) - .child("Workspace · navigation"), - ), - ) - .child( - div() - .px_3() - .py_2() - .text_color(rgb(MUTED)) - .child("Add workspace panel") - .child( - div() - .mt_1() - .text_xs() - .child("Alt+Shift+N · choose a surface or reattach"), - ), - ) - .child( - div() - .px_3() - .py_2() - .text_color(rgb(MUTED)) - .child("Detach selected panel") - .child( - div() - .mt_1() - .text_xs() - .child("Alt+Shift+W · session keeps running"), - ), - ) - .child( - div() - .px_3() - .py_2() - .text_color(rgb(MUTED)) - .child("Share selected pane to Buzz…"), - ), - ) - .child( - div() - .flex() - .justify_between() - .px_4() - .py_2() - .border_t_1() - .border_color(rgb(BORDER)) - .text_xs() - .text_color(rgb(MUTED)) - .child("Enter to run") - .child("Esc to close"), - ), - ) - } - - fn add_panel_chooser(&self, cx: &mut Context) -> impl IntoElement { - let kinds = PanelKind::ALL - .into_iter() - .enumerate() - .map(|(index, kind)| { - let shortcut = index + 1; - div() - .id(("create-panel-kind", shortcut)) - .cursor_pointer() - .flex() - .items_center() - .gap_3() - .px_3() - .py_3() - .rounded(px(6.0)) - .border_1() - .border_color(rgb(BORDER)) - .bg(rgb(PANEL)) - .child( - div() - .flex() - .items_center() - .justify_center() - .size(px(34.0)) - .flex_none() - .rounded(px(5.0)) - .bg(rgb(PANEL_ACTIVE)) - .text_color(rgb(ACCENT)) - .child(match kind { - PanelKind::Terminal => ">_", - PanelKind::Browser => "◎", - PanelKind::Markdown => "¶", - PanelKind::Review => "±", - }), - ) - .child( - div() - .min_w_0() - .flex_1() - .child(div().text_sm().text_color(rgb(TEXT)).child(kind.label())) - .child( - div() - .mt_1() - .text_xs() - .text_color(rgb(MUTED)) - .child(kind.description()), - ), - ) - .child( - div() - .flex_none() - .text_xs() - .text_color(rgb(MUTED)) - .child(shortcut.to_string()), - ) - .on_click(cx.listener(move |shell, _, window, cx| { - cx.stop_propagation(); - shell.create_panel(kind, window, cx); - })) - }) - .collect::>(); - let detached = self - .panels - .detached_ids() - .into_iter() - .map(|id| { - let panel = self.panels.panel(id).expect("detached panel exists"); - (id, panel.title.clone(), panel.kind.label()) - }) - .collect::>(); - - div() - .absolute() - .inset_0() - .flex() - .justify_center() - .items_start() - .pt(px(72.0)) - .bg(gpui::black().opacity(0.72)) - .child( - div() - .w(px(620.0)) - .max_h(px(760.0)) - .overflow_hidden() - .rounded(px(9.0)) - .border_1() - .border_color(rgb(ACCENT)) - .bg(rgb(PANEL_ALT)) - .child( - div() - .flex() - .items_start() - .justify_between() - .px_4() - .py_3() - .border_b_1() - .border_color(rgb(BORDER)) - .child( - div() - .child( - div() - .text_lg() - .text_color(rgb(TEXT)) - .child("Add workspace panel"), - ) - .child( - div() - .mt_1() - .text_xs() - .text_color(rgb(MUTED)) - .child("Created beside the selected pane with a persistent local identity."), - ), - ) - .child( - div() - .id("close-add-panel-chooser") - .cursor_pointer() - .px_2() - .py_1() - .rounded(px(4.0)) - .border_1() - .border_color(rgb(BORDER)) - .text_xs() - .text_color(rgb(MUTED)) - .child("ESC") - .on_click(cx.listener(|shell, _, _, cx| { - shell.add_panel_chooser_open = false; - cx.notify(); - })), - ), - ) - .child(div().flex().flex_col().gap_2().p_3().children(kinds)) - .when(!detached.is_empty(), |view| { - view.child( - div() - .px_4() - .pt_2() - .pb_1() - .border_t_1() - .border_color(rgb(BORDER)) - .text_xs() - .text_color(rgb(MUTED)) - .child("REATTACH RUNNING SESSION"), - ) - .children(detached.into_iter().map(|(id, title, kind)| { - div() - .id(("chooser-reattach", id.get())) - .cursor_pointer() - .flex() - .items_center() - .justify_between() - .mx_3() - .mb_2() - .px_3() - .py_2() - .rounded(px(5.0)) - .bg(rgb(PANEL)) - .border_1() - .border_color(rgb(BORDER)) - .child( - div() - .child(div().text_sm().text_color(rgb(TEXT)).child(title)) - .child( - div() - .mt_1() - .text_xs() - .text_color(rgb(MUTED)) - .child(format!("{kind} · pane-{}", id.get())), - ), - ) - .child(div().text_xs().text_color(rgb(ACCENT)).child("REATTACH")) - .on_click(cx.listener(move |shell, _, window, cx| { - shell.add_panel_chooser_open = false; - shell.attach_panel(id, window, cx); - })) - })) - }) - .child( - div() - .flex() - .justify_between() - .px_4() - .py_2() - .border_t_1() - .border_color(rgb(BORDER)) - .text_xs() - .text_color(rgb(MUTED)) - .child("1–4 create · click reattaches") - .child("Esc closes"), - ), - ) - } - - /// Attached panels whose agent is blocked on a human answer. - /// - /// The count is derived rather than declared: a sidebar that claims one - /// pane needs input while no pane is blocked is the same class of untruth - /// as an invented usage number. - fn attention_panels(&self) -> Vec { - self.panels - .attached_ids() - .into_iter() - .map(|id| self.panel_view(id)) - .filter(PanelView::needs_input) - .collect() - } - - /// Where sessions are owned, and what each host is actually doing. - fn runtime_rows(&self) -> Vec { - let running = self - .live_terminals - .values() - .filter(|terminal| matches!(terminal.status, LiveRuntimeStatus::Running { .. })) - .count(); - let total = self.live_terminals.len(); - let local = RuntimeRow { - label: "this machine", - detail: format!("{running}/{total} live PTYs"), - tone: if running == 0 { MUTED } else { SUCCESS }, - }; - // The usage adapter is neither a host nor an endpoint, but its health - // belongs beside them: it is the reason the footer can or cannot answer. - let adapter = RuntimeRow { - label: "usage adapter", - detail: format!( - "{} · {}/{} profiles reporting", - self.usage.probe_status(), - self.usage.reporting_profile_count(), - self.usage.declared_profile_count() - ), - tone: if self.usage.reporting_profile_count() == 0 { - MUTED - } else { - SUCCESS - }, - }; - vec![local, adapter] - } - - /// The standing of every harness, always, regardless of what is selected. - /// - /// The old footer answered only for the selected pane, so the moment you - /// focused a plain shell your quota vanished. This strip keeps every - /// harness on screen and leads with what is left, because that is the - /// question. The selected harness expands with its rate and its trust. - fn footer_usage_zone(&self) -> impl IntoElement { - let active = self - .panels - .panel(self.panels.selected()) - .and_then(|panel| self.usage.profile_for_seed(panel.seed)) - .cloned(); - let segments = self.usage.strip(); - let orphan = active.is_none(); - div() - .flex() - .items_center() - .gap_4() - .when(orphan, |view| { - view.child( - div() - .flex_none() - .text_color(rgb(MUTED)) - .child("no harness on this pane"), - ) - }) - // The harness name is printed once per group. Repeating - // "CLAUDE CODE" in front of four of its own windows spends the - // strip's width on a word the eye has already read. - .children({ - let mut previous: Option = None; - segments - .into_iter() - .map(|segment| { - let repeats = previous.as_deref() == Some(segment.label.as_str()); - previous = Some(segment.label.clone()); - let selected = active.as_ref() == Some(&segment.id); - usage_segment(segment, selected, repeats) - }) - .collect::>() - }) - } -} - -/// The provenance of a value is carried by the colour of its meter, so the -/// strip reads at a glance without a legend on every segment. -const fn provenance_color(provenance: UsageProvenance) -> u32 { - match provenance { - UsageProvenance::ProviderReported => SUCCESS, - UsageProvenance::HarnessReported => ACCENT, - UsageProvenance::LocallyMeasured => TEXT, - UsageProvenance::Estimated => ATTENTION, - UsageProvenance::Unavailable => MUTED, - } -} - -/// A quota meter. The filled part is spent; the empty part is what is left, -/// which is the way round an engineer reads it. -fn usage_meter(consumed_permille: Option, color: u32) -> impl IntoElement { - let Some(permille) = consumed_permille else { - // No capsule. A full-length empty gauge reads as "plenty left" from - // across the room, which is the opposite of the truth. A hairline is - // visibly not a measurement. - return div() - .w(px(80.0)) - .h(px(2.0)) - .flex_none() - .bg(rgb(BORDER)) - .into_any_element(); - }; - let clamped = u16::try_from(permille.min(1_000)).unwrap_or(1_000); - div() - .w(px(80.0)) - .h(px(8.0)) - .flex_none() - .rounded(px(4.0)) - .bg(rgb(BORDER_QUIET)) - .overflow_hidden() - .child( - div() - .h_full() - .w(relative(f32::from(clamped) / 1_000.0)) - .bg(rgb(color)), - ) - .into_any_element() -} - -/// One quota in the strip. -/// -/// `continues_group` means the harness above this one is the same, so its name -/// is left off and only the window is named. -fn usage_segment(segment: UsageSegment, selected: bool, continues_group: bool) -> impl IntoElement { - let color = provenance_color(segment.provenance); - let name_color = if selected { TEXT } else { MUTED }; - let headline_color = if segment.headline.is_none() { - MUTED - } else if segment.critical { - ATTENTION - } else { - TEXT - }; - div() - .flex() - .items_center() - .gap_2() - .when(selected, |view| { - view.px_2().py_1().rounded(px(4.0)).bg(rgb(PANEL_ACTIVE)) - }) - .when(!continues_group, |view| { - view.child( - div() - .flex_none() - .text_color(rgb(name_color)) - .child(segment.label), - ) - }) - // A quiet pill rather than more running text. The window's name is a - // label on the number, not another number, and at BORDER weight it was - // simply invisible. - .child( - div() - .flex_none() - .px(px(5.0)) - .py(px(1.0)) - .rounded(px(3.0)) - .bg(rgb(if selected { BORDER } else { BORDER_QUIET })) - .text_color(rgb(if selected { TEXT } else { MUTED })) - .child(segment.scope), - ) - .child(usage_meter(segment.consumed_permille, color)) - .child( - div() - .flex_none() - .text_color(rgb(headline_color)) - .child(segment.headline.unwrap_or_else(|| "no reading".to_owned())), - ) - .when_some(segment.reset, |view, reset| { - view.child(div().flex_none().text_color(rgb(MUTED)).child(reset)) - }) - // Only the harness you are looking at spends footer width on its rate - // and its trust. The rest stay one glance wide. - .when(selected, |view| { - view.child(footer_separator()) - .child( - div() - .flex_none() - .text_color(rgb(provenance_color(segment.burn_provenance))) - .child(segment.burn), - ) - .child(provenance_chip(&segment.trust, segment.provenance)) - }) -} - -/// One host or endpoint row in the sidebar's runtime list. -struct RuntimeRow { - label: &'static str, - detail: String, - tone: u32, -} - -fn footer_separator() -> impl IntoElement { - div().text_color(rgb(BORDER)).child("│") -} - -/// The trust marker. Its colour is the provenance, never the value. -fn provenance_chip(text: &str, provenance: UsageProvenance) -> impl IntoElement { - let color = match provenance { - UsageProvenance::ProviderReported => SUCCESS, - UsageProvenance::HarnessReported => ACCENT, - UsageProvenance::LocallyMeasured => TEXT, - UsageProvenance::Estimated => ATTENTION, - UsageProvenance::Unavailable => MUTED, - }; - div() - .px_2() - .py(px(1.0)) - .rounded(px(3.0)) - .border_1() - .border_color(rgb(color)) - .text_color(rgb(color)) - .child(text.to_owned()) -} - -impl Render for LumbridgeShell { - fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { - let panel_capacity = visible_panel_count(window.bounds().size); - let attached_panes = self.panels.attached_ids(); - let attached_count = attached_panes.len(); - let detached_entries = self - .panels - .detached_ids() - .into_iter() - .map(|pane| { - let title = self - .panels - .panel(pane) - .expect("detached panel exists") - .title - .clone(); - (pane, title) - }) - .collect::>(); - let detached_count = detached_entries.len(); - let visible_count = panel_capacity.min(attached_count).max(1); - let running_runtime_count = self - .live_terminals - .values() - .filter(|terminal| matches!(terminal.status, LiveRuntimeStatus::Running { .. })) - .count(); - let runtime_summary = format!( - "{running_runtime_count}/{} LIVE PTYS", - self.live_terminals.len() - ); - let attention_panels = self.attention_panels(); - let sidebar = div() - .flex() - .flex_col() - .w(px(248.0)) - .flex_none() - .bg(rgb(PANEL)) - .border_r_1() - .border_color(rgb(BORDER_QUIET)) - .child( - div() - .px_4() - .pt_4() - .pb_2() - .text_xs() - .text_color(rgb(if attention_panels.is_empty() { - MUTED - } else { - ATTENTION - })) - .child(format!("ATTENTION · {}", attention_panels.len())), - ) - .when(attention_panels.is_empty(), |view| { - view.child( - div() - .mx_2() - .mb_3() - .px_3() - .py_2() - .text_xs() - .text_color(rgb(MUTED)) - .child("No pane is waiting on you"), - ) - }) - .children(attention_panels.into_iter().map(|pane| { - let id = pane.id; - div() - .id(("attention-panel", id.get())) - .cursor_pointer() - .mx_2() - .mb_3() - .px_3() - .py_2() - .rounded(px(5.0)) - .bg(rgb(PANEL_ACTIVE)) - .border_1() - .border_color(rgb(ATTENTION)) - .hover(|view| view.bg(rgb(PANEL_ALT))) - .child(div().text_sm().text_color(rgb(TEXT)).child(pane.title)) - .child( - div() - .mt_1() - .text_xs() - .text_color(rgb(MUTED)) - .child(pane.target), - ) - .on_click(cx.listener(move |shell, _, window, cx| { - shell.select_pane(id, window, cx); - })) - })) - .child( - div() - .mt_3() - .px_4() - .py_2() - .text_xs() - .text_color(rgb(MUTED)) - .child("RUNTIMES"), - ) - .children(self.runtime_rows().into_iter().map(|row| { - div() - .px_4() - .py_1() - .child(div().text_sm().text_color(rgb(row.tone)).child(row.label)) - .child(div().text_xs().text_color(rgb(MUTED)).child(row.detail)) - })) - .child( - div() - .px_4() - .pt_2() - .text_xs() - .text_color(rgb(MUTED)) - .child(self.persistence_status.clone()), - ) - .child( - div() - .mt_3() - .px_4() - .py_2() - .text_xs() - .text_color(rgb(MUTED)) - .child(format!("DETACHED SESSIONS · {detached_count}")), - ) - .children(detached_entries.into_iter().map(|(pane, title)| { - div() - .id(("detached-session", pane.get())) - .cursor_pointer() - .mx_2() - .mb_1() - .px_3() - .py_2() - .rounded(px(4.0)) - .border_1() - .border_color(rgb(BORDER_QUIET)) - .hover(|view| view.border_color(rgb(ACCENT)).text_color(rgb(TEXT))) - .text_xs() - .text_color(rgb(MUTED)) - .child(format!("↪ {title}")) - .on_click(cx.listener(move |shell, _, window, cx| { - shell.attach_panel(pane, window, cx); - })) - })) - .child(div().flex_1()); - - let tabs = div() - .flex() - .items_center() - .h(px(38.0)) - .flex_none() - .px_2() - .gap_1() - .bg(rgb(PANEL)) - .border_b_1() - .border_color(rgb(BORDER_QUIET)) - // One tab, because there is one workspace. Two more used to sit - // here looking like navigation and doing nothing. - .child( - div() - .h_full() - .flex() - .items_center() - .px_3() - .border_b_2() - .border_color(rgb(ACCENT)) - .text_sm() - .child("Lumbridge Code"), - ) - .child(div().flex_1()) - .child(div().px_3().text_xs().text_color(rgb(MUTED)).child(format!( - "{visible_count} shown · {attached_count} attached · {detached_count} detached" - ))) - .child( - div() - .id("add-workspace-panel") - .cursor_pointer() - .ml_2() - .px_3() - .py_1() - .rounded(px(4.0)) - .border_1() - .border_color(rgb(ACCENT)) - .text_xs() - .text_color(rgb(ACCENT)) - .child("+ ADD PANEL ▾") - .on_click(cx.listener(|shell, _, window, cx| { - shell.dispatch(ShellAction::CloseCommandPalette); - shell.add_panel_chooser_open = !shell.add_panel_chooser_open; - window.focus(&shell.root_focus); - cx.notify(); - })), - ); - - let selected_position = attached_panes - .iter() - .position(|pane| *pane == self.panels.selected()) - .expect("the selected pane must remain attached"); - let panel_range = visible_panel_range(attached_count, selected_position, visible_count); - let workspace_panels = panel_range - .map(|index| { - let pane = self.panel_view(attached_panes[index]); - div() - .flex_1() - .min_w_0() - .min_h_0() - .child(self.workspace_panel(&pane, pane.id == self.panels.selected(), cx)) - }) - .collect::>(); - let workspace_row = div() - .flex() - .gap_1() - .flex_1() - .min_w_0() - .min_h_0() - .overflow_hidden() - .children(workspace_panels); - - let counters = self.model.counters(); - let terminal_revision = self - .live_terminals - .values() - .map(|terminal| terminal.terminal.revision()) - .sum::(); - let footer_left = format!( - "rev {} · {} PTYs · VT rev {} · {} focus · {} VT snapshots · {} synthetic lines", - self.model.revision(), - self.runtimes.len(), - terminal_revision, - counters.focus_moves, - counters.external_snapshot_updates, - counters.terminal_lines_appended - ); - let timing = self.timing.summary(); - - let root = div() - .id("lumbridge-shell") - .relative() - .track_focus(&self.root_focus) - .key_context("LumbridgeShell") - .on_click(cx.listener(|shell, _, window, _| { - window.focus(&shell.root_focus); - })) - .on_action(cx.listener(Self::focus_left)) - .on_action(cx.listener(Self::focus_right)) - .on_action(cx.listener(Self::focus_up)) - .on_action(cx.listener(Self::focus_down)) - .on_action(cx.listener(Self::open_palette)) - .on_action(cx.listener(Self::close_palette)) - .on_action(cx.listener(Self::add_panel_action)) - .on_action(cx.listener(Self::detach_selected_panel)) - .on_action(cx.listener(Self::terminal_taller)) - .on_action(cx.listener(Self::terminal_shorter)) - .on_action(cx.listener(Self::terminal_wider)) - .on_action(cx.listener(Self::terminal_narrower)) - .on_action(cx.listener(|shell, _: &SelectPane1, window, cx| { - shell.select_pane_at(0, window, cx); - })) - .on_action(cx.listener(|shell, _: &SelectPane2, window, cx| { - shell.select_pane_at(1, window, cx); - })) - .on_action(cx.listener(|shell, _: &SelectPane3, window, cx| { - shell.select_pane_at(2, window, cx); - })) - .on_action(cx.listener(|shell, _: &SelectPane4, window, cx| { - shell.select_pane_at(3, window, cx); - })) - .on_action(cx.listener(|shell, _: &SelectPane5, window, cx| { - shell.select_pane_at(4, window, cx); - })) - .on_action(cx.listener(|shell, _: &SelectPane6, window, cx| { - shell.select_pane_at(5, window, cx); - })) - .on_key_down(cx.listener(Self::on_key_down)) - .flex() - .flex_col() - .size_full() - .bg(rgb(BG)) - .text_color(rgb(TEXT)) - .child( - div() - .flex() - .items_center() - .h(px(48.0)) - .flex_none() - .px_4() - .bg(rgb(PANEL_ALT)) - .border_b_1() - .border_color(rgb(BORDER_QUIET)) - .child(div().text_lg().child("Lumbridge")) - .child( - div() - .ml_3() - .text_sm() - .text_color(rgb(MUTED)) - .child("Lumbridge Code"), - ) - .child(div().flex_1()) - // The same tone rule runtime_rows applies: nothing live is - // not a success, and "0/5 LIVE PTYS" in green said it was. - .child( - div() - .mr_4() - .text_xs() - .text_color(rgb(if running_runtime_count == 0 { - MUTED - } else { - SUCCESS - })) - .child(runtime_summary), - ) - .child( - div() - .text_sm() - .text_color(rgb(ACCENT)) - .child("Ctrl/⌘ K · Commands"), - ), - ) - .child( - div().flex().flex_1().min_h_0().child(sidebar).child( - div() - .flex() - .flex_col() - .flex_1() - .min_w_0() - .min_h_0() - .overflow_hidden() - .child(tabs) - .child(workspace_row), - ), - ) - .child( - div() - .flex() - .items_center() - .justify_between() - .h(px(APP_FOOTER_HEIGHT)) - .flex_none() - .px_3() - .gap_4() - .bg(rgb(PANEL_ALT)) - .border_t_1() - .border_color(rgb(BORDER_QUIET)) - .text_xs() - .text_color(rgb(MUTED)) - .child( - div() - .flex() - .flex_col() - .flex_none() - .min_w_0() - .child(div().truncate().child(footer_left)) - .child(div().truncate().child(timing)), - ) - .child(div().flex_1()) - .child(self.footer_usage_zone()), - ) - .when(self.model.command_palette().is_open(), |view| { - view.child(self.command_palette()) - }) - .when(self.add_panel_chooser_open, |view| { - view.child(self.add_panel_chooser(cx)) - }); - self.timing.observe_element_build(); - root - } -} - -fn key_modifiers(event: &KeyDownEvent) -> KeyModifiers { - let mut modifiers = KeyModifiers::default(); - if event.keystroke.modifiers.shift { - modifiers = modifiers.union(KeyModifiers::SHIFT); - } - if event.keystroke.modifiers.alt { - modifiers = modifiers.union(KeyModifiers::ALT); - } - if event.keystroke.modifiers.control { - modifiers = modifiers.union(KeyModifiers::CONTROL); - } - if event.keystroke.modifiers.platform { - modifiers = modifiers.union(KeyModifiers::PLATFORM); - } - modifiers -} - -fn terminal_key_from_parts( - key: &str, - key_char: Option<&str>, - modifiers: KeyModifiers, -) -> Option { - let key = match key { - "enter" => TerminalKey::Enter, - "backspace" => TerminalKey::Backspace, - "tab" => TerminalKey::Tab, - "escape" => TerminalKey::Escape, - "up" => TerminalKey::Up, - "down" => TerminalKey::Down, - "left" => TerminalKey::Left, - "right" => TerminalKey::Right, - "home" => TerminalKey::Home, - "end" => TerminalKey::End, - "insert" => TerminalKey::Insert, - "delete" => TerminalKey::Delete, - "pageup" => TerminalKey::PageUp, - "pagedown" => TerminalKey::PageDown, - function - if function.strip_prefix('f').is_some_and(|suffix| { - !suffix.is_empty() && suffix.bytes().all(|byte| byte.is_ascii_digit()) - }) => - { - let number = function.strip_prefix('f')?.parse::().ok()?; - TerminalKey::Function(number) - } - _ if !modifiers.contains(KeyModifiers::PLATFORM) => TerminalKey::Text(key_char?.to_owned()), - _ => return None, - }; - Some(TerminalKeyEvent { key, modifiers }) -} - -fn terminal_scroll_from_parts(key: &str, modifiers: KeyModifiers) -> Option { - if !modifiers.contains(KeyModifiers::SHIFT) { - return None; - } - match key { - "pageup" => Some(TerminalScroll::PageUp), - "pagedown" => Some(TerminalScroll::PageDown), - "home" => Some(TerminalScroll::Top), - "end" => Some(TerminalScroll::Bottom), - _ => None, - } -} - -fn live_pty_script(seed: Option) -> &'static str { - match seed { - Some(SeedPane::CodexRuntime) => { - "printf 'Codex runtime · independent Lumbridge PTY\\n'; exec /bin/sh -i" - } - Some(SeedPane::ClaudeUi) => { - "printf 'Claude workspace · independent Lumbridge PTY\\n'; exec /bin/sh -i" - } - Some(SeedPane::PiDocs) => { - "printf 'Pi docs · independent Lumbridge PTY\\n'; exec /bin/sh -i" - } - None => "printf 'Lumbridge terminal · persistent pane identity\\n'; exec /bin/sh -i", - Some(SeedPane::Architecture | SeedPane::AcpPreview | SeedPane::RuntimeReview) => { - unreachable!("only terminal fixtures own live PTYs") - } - } -} - -fn spawn_live_runtime( - runtimes: &mut RuntimeRegistry, - pane: PanelId, - seed: Option, - dimensions: TerminalDimensions, -) -> Result<(), RuntimeRegistryError> { - let command = CommandConfig::new("/bin/sh") - .map_err(RuntimeActorError::Start)? - .args(["-c", live_pty_script(seed)]); - let pty_size = TerminalSize::new(dimensions.rows(), dimensions.columns()) - .map_err(RuntimeActorError::Start)?; - runtimes.spawn( - pane, - command, - PtyOptions::new(pty_size), - RuntimeActorOptions::default(), - )?; - Ok(()) -} - -fn main() { - Application::new().run(|cx: &mut App| { - cx.bind_keys([ - KeyBinding::new("alt-left", FocusLeft, Some("LumbridgeShell")), - KeyBinding::new("alt-right", FocusRight, Some("LumbridgeShell")), - KeyBinding::new("alt-up", FocusUp, Some("LumbridgeShell")), - KeyBinding::new("alt-down", FocusDown, Some("LumbridgeShell")), - KeyBinding::new("secondary-k", OpenPalette, Some("LumbridgeShell")), - KeyBinding::new("alt-1", SelectPane1, Some("LumbridgeShell")), - KeyBinding::new("alt-2", SelectPane2, Some("LumbridgeShell")), - KeyBinding::new("alt-3", SelectPane3, Some("LumbridgeShell")), - KeyBinding::new("alt-4", SelectPane4, Some("LumbridgeShell")), - KeyBinding::new("alt-5", SelectPane5, Some("LumbridgeShell")), - KeyBinding::new("alt-6", SelectPane6, Some("LumbridgeShell")), - KeyBinding::new("alt-shift-n", AddPanel, Some("LumbridgeShell")), - KeyBinding::new("alt-shift-w", DetachSelectedPanel, Some("LumbridgeShell")), - KeyBinding::new("alt-shift-up", TerminalTaller, Some("LumbridgeShell")), - KeyBinding::new("alt-shift-down", TerminalShorter, Some("LumbridgeShell")), - KeyBinding::new("alt-shift-right", TerminalWider, Some("LumbridgeShell")), - KeyBinding::new("alt-shift-left", TerminalNarrower, Some("LumbridgeShell")), - ]); - - let bounds = Bounds::centered(None, size(px(1500.0), px(960.0)), cx); - cx.open_window( - WindowOptions { - window_bounds: Some(WindowBounds::Windowed(bounds)), - titlebar: Some(gpui::TitlebarOptions { - title: Some("Lumbridge · GPUI workspace".into()), - ..Default::default() - }), - ..Default::default() - }, - |window, cx| cx.new(|cx| LumbridgeShell::new(window, cx)), - ) - .expect("GPUI workspace window should open"); - cx.activate(true); - }); -} - -#[cfg(test)] -mod tests { - use super::{ - KeyModifiers, TerminalEngine, TerminalEngineOptions, TerminalKey, TerminalScroll, - indexed_terminal_color, terminal_dimensions_for_window, terminal_key_from_parts, - terminal_paint_rows, terminal_scroll_from_parts, visible_panel_count, visible_panel_range, - }; - use gpui::{px, size}; - - #[test] - fn maps_named_and_composed_gpui_keys_to_terminal_input() { - let enter = terminal_key_from_parts("enter", None, KeyModifiers::default()).unwrap(); - assert_eq!(enter.key, TerminalKey::Enter); - - let literal_f = terminal_key_from_parts("f", Some("f"), KeyModifiers::default()).unwrap(); - assert_eq!(literal_f.key, TerminalKey::Text("f".into())); - - let function = terminal_key_from_parts("f12", None, KeyModifiers::default()).unwrap(); - assert_eq!(function.key, TerminalKey::Function(12)); - - let composed = terminal_key_from_parts("é", Some("é"), KeyModifiers::default()).unwrap(); - assert_eq!(composed.key, TerminalKey::Text("é".into())); - } - - #[test] - fn reserves_platform_text_shortcuts_for_the_workspace() { - assert!(terminal_key_from_parts("c", Some("c"), KeyModifiers::PLATFORM).is_none()); - let control = terminal_key_from_parts("c", Some("c"), KeyModifiers::CONTROL).unwrap(); - assert_eq!(control.key, TerminalKey::Text("c".into())); - } - - #[test] - fn terminal_geometry_tracks_middle_sixty_percent_per_panel() { - let dimensions = terminal_dimensions_for_window(size(px(1500.0), px(960.0)), 5); - assert_eq!(dimensions.rows(), 26); - assert_eq!(dimensions.columns(), 45); - - let ultrawide = size(px(3440.0), px(1440.0)); - assert_eq!(visible_panel_count(ultrawide), 5); - let dimensions = terminal_dimensions_for_window(ultrawide, 5); - assert_eq!(dimensions.rows(), 42); - assert_eq!(dimensions.columns(), 71); - - let two_panels = terminal_dimensions_for_window(ultrawide, 2); - assert_eq!(two_panels.rows(), 42); - assert_eq!(two_panels.columns(), 185); - } - - #[test] - fn panel_window_keeps_the_selected_pane_visible() { - assert_eq!(visible_panel_range(6, 0, 5), 0..5); - assert_eq!(visible_panel_range(6, 5, 5), 1..6); - assert_eq!(visible_panel_range(6, 3, 3), 2..5); - assert_eq!(visible_panel_range(6, 4, 1), 4..5); - } - - #[test] - fn shift_navigation_controls_scrollback_without_reaching_the_pty() { - assert_eq!( - terminal_scroll_from_parts("pageup", KeyModifiers::SHIFT), - Some(TerminalScroll::PageUp) - ); - assert_eq!( - terminal_scroll_from_parts("end", KeyModifiers::SHIFT), - Some(TerminalScroll::Bottom) - ); - assert_eq!( - terminal_scroll_from_parts("pageup", KeyModifiers::default()), - None - ); - } - - #[test] - fn terminal_paint_rows_merge_runs_and_preserve_cursor_boundary() { - let mut terminal = TerminalEngine::new(TerminalEngineOptions::default()); - terminal.process(b"\x1b[31mAB\x1b[0m"); - let rows = terminal_paint_rows(&terminal.snapshot()); - assert!( - rows[0] - .iter() - .any(|run| run.text == "AB" && run.columns == 2) - ); - assert!(rows[0].iter().any(|run| run.cursor.is_some())); - } - - #[test] - #[allow( - clippy::unreadable_literal, - reason = "six-digit colour hex reads whole" - )] - fn xterm_color_cube_and_grayscale_are_deterministic() { - assert_eq!(indexed_terminal_color(16), 0x000000); - assert_eq!(indexed_terminal_color(231), 0xffffff); - assert_eq!(indexed_terminal_color(232), 0x080808); - assert_eq!(indexed_terminal_color(255), 0xeeeeee); - } -} diff --git a/spikes/ui-shell-model/Cargo.lock b/spikes/ui-shell-model/Cargo.lock deleted file mode 100644 index ed25bcf..0000000 --- a/spikes/ui-shell-model/Cargo.lock +++ /dev/null @@ -1,7 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "lumbridge-spike-model" -version = "0.0.1" diff --git a/spikes/ui-shell-model/Cargo.toml b/spikes/ui-shell-model/Cargo.toml deleted file mode 100644 index d605bda..0000000 --- a/spikes/ui-shell-model/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -name = "lumbridge-spike-model" -description = "Identical fixture data for Lumbridge native UI comparisons" -version = "0.0.1" -edition = "2024" -rust-version = "1.94" -license = "Apache-2.0" -publish = false - -[lib] -path = "src/lib.rs" - -[workspace]