From 2cddf89717dfb779164df0434b8fbe7ed77175ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E7=94=B5=E8=8A=BD=E8=A1=A3?= Date: Sun, 19 Apr 2026 01:02:20 -0400 Subject: [PATCH] feat(agentcompany-rust): scaffold native shell and runtime bridge --- .gitignore | 3 - AgentCompany-Rust/.gitignore | 2 + AgentCompany-Rust/Cargo.lock | 7427 +++++++++++++++++ AgentCompany-Rust/Cargo.toml | 42 + AgentCompany-Rust/crates/app/Cargo.toml | 17 + AgentCompany-Rust/crates/app/src/main.rs | 13 + .../crates/app_models/Cargo.toml | 9 + .../crates/app_models/src/actions.rs | 13 + .../crates/app_models/src/lib.rs | 5 + .../crates/app_models/src/state.rs | 22 + AgentCompany-Rust/crates/app_ui/Cargo.toml | 14 + .../crates/app_ui/src/app_root.rs | 1009 +++ AgentCompany-Rust/crates/app_ui/src/lib.rs | 37 + .../crates/app_ui/src/widgets/button.rs | 49 + .../crates/app_ui/src/widgets/mod.rs | 2 + .../crates/app_ui/src/widgets/text_input.rs | 447 + AgentCompany-Rust/crates/domain/Cargo.toml | 10 + .../crates/domain/src/catalog.rs | 139 + AgentCompany-Rust/crates/domain/src/enums.rs | 130 + AgentCompany-Rust/crates/domain/src/lib.rs | 9 + AgentCompany-Rust/crates/domain/src/models.rs | 213 + .../crates/domain/src/snapshot.rs | 71 + AgentCompany-Rust/crates/pi_bridge/Cargo.toml | 12 + .../crates/pi_bridge/src/client.rs | 79 + AgentCompany-Rust/crates/pi_bridge/src/lib.rs | 5 + .../crates/pi_bridge/src/protocol.rs | 98 + AgentCompany-Rust/crates/runtime/Cargo.toml | 13 + AgentCompany-Rust/crates/runtime/src/lib.rs | 3 + .../crates/runtime/src/service.rs | 51 + .../crates/runtime/tests/sidecar_contract.rs | 170 + AgentCompany-Rust/crates/storage/Cargo.toml | 17 + AgentCompany-Rust/crates/storage/src/lib.rs | 4 + .../crates/storage/src/schema.rs | 343 + AgentCompany-Rust/crates/storage/src/store.rs | 711 ++ .../crates/storage/tests/profile_store_e2e.rs | 61 + AgentCompany-Rust/crates/support/Cargo.toml | 11 + AgentCompany-Rust/crates/support/src/lib.rs | 2 + AgentCompany-Rust/crates/support/src/paths.rs | 30 + AgentCompany-Rust/crates/support/src/time.rs | 8 + AgentCompany-Rust/rust-toolchain.toml | 2 + 40 files changed, 11300 insertions(+), 3 deletions(-) create mode 100644 AgentCompany-Rust/.gitignore create mode 100644 AgentCompany-Rust/Cargo.lock create mode 100644 AgentCompany-Rust/Cargo.toml create mode 100644 AgentCompany-Rust/crates/app/Cargo.toml create mode 100644 AgentCompany-Rust/crates/app/src/main.rs create mode 100644 AgentCompany-Rust/crates/app_models/Cargo.toml create mode 100644 AgentCompany-Rust/crates/app_models/src/actions.rs create mode 100644 AgentCompany-Rust/crates/app_models/src/lib.rs create mode 100644 AgentCompany-Rust/crates/app_models/src/state.rs create mode 100644 AgentCompany-Rust/crates/app_ui/Cargo.toml create mode 100644 AgentCompany-Rust/crates/app_ui/src/app_root.rs create mode 100644 AgentCompany-Rust/crates/app_ui/src/lib.rs create mode 100644 AgentCompany-Rust/crates/app_ui/src/widgets/button.rs create mode 100644 AgentCompany-Rust/crates/app_ui/src/widgets/mod.rs create mode 100644 AgentCompany-Rust/crates/app_ui/src/widgets/text_input.rs create mode 100644 AgentCompany-Rust/crates/domain/Cargo.toml create mode 100644 AgentCompany-Rust/crates/domain/src/catalog.rs create mode 100644 AgentCompany-Rust/crates/domain/src/enums.rs create mode 100644 AgentCompany-Rust/crates/domain/src/lib.rs create mode 100644 AgentCompany-Rust/crates/domain/src/models.rs create mode 100644 AgentCompany-Rust/crates/domain/src/snapshot.rs create mode 100644 AgentCompany-Rust/crates/pi_bridge/Cargo.toml create mode 100644 AgentCompany-Rust/crates/pi_bridge/src/client.rs create mode 100644 AgentCompany-Rust/crates/pi_bridge/src/lib.rs create mode 100644 AgentCompany-Rust/crates/pi_bridge/src/protocol.rs create mode 100644 AgentCompany-Rust/crates/runtime/Cargo.toml create mode 100644 AgentCompany-Rust/crates/runtime/src/lib.rs create mode 100644 AgentCompany-Rust/crates/runtime/src/service.rs create mode 100644 AgentCompany-Rust/crates/runtime/tests/sidecar_contract.rs create mode 100644 AgentCompany-Rust/crates/storage/Cargo.toml create mode 100644 AgentCompany-Rust/crates/storage/src/lib.rs create mode 100644 AgentCompany-Rust/crates/storage/src/schema.rs create mode 100644 AgentCompany-Rust/crates/storage/src/store.rs create mode 100644 AgentCompany-Rust/crates/storage/tests/profile_store_e2e.rs create mode 100644 AgentCompany-Rust/crates/support/Cargo.toml create mode 100644 AgentCompany-Rust/crates/support/src/lib.rs create mode 100644 AgentCompany-Rust/crates/support/src/paths.rs create mode 100644 AgentCompany-Rust/crates/support/src/time.rs create mode 100644 AgentCompany-Rust/rust-toolchain.toml diff --git a/.gitignore b/.gitignore index b645d930..8f35c826 100644 --- a/.gitignore +++ b/.gitignore @@ -50,9 +50,6 @@ Thumbs.db # Local reference material oldreference/ -# Future rewrite — not part of the TypeScript app tree. -AgentCompany-Rust/ - # Markdown docs *.md !/README.md diff --git a/AgentCompany-Rust/.gitignore b/AgentCompany-Rust/.gitignore new file mode 100644 index 00000000..05923927 --- /dev/null +++ b/AgentCompany-Rust/.gitignore @@ -0,0 +1,2 @@ +/target +.DS_Store diff --git a/AgentCompany-Rust/Cargo.lock b/AgentCompany-Rust/Cargo.lock new file mode 100644 index 00000000..07e346d0 --- /dev/null +++ b/AgentCompany-Rust/Cargo.lock @@ -0,0 +1,7427 @@ +# 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", + "zeroize", +] + +[[package]] +name = "agentcompany_app" +version = "0.1.0" +dependencies = [ + "anyhow", + "app_ui", + "parking_lot", + "storage", + "support", +] + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[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.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "app_models" +version = "0.1.0" +dependencies = [ + "domain", +] + +[[package]] +name = "app_ui" +version = "0.1.0" +dependencies = [ + "app_models", + "domain", + "gpui", + "parking_lot", + "storage", + "unicode-segmentation", +] + +[[package]] +name = "ar_archive_writer" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eb93bbb63b9c227414f6eb3a0adfddca591a8ce1e9b60661bb08969b87e340b" +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.117", +] + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[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.4", + "serde", + "serde_repr", + "url", + "wayland-backend", + "wayland-client", + "wayland-protocols 0.32.12", + "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.4", + "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.1", + "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.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f9ee0f6e02ffd7ad5816e9464499fba7b3effd01123b515c41d1697c43dad1" +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.4.1", + "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.1", + "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.1", + "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.117", +] + +[[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.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[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.18", + "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.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "375082f007bd67184fb9c0374614b29f9aaa604ec301635f72338bb65386a53d" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bindgen" +version = "0.71.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" +dependencies = [ + "bitflags 2.11.1", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash 2.1.2", + "shlex", + "syn 2.0.117", +] + +[[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.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" + +[[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.11.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.117", +] + +[[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-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.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel 2.5.0", + "async-task", + "futures-io", + "futures-lite 2.6.1", + "piper", +] + +[[package]] +name = "bstr" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "built" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64" + +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[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.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" + +[[package]] +name = "calloop" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" +dependencies = [ + "bitflags 2.11.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.117", + "tempfile", + "toml 0.8.23", +] + +[[package]] +name = "cc" +version = "1.2.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[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.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "cgl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" +dependencies = [ + "libc", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", + "zeroize", +] + +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +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.11.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.11.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.2", + "thiserror 2.0.18", +] + +[[package]] +name = "compression-codecs" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb7b51a7d9c967fc26773061ba86150f19c50c0d65c887cb1fbe295fd16619b7" +dependencies = [ + "compression-core", + "deflate64", + "flate2", + "memchr", +] + +[[package]] +name = "compression-core" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" + +[[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-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 = "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.11.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.11.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.11.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.11.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.11.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 = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[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 = "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 = "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" +dependencies = [ + "powerfmt", +] + +[[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.117", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[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" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys 0.5.0", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users 0.4.6", + "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 0.4.6", + "windows-sys 0.48.0", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users 0.5.2", + "windows-sys 0.61.2", +] + +[[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.11.1", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "dlib" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a" +dependencies = [ + "libloading", +] + +[[package]] +name = "domain" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + +[[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.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "embed-resource" +version = "3.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63a1d0de4f2249aa0ff5884d7080814f446bb241a559af6c170a41e878ed2d45" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 0.9.12+spec-1.1.0", + "vswhom", + "winreg", +] + +[[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.117", +] + +[[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.117", +] + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "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.1", + "pin-project-lite", +] + +[[package]] +name = "exr" +version = "1.74.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be" +dependencies = [ + "bit_field", + "half", + "lebe", + "miniz_oxide", + "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.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + +[[package]] +name = "fax" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05de7d48f37cd6730705cbca900770cab77a89f413d23e100ad7fad7795a0ab" +dependencies = [ + "fax_derive", +] + +[[package]] +name = "fax_derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[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.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" +dependencies = [ + "cfg-if", + "libc", + "libredox", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[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.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b38ad915f6dadd993ced50848a8291a543bd41ca62bc10740d5e64e2ab4cfd7" +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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[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.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[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.4.1", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +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", + "js-sys", + "libc", + "r-efi 5.3.0", + "wasip2", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "wasip2", + "wasip3", +] + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "globset" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3" +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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" +dependencies = [ + "bitflags 2.11.1", + "gpu-alloc-types", +] + +[[package]] +name = "gpu-alloc-ash" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbda7a18a29bc98c2e0de0435c347df935bf59489935d0cbd0b73f1679b6f79a" +dependencies = [ + "ash", + "gpu-alloc-types", + "tinyvec", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" +dependencies = [ + "bitflags 2.11.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.4", + "raw-window-handle", + "resvg", + "schemars", + "seahash", + "serde", + "serde_json", + "slotmap", + "smallvec", + "smol", + "stacksafe", + "strum 0.27.2", + "taffy", + "thiserror 2.0.18", + "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.117", +] + +[[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.2", +] + +[[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.117", +] + +[[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", + "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", + "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.117", +] + +[[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.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" +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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" + +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown 0.15.5", +] + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[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", +] + +[[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.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +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 = "hyper" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" +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.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8" + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.0", + "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.117", +] + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" + +[[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.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca" +dependencies = [ + "cfg-if", + "futures-util", + "once_cell", + "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 = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[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.185" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f" + +[[package]] +name = "libfuzzer-sys" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f12a681b7dd8ce12bff52488013ba614b869148d54dd79836ab85aafdd53f08d" +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.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" +dependencies = [ + "bitflags 2.11.1", + "libc", + "plain", + "redox_syscall 0.7.4", +] + +[[package]] +name = "libsqlite3-sys" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "133c182a6a2c87864fe97778797e46c7e999672690dc9fa3ee8e241aa4a9c13f" +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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[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.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +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 = "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.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9815fac08e6fd96733a11dce4f9d15a3f338e96a2e2311ee21e1b738efc2bc0f" +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.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e43b7e44161571868f5c931d12583592c223c5583eef86b08aa02b7048a3552" +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", +] + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "memmap2" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3" +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.11.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 = "mint" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e53debba6bda7a793e5f99b8dacf19e626084f525f7829104ba9898f367d85ff" + +[[package]] +name = "mio" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" +dependencies = [ + "libc", + "wasi", + "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.11.1", + "cfg_aliases", + "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.18", + "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.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.11.1", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "nix" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d6d0705320c1e6ba1d912b5e37cf18071b6c2e9b7fa8215a1e8a7651966f5d3" +dependencies = [ + "bitflags 2.11.1", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "no_std_io2" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b51ed7824b6e07d354605f4abb3d9d300350701299da96642ee084f5ce631550" +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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +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.6", + "serde", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" + +[[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.117", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "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.11.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.11.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.11.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.11.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.11.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.11.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.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +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", + "endi", + "futures-lite 2.6.1", + "futures-util", + "getrandom 0.3.4", + "hkdf", + "hmac", + "md-5", + "num", + "num-bigint-dig", + "pbkdf2", + "rand 0.9.4", + "serde", + "sha2", + "subtle", + "zbus", + "zbus_macros", + "zeroize", + "zvariant", +] + +[[package]] +name = "open" +version = "5.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513d40024bc" +dependencies = [ + "is-wsl", + "libc", + "pathdiff", +] + +[[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 = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf9027960355bf3afff9841918474a81a5f972ac6d226d518060bba758b5ad57" +dependencies = [ + "rustc_version", +] + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest", + "hmac", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pi_bridge" +version = "0.1.0" +dependencies = [ + "anyhow", + "serde", + "serde_json", + "uuid", +] + +[[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.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[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.4.1", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[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", +] + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags 2.11.1", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[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 = "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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +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.117", +] + +[[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.11+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.117", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "psm" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3852766467df634d74f0b2d7819bf8dc483a0eb2e3b0f50f756f9cfe8b0d18d8" +dependencies = [ + "ar_archive_writer", + "cc", +] + +[[package]] +name = "pxfm" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0c5ccf5294c6ccd63a74f1565028353830a9c2f5eb0c682c355c471726a6e3f" + +[[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.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" +dependencies = [ + "memchr", +] + +[[package]] +name = "quick-xml" +version = "0.39.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "958f21e8e7ceb5a1aa7fa87fab28e7c75976e0bfe7e23ff069e0a260f894067d" +dependencies = [ + "memchr", +] + +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash 2.1.2", + "rustls", + "socket2", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +dependencies = [ + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.4", + "ring", + "rustc-hash 2.1.2", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.60.2", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[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 = "rangemap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "973443cf09a9c8656b574a866ab68dfa19f0867d0340648c7d2f6a71b8a8ea68" + +[[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.4", + "rand_chacha 0.9.0", + "simd_helpers", + "thiserror 2.0.18", + "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-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.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b634fabf032fab15307ffd272149b622260f55974d9fad689292a5d33df02e5" +dependencies = [ + "bytemuck", + "font-types", +] + +[[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.11.1", +] + +[[package]] +name = "redox_syscall" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f450ad9c3b1da563fb6948a8e0fb0fb9269711c9c73d9ea1de5058c79c8d643a" +dependencies = [ + "bitflags 2.11.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 = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 2.0.18", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "regex" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + +[[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 = "runtime" +version = "0.1.0" +dependencies = [ + "anyhow", + "pi_bridge", + "serde_json", +] + +[[package]] +name = "rusqlite" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "165ca6e57b20e1351573e3729b958bc62f0e48025386970b6e4d29e7a7e71f3f" +dependencies = [ + "bitflags 2.11.1", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "serde_json", + "smallvec", +] + +[[package]] +name = "rust-embed" +version = "8.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04113cb9355a377d83f06ef1f0a45b8ab8cd7d8b1288160717d66df5c7988d27" +dependencies = [ + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "8.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0902e4c7c8e997159ab384e6d0fc91c221375f6894346ae107f47dd0f3ccaa" +dependencies = [ + "proc-macro2", + "quote", + "rust-embed-utils", + "syn 2.0.117", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "8.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bcdef0be6fe7f6fa333b1073c949729274b05f123a0ad7efcb8efd878e5c3b1" +dependencies = [ + "globset", + "sha2", + "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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" + +[[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.11.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.11.1", + "errno", + "libc", + "linux-raw-sys 0.12.1", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69f9466fb2c14ea04357e91413efb882e2a6d4a406e625449bc0a5d360d53a21" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +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.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8279bb85272c9f10811ae6a6c547ff594d6a7f3c6c6b02ee9726d1d0dcfcdd06" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "rustybuzz" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfb9cf8877777222e4a3bc7eb247e398b56baba500c38c1c46842431adc8b55c" +dependencies = [ + "bitflags 2.11.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.11.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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" +dependencies = [ + "dyn-clone", + "indexmap", + "ref-cast", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d115b50f4aaeea07e79c1912f645c7513d81715d0420f8bc77a18c6260b307f" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.117", +] + +[[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.11.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.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89" + +[[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.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[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.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +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.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[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 = "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", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[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.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" + +[[package]] +name = "skrifa" +version = "0.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fbdfe3d2475fbd7ddd1f3e5cf8288a30eb3e5f95832829570cd88115a7434ac" +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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +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.11.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.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d74a23609d509411d10e2176dc2a4346e3b4aea2e7b1869f19fdedbc71c013" +dependencies = [ + "cc", + "cfg-if", + "libc", + "psm", + "windows-sys 0.59.0", +] + +[[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.117", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "storage" +version = "0.1.0" +dependencies = [ + "anyhow", + "domain", + "rusqlite", + "serde_json", + "support", + "tempfile", + "uuid", +] + +[[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.117", +] + +[[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.117", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "support" +version = "0.1.0" +dependencies = [ + "anyhow", + "dirs 6.0.0", + "time", +] + +[[package]] +name = "sval" +version = "2.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eb9318255ebd817902d7e279d8f8e39b35b1b9954decd5eb9ea0e30e5fd2b6a" + +[[package]] +name = "sval_buffer" +version = "2.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12571299185e653fdb0fbfe36cd7f6529d39d4e747a60b15a3f34574b7b97c61" +dependencies = [ + "sval", + "sval_ref", +] + +[[package]] +name = "sval_dynamic" +version = "2.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39526f24e997706c0de7f03fb7371f7f5638b66a504ded508e20ad173d0a3677" +dependencies = [ + "sval", +] + +[[package]] +name = "sval_fmt" +version = "2.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "933dd3bb26965d682280fcc49400ac2a05036f4ee1e6dbd61bf8402d5a5c3a54" +dependencies = [ + "itoa", + "ryu", + "sval", +] + +[[package]] +name = "sval_json" +version = "2.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0cda08f6d5c9948024a6551077557b1fdcc3880ff2f20ae839667d2ec2d87ed" +dependencies = [ + "itoa", + "ryu", + "sval", +] + +[[package]] +name = "sval_nested" +version = "2.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d49d5e6c1f9fd0e53515819b03a97ca4eb1bff5c8ee097c43391c09ecfb19f" +dependencies = [ + "sval", + "sval_buffer", + "sval_ref", +] + +[[package]] +name = "sval_ref" +version = "2.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14f876c5a78405375b4e19cbb9554407513b59c93dea12dc6a4af4e1d30899ca" +dependencies = [ + "sval", +] + +[[package]] +name = "sval_serde" +version = "2.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f9ccd3b7f7200239a655e517dd3fd48d960b9111ad24bd6a5e055bef17607c7" +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.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "842f3cd369c2ba38966204f983eaa5e54a8e84a7d7159ed36ade2b6c335aae64" +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.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +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.117", +] + +[[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.11.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.4.1", + "getrandom 0.4.2", + "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.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[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.117", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[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.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" + +[[package]] +name = "time-macros" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +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.52.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67dee974fe86fd92cc45b7a95fdd2f99a36a6d7b0d431a231178d3d670bbcc6" +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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d4770b8024672c1101b3f6733eab95b18007dbe0847a8afe341fcf79e06043f" +dependencies = [ + "either", + "futures-util", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "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 = "0.9.12+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + +[[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 = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[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.11+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" +dependencies = [ + "indexmap", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "winnow 1.0.1", +] + +[[package]] +name = "toml_parser" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +dependencies = [ + "winnow 1.0.1", +] + +[[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.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" + +[[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.117", +] + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" + +[[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 = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[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", + "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_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" +dependencies = [ + "getrandom 0.4.2", + "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.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0" +dependencies = [ + "value-bag-serde1", + "value-bag-sval2", +] + +[[package]] +name = "value-bag-serde1" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16530907bfe2999a1773ca5900a65101e092c70f642f25cc23ca0c43573262c5" +dependencies = [ + "erased-serde", + "serde_core", + "serde_fmt", +] + +[[package]] +name = "value-bag-sval2" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d00ae130edd690eaa877e4f40605d534790d1cf1d651e7685bd6a144521b251f" +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 = "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.3+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +dependencies = [ + "wit-bindgen 0.57.1", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen 0.51.0", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f371d383f2fb139252e0bfac3b81b265689bf45b6874af544ffa4c975ac1ebf8" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.117", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.118" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[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 = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.1", + "hashbrown 0.15.5", + "indexmap", + "semver", +] + +[[package]] +name = "wayland-backend" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2857dd20b54e916ec7253b3d6b4d5c4d7d4ca2c33c2e11c6c76a99bd8744755d" +dependencies = [ + "cc", + "downcast-rs", + "rustix 1.1.4", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c7c96bb74690c3189b5c9cb4ca1627062bb23693a4fad9d8c3de958260144" +dependencies = [ + "bitflags 2.11.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.11.1", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "563a85523cade2429938e790815fd7319062103b9f4a2dc806e9b53b95982d8f" +dependencies = [ + "bitflags 2.11.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.11.1", + "wayland-backend", + "wayland-client", + "wayland-protocols 0.31.2", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c324a910fd86ebdc364a3e61ec1f11737d3b1d6c273c0239ee8ff4bc0d24b4a" +dependencies = [ + "proc-macro2", + "quick-xml 0.39.2", + "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.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f2dfbb17949fa2088e5d39408c48368947b86f7834484e87b73de55bc14d97d" +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 = "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.18", + "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.117", +] + +[[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.117", +] + +[[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.117", +] + +[[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.117", +] + +[[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.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" +dependencies = [ + "memchr", +] + +[[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.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck 0.5.0", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap", + "prettyplease", + "syn 2.0.117", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.117", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.11.1", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee4c580d8205abb0a5cf4eb7e927bd664e425b6c3263f9c5310583da96970cf6" +dependencies = [ + "bitflags 1.3.2", + "libc", + "quick-xml 0.30.0", + "x11", +] + +[[package]] +name = "xcursor" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" + +[[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.11.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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "503a066b4c037c440169d995b869046827dbc71263f6e8f3be6d77d4f3229dbd" +dependencies = [ + "dlib", + "once_cell", + "pkg-config", +] + +[[package]] +name = "yoke" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" +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.117", + "synstructure", +] + +[[package]] +name = "zbus" +version = "5.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca82f95dbd3943a40a53cfded6c2d0a2ca26192011846a1810c4256ef92c60bc" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener 5.4.1", + "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 0.7.15", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897e79616e84aac4b2c46e9132a4f63b93105d54fe8c0e8f6bffc21fa8d49222" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.117", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f" +dependencies = [ + "serde", + "winnow 0.7.15", + "zvariant", +] + +[[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.11.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", + "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.6", + "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.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zerofrom" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" +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.117", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zune-core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9" + +[[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.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5708299b21903bbe348e94729f22c49c55d04720a004aa350f1f9c122fd2540b" +dependencies = [ + "endi", + "enumflags2", + "serde", + "url", + "winnow 0.7.15", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b59b012ebe9c46656f9cc08d8da8b4c726510aef12559da3e5f1bf72780752c" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.117", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 2.0.117", + "winnow 0.7.15", +] diff --git a/AgentCompany-Rust/Cargo.toml b/AgentCompany-Rust/Cargo.toml new file mode 100644 index 00000000..373871d0 --- /dev/null +++ b/AgentCompany-Rust/Cargo.toml @@ -0,0 +1,42 @@ +[workspace] +members = [ + "crates/support", + "crates/domain", + "crates/storage", + "crates/pi_bridge", + "crates/runtime", + "crates/app_models", + "crates/app_ui", + "crates/app", +] +default-members = ["crates/app"] +resolver = "2" + +[workspace.package] +edition = "2024" +license = "Apache-2.0" +publish = false +version = "0.1.0" + +[workspace.dependencies] +anyhow = "1.0.100" +dirs = "6.0.0" +gpui = "0.2.2" +parking_lot = "0.12.5" +rusqlite = { version = "0.37.0", features = ["bundled", "serde_json"] } +serde = { version = "1.0.228", features = ["derive"] } +serde_json = "1.0.145" +smallvec = "1.15.1" +tempfile = "3.23.0" +thiserror = "2.0.17" +time = { version = "0.3.44", features = ["formatting", "macros"] } +uuid = { version = "1.18.1", features = ["serde", "v4"] } +unicode-segmentation = "1.12.0" + +app_models = { path = "crates/app_models" } +app_ui = { path = "crates/app_ui" } +domain = { path = "crates/domain" } +pi_bridge = { path = "crates/pi_bridge" } +runtime = { path = "crates/runtime" } +storage = { path = "crates/storage" } +support = { path = "crates/support" } diff --git a/AgentCompany-Rust/crates/app/Cargo.toml b/AgentCompany-Rust/crates/app/Cargo.toml new file mode 100644 index 00000000..c722cae1 --- /dev/null +++ b/AgentCompany-Rust/crates/app/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "agentcompany_app" +edition.workspace = true +license.workspace = true +publish.workspace = true +version.workspace = true + +[[bin]] +name = "agentcompany" +path = "src/main.rs" + +[dependencies] +anyhow.workspace = true +app_ui.workspace = true +parking_lot.workspace = true +storage.workspace = true +support.workspace = true diff --git a/AgentCompany-Rust/crates/app/src/main.rs b/AgentCompany-Rust/crates/app/src/main.rs new file mode 100644 index 00000000..3df66781 --- /dev/null +++ b/AgentCompany-Rust/crates/app/src/main.rs @@ -0,0 +1,13 @@ +use anyhow::Result; +use parking_lot::Mutex; +use std::sync::Arc; +use storage::ProfileStore; +use support::paths::resolve_profile_dir; + +fn main() -> Result<()> { + let profile_dir = resolve_profile_dir()?; + let store = Arc::new(Mutex::new(ProfileStore::open(&profile_dir)?)); + let snapshot = store.lock().snapshot()?; + app_ui::launch(store, snapshot); + Ok(()) +} diff --git a/AgentCompany-Rust/crates/app_models/Cargo.toml b/AgentCompany-Rust/crates/app_models/Cargo.toml new file mode 100644 index 00000000..2962102b --- /dev/null +++ b/AgentCompany-Rust/crates/app_models/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "app_models" +edition.workspace = true +license.workspace = true +publish.workspace = true +version.workspace = true + +[dependencies] +domain.workspace = true diff --git a/AgentCompany-Rust/crates/app_models/src/actions.rs b/AgentCompany-Rust/crates/app_models/src/actions.rs new file mode 100644 index 00000000..a60b4818 --- /dev/null +++ b/AgentCompany-Rust/crates/app_models/src/actions.rs @@ -0,0 +1,13 @@ +use domain::SectionId; + +#[derive(Clone, Debug)] +pub enum AppAction { + SelectSection(SectionId), + SelectRun(Option), + SelectApproval(Option), + SelectMessage(Option), + SelectDocument(Option), + SelectWorkspace(Option), + Status(String), + ClearStatus, +} diff --git a/AgentCompany-Rust/crates/app_models/src/lib.rs b/AgentCompany-Rust/crates/app_models/src/lib.rs new file mode 100644 index 00000000..8b4befbe --- /dev/null +++ b/AgentCompany-Rust/crates/app_models/src/lib.rs @@ -0,0 +1,5 @@ +pub mod actions; +pub mod state; + +pub use actions::AppAction; +pub use state::AppState; diff --git a/AgentCompany-Rust/crates/app_models/src/state.rs b/AgentCompany-Rust/crates/app_models/src/state.rs new file mode 100644 index 00000000..3f994310 --- /dev/null +++ b/AgentCompany-Rust/crates/app_models/src/state.rs @@ -0,0 +1,22 @@ +use domain::SectionId; + +#[derive(Clone, Debug, Default)] +pub struct AppState { + pub section: SectionId, + pub selected_run_id: Option, + pub selected_approval_id: Option, + pub selected_message_id: Option, + pub selected_document_id: Option, + pub selected_workspace_id: Option, + pub status_line: Option, +} + +impl AppState { + pub fn set_status(&mut self, value: impl Into) { + self.status_line = Some(value.into()); + } + + pub fn clear_status(&mut self) { + self.status_line = None; + } +} diff --git a/AgentCompany-Rust/crates/app_ui/Cargo.toml b/AgentCompany-Rust/crates/app_ui/Cargo.toml new file mode 100644 index 00000000..e3802834 --- /dev/null +++ b/AgentCompany-Rust/crates/app_ui/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "app_ui" +edition.workspace = true +license.workspace = true +publish.workspace = true +version.workspace = true + +[dependencies] +app_models.workspace = true +domain.workspace = true +gpui.workspace = true +parking_lot.workspace = true +storage.workspace = true +unicode-segmentation.workspace = true diff --git a/AgentCompany-Rust/crates/app_ui/src/app_root.rs b/AgentCompany-Rust/crates/app_ui/src/app_root.rs new file mode 100644 index 00000000..ca5cd28d --- /dev/null +++ b/AgentCompany-Rust/crates/app_ui/src/app_root.rs @@ -0,0 +1,1009 @@ +use crate::{ + SharedStore, + widgets::{ + button::{primary_button, secondary_button}, + text_input::TextInput, + }, +}; +use app_models::AppState; +use domain::{ApprovalState, ProfileSnapshot, SectionId}; +use gpui::{App, Context, Entity, SharedString, Window, div, prelude::*, px, rgb}; +use storage::NewCompanyInput; + +pub struct AppRoot { + store: SharedStore, + snapshot: ProfileSnapshot, + state: AppState, + company_name_input: Entity, + mission_input: Entity, + workspace_input: Entity, + message_input: Entity, + document_title_input: Entity, + document_body_input: Entity, +} + +impl AppRoot { + pub fn new(store: SharedStore, snapshot: ProfileSnapshot, cx: &mut App) -> Self { + let mut root = Self { + store, + snapshot, + state: AppState::default(), + company_name_input: TextInput::new(cx, "Company name"), + mission_input: TextInput::new(cx, "Mission or thesis direction"), + workspace_input: TextInput::new(cx, "Primary workspace path"), + message_input: TextInput::new(cx, "Board message"), + document_title_input: TextInput::new(cx, "Document title"), + document_body_input: TextInput::new(cx, "Document body"), + }; + root.sync_selection(); + root + } + + fn sync_selection(&mut self) { + if self.state.selected_run_id.is_none() { + self.state.selected_run_id = self.snapshot.runs.first().map(|item| item.id.clone()); + } + if self.state.selected_approval_id.is_none() { + self.state.selected_approval_id = + self.snapshot.approvals.first().map(|item| item.id.clone()); + } + if self.state.selected_message_id.is_none() { + self.state.selected_message_id = self + .snapshot + .agent_messages + .first() + .map(|item| item.id.clone()); + } + if self.state.selected_document_id.is_none() { + self.state.selected_document_id = + self.snapshot.documents.first().map(|item| item.id.clone()); + } + if self.state.selected_workspace_id.is_none() { + self.state.selected_workspace_id = + self.snapshot.workspaces.first().map(|item| item.id.clone()); + } + } + + fn current_company_id(&self) -> Option<&str> { + self.snapshot + .current_company() + .map(|company| company.id.as_str()) + } + + fn set_status(&mut self, message: impl Into, cx: &mut Context) { + self.state.set_status(message); + cx.notify(); + } + + fn reload(&mut self, status: impl Into, cx: &mut Context) { + let result = { + let store = self.store.lock(); + store.snapshot() + }; + match result { + Ok(snapshot) => { + self.snapshot = snapshot; + self.sync_selection(); + self.state.set_status(status); + cx.notify(); + } + Err(error) => self.set_status(error.to_string(), cx), + } + } + + fn create_company(&mut self, cx: &mut Context) { + let input = NewCompanyInput { + name: self.company_name_input.read(cx).value(), + description: self.mission_input.read(cx).value(), + workspace_path: self.workspace_input.read(cx).value(), + execution_mode: "ai_ceo".to_string(), + }; + let result = { + let mut store = self.store.lock(); + store.create_company(input) + }; + match result { + Ok(_) => { + self.company_name_input.update(cx, |input, _| input.clear()); + self.mission_input.update(cx, |input, _| input.clear()); + self.workspace_input.update(cx, |input, _| input.clear()); + self.reload("Company created in the native profile.", cx); + } + Err(error) => self.set_status(error.to_string(), cx), + } + } + + fn switch_company(&mut self, company_id: String, cx: &mut Context) { + let result = { + let mut store = self.store.lock(); + store.set_current_company(&company_id) + }; + match result { + Ok(_) => self.reload("Company switched.", cx), + Err(error) => self.set_status(error.to_string(), cx), + } + } + + fn decide_selected_approval( + &mut self, + state: ApprovalState, + note: &'static str, + cx: &mut Context, + ) { + let Some(company_id) = self.current_company_id().map(str::to_string) else { + self.set_status("Create a company first.", cx); + return; + }; + let Some(approval_id) = self.state.selected_approval_id.clone() else { + self.set_status("Choose an approval first.", cx); + return; + }; + let result = { + let mut store = self.store.lock(); + store.decide_approval(&company_id, &approval_id, state, note) + }; + match result { + Ok(_) => self.reload(format!("Approval moved to {}.", state.as_str()), cx), + Err(error) => self.set_status(error.to_string(), cx), + } + } + + fn send_message(&mut self, cx: &mut Context) { + let Some(company_id) = self.current_company_id().map(str::to_string) else { + self.set_status("Create a company first.", cx); + return; + }; + let body = self.message_input.read(cx).value(); + let result = { + let mut store = self.store.lock(); + store.send_board_message(&company_id, &body) + }; + match result { + Ok(_) => { + self.message_input.update(cx, |input, _| input.clear()); + self.reload("Board message saved.", cx); + } + Err(error) => self.set_status(error.to_string(), cx), + } + } + + fn mark_selected_message_read(&mut self, cx: &mut Context) { + let Some(company_id) = self.current_company_id().map(str::to_string) else { + self.set_status("Create a company first.", cx); + return; + }; + let Some(message_id) = self.state.selected_message_id.clone() else { + self.set_status("Choose a message first.", cx); + return; + }; + let result = { + let mut store = self.store.lock(); + store.mark_message_read(&company_id, &message_id) + }; + match result { + Ok(_) => self.reload("Message marked as read.", cx), + Err(error) => self.set_status(error.to_string(), cx), + } + } + + fn create_document(&mut self, cx: &mut Context) { + let Some(company_id) = self.current_company_id().map(str::to_string) else { + self.set_status("Create a company first.", cx); + return; + }; + let title = self.document_title_input.read(cx).value(); + let body = self.document_body_input.read(cx).value(); + let result = { + let mut store = self.store.lock(); + store.create_document(&company_id, &title, &body) + }; + match result { + Ok(_) => { + self.document_title_input + .update(cx, |input, _| input.clear()); + self.document_body_input + .update(cx, |input, _| input.clear()); + self.reload("Document saved.", cx); + } + Err(error) => self.set_status(error.to_string(), cx), + } + } + + fn metric_card( + &self, + label: impl Into, + value: String, + detail: impl Into, + ) -> impl IntoElement + '_ { + let label = label.into(); + let detail = detail.into(); + div() + .flex_1() + .p_4() + .gap_2() + .border_1() + .rounded_md() + .border_color(rgb(0xd9cdbf)) + .bg(rgb(0xfffbf5)) + .child(div().text_sm().text_color(rgb(0x6f665d)).child(label)) + .child(div().text_3xl().text_color(rgb(0x171411)).child(value)) + .child(div().text_sm().text_color(rgb(0x6f665d)).child(detail)) + } + + fn render_sidebar(&self, cx: &mut Context) -> impl IntoElement + '_ { + let sections = [ + SectionId::Overview, + SectionId::Runs, + SectionId::Inbox, + SectionId::Messages, + SectionId::Approvals, + SectionId::Documents, + SectionId::Workspaces, + SectionId::Settings, + ]; + div() + .w(px(208.0)) + .h_full() + .p_4() + .gap_4() + .flex() + .flex_col() + .bg(rgb(0x161514)) + .text_color(rgb(0xf5eee4)) + .child(div().text_lg().child("AgentCompany")) + .children(self.snapshot.companies.iter().map(|company| { + let active = + self.snapshot.current_company_id.as_deref() == Some(company.id.as_str()); + let company_id = company.id.clone(); + div() + .id(SharedString::from(format!("company-{}", company.id))) + .px_3() + .py_2() + .rounded_md() + .cursor_pointer() + .bg(if active { rgb(0x9e3d2d) } else { rgb(0x211d1a) }) + .hover(|style| style.bg(rgb(0x362c27))) + .on_click(cx.listener(move |this, _, _, cx| { + this.switch_company(company_id.clone(), cx) + })) + .child(company.name.clone()) + })) + .child(div().h(px(1.0)).bg(rgb(0x2f2924))) + .children(sections.into_iter().map(|section| { + let active = self.state.section == section; + div() + .id(SharedString::from(format!( + "section-{}", + section.label().to_lowercase() + ))) + .px_3() + .py_2() + .rounded_md() + .cursor_pointer() + .bg(if active { rgb(0xefe2d4) } else { rgb(0x161514) }) + .text_color(if active { rgb(0x171411) } else { rgb(0xf5eee4) }) + .hover(|style| style.bg(rgb(0x2c2825))) + .on_click(cx.listener(move |this, _, _, cx| { + this.state.section = section; + cx.notify(); + })) + .child(section.label()) + })) + } + + fn render_overview(&self) -> impl IntoElement + '_ { + let company = self.snapshot.current_company(); + let company_name = company + .map(|item| item.name.clone()) + .unwrap_or_else(|| "No company".to_string()); + div() + .flex() + .flex_col() + .gap_4() + .child( + div() + .flex() + .gap_4() + .child(self.metric_card( + "Active tasks", + self.snapshot.active_tasks().to_string(), + "Tasks in todo, review, or execution", + )) + .child(self.metric_card( + "Pending approvals", + self.snapshot.pending_approvals().to_string(), + "Human review gates", + )) + .child(self.metric_card( + "Unread messages", + self.snapshot.unread_messages().to_string(), + "Company and direct channels", + )) + .child(self.metric_card( + "Active runs", + self.snapshot.active_runs().to_string(), + "Queued, running, and waiting runs", + )), + ) + .child( + div() + .flex() + .gap_4() + .child( + div() + .flex_1() + .p_4() + .gap_2() + .border_1() + .rounded_md() + .border_color(rgb(0xd9cdbf)) + .bg(rgb(0xfffbf5)) + .child(div().text_lg().child(company_name)) + .children(self.snapshot.tasks.iter().take(6).map(|task| { + div() + .py_2() + .border_b_1() + .border_color(rgb(0xeee3d7)) + .child(format!("{} · {}", task.status, task.title)) + })), + ) + .child( + div() + .flex_1() + .p_4() + .gap_2() + .border_1() + .rounded_md() + .border_color(rgb(0xd9cdbf)) + .bg(rgb(0xfffbf5)) + .child(div().text_lg().child("Recent activity")) + .children(self.snapshot.activity.iter().take(6).map(|item| { + div() + .py_2() + .border_b_1() + .border_color(rgb(0xeee3d7)) + .child(format!("{} · {}", item.action, item.detail)) + })), + ), + ) + } + + fn render_runs(&self, cx: &mut Context) -> impl IntoElement + '_ { + let selected = self + .state + .selected_run_id + .as_ref() + .and_then(|id| self.snapshot.runs.iter().find(|item| &item.id == id)); + let selected_status = selected + .map(|item| item.status.clone()) + .unwrap_or_else(|| "Select a run".to_string()); + let selected_summary = selected + .map(|item| item.summary.clone()) + .filter(|value| !value.trim().is_empty()) + .unwrap_or_else(|| "No run selected.".to_string()); + let selected_model = selected + .and_then(|item| item.model.clone()) + .unwrap_or_else(|| "model pending".to_string()); + let selected_agent = selected + .and_then(|run| { + self.snapshot + .agents + .iter() + .find(|agent| agent.id == run.agent_id) + .map(|agent| agent.name.clone()) + }) + .unwrap_or_else(|| "Agent unavailable".to_string()); + let selected_workspace = selected + .and_then(|run| { + run.workspace_id.as_ref().and_then(|workspace_id| { + self.snapshot + .workspaces + .iter() + .find(|workspace| &workspace.id == workspace_id) + .map(|workspace| workspace.name.clone()) + }) + }) + .unwrap_or_else(|| "Workspace pending".to_string()); + let selected_error = selected + .and_then(|item| item.error_message.clone()) + .unwrap_or_default(); + + div() + .flex() + .gap_4() + .child( + div() + .id("runs-list") + .w(px(360.0)) + .p_4() + .gap_2() + .border_1() + .rounded_md() + .border_color(rgb(0xd9cdbf)) + .bg(rgb(0xfffbf5)) + .overflow_scroll() + .child(div().text_lg().child("Run queue")) + .children(self.snapshot.runs.iter().map(|item| { + let active = + self.state.selected_run_id.as_deref() == Some(item.id.as_str()); + let run_id = item.id.clone(); + let headline = if item.summary.trim().is_empty() { + format!("{} · {}", item.status, item.id) + } else { + format!("{} · {}", item.status, item.summary) + }; + div() + .id(SharedString::from(format!("run-{}", item.id))) + .px_3() + .py_2() + .rounded_md() + .cursor_pointer() + .bg(if active { rgb(0xefe2d4) } else { rgb(0xfffbf5) }) + .hover(|style| style.bg(rgb(0xf4ede4))) + .on_click(cx.listener(move |this, _, _, cx| { + this.state.selected_run_id = Some(run_id.clone()); + cx.notify(); + })) + .child(headline) + })), + ) + .child( + div() + .flex_1() + .p_4() + .gap_3() + .border_1() + .rounded_md() + .border_color(rgb(0xd9cdbf)) + .bg(rgb(0xfffbf5)) + .child(div().text_lg().child("Run inspector")) + .child( + div() + .text_sm() + .text_color(rgb(0x6f665d)) + .child(selected_status), + ) + .child( + div() + .flex() + .gap_2() + .child(self.metric_card("Agent", selected_agent, "Assigned operator")) + .child(self.metric_card( + "Model", + selected_model, + "Runtime-selected model", + )), + ) + .child( + div() + .flex() + .gap_2() + .child(self.metric_card( + "Workspace", + selected_workspace, + "Bound workspace", + )) + .child( + self.metric_card( + "Connector", + selected + .map(|item| item.connector_id.clone()) + .unwrap_or_else(|| "connector pending".to_string()), + "Execution provider", + ), + ), + ) + .child( + div() + .min_h(px(180.0)) + .p_3() + .border_1() + .border_color(rgb(0xeee3d7)) + .rounded_md() + .bg(rgb(0xf7f0e7)) + .child(selected_summary), + ) + .when(!selected_error.is_empty(), |container| { + container.child( + div() + .p_3() + .border_1() + .border_color(rgb(0x9e3d2d)) + .rounded_md() + .bg(rgb(0xffefe8)) + .child(selected_error), + ) + }), + ) + } + + fn render_inbox(&self) -> impl IntoElement + '_ { + div() + .flex() + .gap_4() + .child( + div() + .flex_1() + .p_4() + .gap_2() + .border_1() + .rounded_md() + .border_color(rgb(0xd9cdbf)) + .bg(rgb(0xfffbf5)) + .child(div().text_lg().child("Unread messages")) + .children( + self.snapshot + .agent_messages + .iter() + .filter(|item| item.read_at.is_none()) + .take(8) + .map(|item| { + div() + .py_2() + .border_b_1() + .border_color(rgb(0xeee3d7)) + .child(format!("{} · {}", item.subject, item.body)) + }), + ), + ) + .child( + div() + .flex_1() + .p_4() + .gap_2() + .border_1() + .rounded_md() + .border_color(rgb(0xd9cdbf)) + .bg(rgb(0xfffbf5)) + .child(div().text_lg().child("Pending approvals")) + .children( + self.snapshot + .approvals + .iter() + .filter(|item| item.state == "pending") + .take(8) + .map(|item| { + div().py_2().border_b_1().border_color(rgb(0xeee3d7)).child( + format!("{} · {}", item.approval_type, item.payload_summary), + ) + }), + ), + ) + } + + fn render_messages(&self, cx: &mut Context) -> impl IntoElement + '_ { + let selected = self.state.selected_message_id.as_ref().and_then(|id| { + self.snapshot + .agent_messages + .iter() + .find(|item| &item.id == id) + }); + let selected_subject = selected + .map(|item| item.subject.clone()) + .unwrap_or_else(|| "Select a thread".to_string()); + let selected_body = selected + .map(|item| item.body.clone()) + .unwrap_or_else(|| "No message selected.".to_string()); + div() + .flex() + .gap_4() + .child( + div() + .id("messages-list") + .w(px(320.0)) + .p_4() + .gap_2() + .border_1() + .rounded_md() + .border_color(rgb(0xd9cdbf)) + .bg(rgb(0xfffbf5)) + .overflow_scroll() + .child(div().text_lg().child("Channels")) + .children(self.snapshot.agent_messages.iter().map(|item| { + let active = + self.state.selected_message_id.as_deref() == Some(item.id.as_str()); + let message_id = item.id.clone(); + div() + .id(SharedString::from(format!("message-{}", item.id))) + .px_3() + .py_2() + .rounded_md() + .cursor_pointer() + .bg(if active { rgb(0xefe2d4) } else { rgb(0xfffbf5) }) + .hover(|style| style.bg(rgb(0xf4ede4))) + .on_click(cx.listener(move |this, _, _, cx| { + this.state.selected_message_id = Some(message_id.clone()); + cx.notify(); + })) + .child(format!("{} · {}", item.subject, item.priority)) + })), + ) + .child( + div() + .flex_1() + .p_4() + .gap_3() + .border_1() + .rounded_md() + .border_color(rgb(0xd9cdbf)) + .bg(rgb(0xfffbf5)) + .child(div().text_lg().child("Conversation")) + .child( + div() + .text_sm() + .text_color(rgb(0x6f665d)) + .child(selected_subject), + ) + .child( + div() + .min_h(px(220.0)) + .p_3() + .border_1() + .border_color(rgb(0xeee3d7)) + .rounded_md() + .bg(rgb(0xf7f0e7)) + .child(selected_body), + ) + .child(self.message_input.clone()) + .child( + div() + .flex() + .gap_2() + .child(primary_button("Send update", cx, |this, cx| { + this.send_message(cx) + })) + .child(secondary_button("Mark read", cx, |this, cx| { + this.mark_selected_message_read(cx) + })), + ), + ) + } + + fn render_approvals(&self, cx: &mut Context) -> impl IntoElement + '_ { + let selected = self + .state + .selected_approval_id + .as_ref() + .and_then(|id| self.snapshot.approvals.iter().find(|item| &item.id == id)); + let approval_type = selected + .map(|item| item.approval_type.clone()) + .unwrap_or_else(|| "Select an approval".to_string()); + let approval_summary = selected + .map(|item| item.impact_summary.clone()) + .unwrap_or_else(|| "No approval selected.".to_string()); + div() + .flex() + .gap_4() + .child( + div() + .id("approvals-list") + .w(px(340.0)) + .p_4() + .gap_2() + .border_1() + .rounded_md() + .border_color(rgb(0xd9cdbf)) + .bg(rgb(0xfffbf5)) + .overflow_scroll() + .child(div().text_lg().child("Approval queue")) + .children(self.snapshot.approvals.iter().map(|item| { + let active = + self.state.selected_approval_id.as_deref() == Some(item.id.as_str()); + let approval_id = item.id.clone(); + div() + .id(SharedString::from(format!("approval-{}", item.id))) + .px_3() + .py_2() + .rounded_md() + .cursor_pointer() + .bg(if active { rgb(0xefe2d4) } else { rgb(0xfffbf5) }) + .hover(|style| style.bg(rgb(0xf4ede4))) + .on_click(cx.listener(move |this, _, _, cx| { + this.state.selected_approval_id = Some(approval_id.clone()); + cx.notify(); + })) + .child(format!("{} · {}", item.state, item.payload_summary)) + })), + ) + .child( + div() + .flex_1() + .p_4() + .gap_3() + .border_1() + .rounded_md() + .border_color(rgb(0xd9cdbf)) + .bg(rgb(0xfffbf5)) + .child(div().text_lg().child("Decision")) + .child( + div() + .text_sm() + .text_color(rgb(0x6f665d)) + .child(approval_type), + ) + .child( + div() + .min_h(px(160.0)) + .p_3() + .border_1() + .border_color(rgb(0xeee3d7)) + .rounded_md() + .bg(rgb(0xf7f0e7)) + .child(approval_summary), + ) + .child( + div() + .flex() + .gap_2() + .child(primary_button("Approve", cx, |this, cx| { + this.decide_selected_approval( + ApprovalState::Approved, + "Approved from native shell.", + cx, + ) + })) + .child(secondary_button("Reject", cx, |this, cx| { + this.decide_selected_approval( + ApprovalState::Rejected, + "Rejected from native shell.", + cx, + ) + })), + ), + ) + } + + fn render_documents(&self, cx: &mut Context) -> impl IntoElement + '_ { + let selected = self + .state + .selected_document_id + .as_ref() + .and_then(|id| self.snapshot.documents.iter().find(|item| &item.id == id)); + let document_title = selected + .map(|item| item.title.clone()) + .unwrap_or_else(|| "Select a document".to_string()); + let document_content = selected + .map(|item| item.content.clone()) + .unwrap_or_else(|| "No document selected.".to_string()); + div() + .flex() + .gap_4() + .child( + div() + .id("documents-list") + .w(px(340.0)) + .p_4() + .gap_2() + .border_1() + .rounded_md() + .border_color(rgb(0xd9cdbf)) + .bg(rgb(0xfffbf5)) + .overflow_scroll() + .child(div().text_lg().child("Document center")) + .children(self.snapshot.documents.iter().map(|item| { + let active = + self.state.selected_document_id.as_deref() == Some(item.id.as_str()); + let document_id = item.id.clone(); + div() + .id(SharedString::from(format!("document-{}", item.id))) + .px_3() + .py_2() + .rounded_md() + .cursor_pointer() + .bg(if active { rgb(0xefe2d4) } else { rgb(0xfffbf5) }) + .hover(|style| style.bg(rgb(0xf4ede4))) + .on_click(cx.listener(move |this, _, _, cx| { + this.state.selected_document_id = Some(document_id.clone()); + cx.notify(); + })) + .child(format!("{} · {}", item.status, item.title)) + })), + ) + .child( + div() + .flex_1() + .p_4() + .gap_3() + .border_1() + .rounded_md() + .border_color(rgb(0xd9cdbf)) + .bg(rgb(0xfffbf5)) + .child(div().text_lg().child("Quick draft")) + .child(self.document_title_input.clone()) + .child(self.document_body_input.clone()) + .child(primary_button("Save draft", cx, |this, cx| { + this.create_document(cx) + })) + .child(div().h(px(1.0)).bg(rgb(0xeee3d7))) + .child( + div() + .text_sm() + .text_color(rgb(0x6f665d)) + .child(document_title), + ) + .child( + div() + .min_h(px(200.0)) + .p_3() + .border_1() + .border_color(rgb(0xeee3d7)) + .rounded_md() + .bg(rgb(0xf7f0e7)) + .child(document_content), + ), + ) + } + + fn render_workspaces(&self, cx: &mut Context) -> impl IntoElement + '_ { + div() + .flex() + .flex_col() + .gap_3() + .children(self.snapshot.workspaces.iter().map(|workspace| { + let active = + self.state.selected_workspace_id.as_deref() == Some(workspace.id.as_str()); + let workspace_id = workspace.id.clone(); + div() + .id(SharedString::from(format!("workspace-{}", workspace.id))) + .p_4() + .gap_2() + .border_1() + .rounded_md() + .border_color(rgb(0xd9cdbf)) + .bg(if active { rgb(0xf7f0e7) } else { rgb(0xfffbf5) }) + .cursor_pointer() + .hover(|style| style.bg(rgb(0xf4ede4))) + .on_click(cx.listener(move |this, _, _, cx| { + this.state.selected_workspace_id = Some(workspace_id.clone()); + cx.notify(); + })) + .child(div().text_lg().child(workspace.name.clone())) + .child( + div() + .text_sm() + .text_color(rgb(0x6f665d)) + .child(workspace.local_path.clone()), + ) + .child(div().text_sm().text_color(rgb(0x6f665d)).child(format!( + "{} · {}", + workspace.state, + if workspace.is_primary { + "primary" + } else { + "linked" + } + ))) + })) + } + + fn render_settings(&self) -> impl IntoElement + '_ { + let current = self.snapshot.current_company(); + let execution_mode = current + .map(|item| item.execution_mode.clone()) + .unwrap_or_else(|| "ai_ceo".to_string()); + div() + .flex() + .flex_col() + .gap_4() + .child(self.metric_card( + "Profile path", + self.snapshot.profile_path.clone(), + "Electron-compatible local profile", + )) + .child(self.metric_card( + "Theme", + self.snapshot.theme.clone(), + "Stored in the shared settings table", + )) + .child(self.metric_card( + "Locale", + self.snapshot.locale.clone(), + "Read from settings or the OS locale", + )) + .child(self.metric_card( + "Connectors", + self.snapshot.connectors.len().to_string(), + execution_mode, + )) + } + + fn render_onboarding(&self, cx: &mut Context) -> impl IntoElement + '_ { + div() + .size_full() + .p_8() + .flex() + .gap_8() + .bg(rgb(0xf3efe8)) + .child( + div() + .flex_1() + .gap_4() + .child(div().text_3xl().text_color(rgb(0x171411)).child("Start a native AgentCompany profile")) + .child(div().text_sm().text_color(rgb(0x6f665d)).child("Create the first company, point it at a workspace, and keep the SQLite profile local.")) + .child(self.company_name_input.clone()) + .child(self.mission_input.clone()) + .child(self.workspace_input.clone()) + .child(primary_button("Create company", cx, |this, cx| this.create_company(cx))), + ) + .child( + div() + .w(px(380.0)) + .p_5() + .gap_3() + .border_1() + .rounded_md() + .border_color(rgb(0xd9cdbf)) + .bg(rgb(0xfffbf5)) + .child(div().text_lg().child("What lands in SQLite")) + .child(div().text_sm().text_color(rgb(0x6f665d)).child("Company")) + .child(div().text_sm().text_color(rgb(0x6f665d)).child("Primary workspace")) + .child(div().text_sm().text_color(rgb(0x6f665d)).child("Connector catalog")) + .child(div().text_sm().text_color(rgb(0x6f665d)).child("Shared profile settings")), + ) + } +} + +impl Render for AppRoot { + fn render(&mut self, _window: &mut Window, cx: &mut Context) -> impl IntoElement { + if self.snapshot.companies.is_empty() { + return self.render_onboarding(cx).into_any_element(); + } + + let header = self + .snapshot + .current_company() + .map(|company| format!("{} · {}", company.name, company.execution_mode)) + .unwrap_or_else(|| "AgentCompany".to_string()); + + div() + .size_full() + .flex() + .bg(rgb(0xf3efe8)) + .child(self.render_sidebar(cx)) + .child( + div() + .flex_1() + .flex() + .flex_col() + .child( + div() + .px_6() + .py_4() + .border_b_1() + .border_color(rgb(0xd9cdbf)) + .bg(rgb(0xf8f2e9)) + .child(div().text_xl().text_color(rgb(0x171411)).child(header)) + .child(div().text_sm().text_color(rgb(0x6f665d)).child( + self.state.status_line.clone().unwrap_or_else(|| { + "Native Rust shell is reading the shared local profile." + .to_string() + }), + )), + ) + .child( + div() + .id("main-scroll") + .flex_1() + .overflow_scroll() + .p_6() + .child(match self.state.section { + SectionId::Overview => self.render_overview().into_any_element(), + SectionId::Runs => self.render_runs(cx).into_any_element(), + SectionId::Inbox => self.render_inbox().into_any_element(), + SectionId::Messages => self.render_messages(cx).into_any_element(), + SectionId::Approvals => { + self.render_approvals(cx).into_any_element() + } + SectionId::Documents => { + self.render_documents(cx).into_any_element() + } + SectionId::Workspaces => { + self.render_workspaces(cx).into_any_element() + } + SectionId::Settings => self.render_settings().into_any_element(), + }), + ), + ) + .into_any_element() + } +} diff --git a/AgentCompany-Rust/crates/app_ui/src/lib.rs b/AgentCompany-Rust/crates/app_ui/src/lib.rs new file mode 100644 index 00000000..ef5cff92 --- /dev/null +++ b/AgentCompany-Rust/crates/app_ui/src/lib.rs @@ -0,0 +1,37 @@ +mod app_root; +mod widgets; + +use app_root::AppRoot; +use domain::ProfileSnapshot; +use gpui::{App, AppContext, Application, Bounds, WindowBounds, WindowOptions, px, size}; +use parking_lot::Mutex; +use std::sync::Arc; +use storage::ProfileStore; +use widgets::text_input::bind_text_input_keys; + +pub type SharedStore = Arc>; + +pub fn launch(store: SharedStore, snapshot: ProfileSnapshot) { + Application::new().run(move |cx: &mut App| { + bind_text_input_keys(cx); + let store = store.clone(); + let snapshot = snapshot.clone(); + let bounds = Bounds::centered(None, size(px(1380.0), px(920.0)), cx); + let Ok(window) = cx.open_window( + WindowOptions { + window_bounds: Some(WindowBounds::Windowed(bounds)), + ..Default::default() + }, + move |_, cx| cx.new(|cx| AppRoot::new(store.clone(), snapshot.clone(), cx)), + ) else { + cx.quit(); + return; + }; + window + .update(cx, |_, window, cx| { + cx.activate(true); + window.activate_window(); + }) + .ok(); + }); +} diff --git a/AgentCompany-Rust/crates/app_ui/src/widgets/button.rs b/AgentCompany-Rust/crates/app_ui/src/widgets/button.rs new file mode 100644 index 00000000..2f1e6b2e --- /dev/null +++ b/AgentCompany-Rust/crates/app_ui/src/widgets/button.rs @@ -0,0 +1,49 @@ +use gpui::{Context, SharedString, Window, div, prelude::*, rgb}; + +pub fn primary_button( + label: &'static str, + cx: &mut Context, + on_click: impl Fn(&mut V, &mut Context) + 'static, +) -> impl IntoElement +where + V: 'static, +{ + div() + .id(SharedString::from(format!("primary-button-{label}"))) + .px_3() + .py_2() + .rounded_md() + .cursor_pointer() + .bg(rgb(0x9e3d2d)) + .text_color(rgb(0xfff7f0)) + .hover(|style| style.bg(rgb(0xb24f3e))) + .on_click( + cx.listener(move |this, _: &gpui::ClickEvent, _: &mut Window, cx| on_click(this, cx)), + ) + .child(label) +} + +pub fn secondary_button( + label: &'static str, + cx: &mut Context, + on_click: impl Fn(&mut V, &mut Context) + 'static, +) -> impl IntoElement +where + V: 'static, +{ + div() + .id(SharedString::from(format!("secondary-button-{label}"))) + .px_3() + .py_2() + .rounded_md() + .cursor_pointer() + .bg(rgb(0xfffbf5)) + .border_1() + .border_color(rgb(0xd9cdbf)) + .text_color(rgb(0x171411)) + .hover(|style| style.bg(rgb(0xf4ede4))) + .on_click( + cx.listener(move |this, _: &gpui::ClickEvent, _: &mut Window, cx| on_click(this, cx)), + ) + .child(label) +} diff --git a/AgentCompany-Rust/crates/app_ui/src/widgets/mod.rs b/AgentCompany-Rust/crates/app_ui/src/widgets/mod.rs new file mode 100644 index 00000000..51d01845 --- /dev/null +++ b/AgentCompany-Rust/crates/app_ui/src/widgets/mod.rs @@ -0,0 +1,2 @@ +pub mod button; +pub mod text_input; diff --git a/AgentCompany-Rust/crates/app_ui/src/widgets/text_input.rs b/AgentCompany-Rust/crates/app_ui/src/widgets/text_input.rs new file mode 100644 index 00000000..996cd0d0 --- /dev/null +++ b/AgentCompany-Rust/crates/app_ui/src/widgets/text_input.rs @@ -0,0 +1,447 @@ +use gpui::{ + App, Bounds, Context, CursorStyle, Element, ElementId, ElementInputHandler, Entity, + EntityInputHandler, FocusHandle, Focusable, GlobalElementId, KeyBinding, LayoutId, MouseButton, + MouseDownEvent, PaintQuad, Pixels, Point, ShapedLine, SharedString, Style, TextRun, + UTF16Selection, Window, actions, div, fill, hsla, point, prelude::*, px, relative, rgb, size, + white, +}; +use std::ops::Range; +use unicode_segmentation::UnicodeSegmentation; + +actions!( + text_input, + [ + Backspace, + Delete, + Left, + Right, + Home, + End, + Paste, + ShowCharacterPalette + ] +); + +pub fn bind_text_input_keys(cx: &mut App) { + cx.bind_keys([ + KeyBinding::new("backspace", Backspace, None), + KeyBinding::new("delete", Delete, None), + KeyBinding::new("left", Left, None), + KeyBinding::new("right", Right, None), + KeyBinding::new("home", Home, None), + KeyBinding::new("end", End, None), + KeyBinding::new("cmd-v", Paste, None), + KeyBinding::new("ctrl-cmd-space", ShowCharacterPalette, None), + ]); +} + +pub struct TextInput { + focus_handle: FocusHandle, + content: SharedString, + placeholder: SharedString, + cursor: usize, + last_layout: Option, + last_bounds: Option>, +} + +impl TextInput { + pub fn new(cx: &mut App, placeholder: impl Into) -> Entity { + let placeholder = placeholder.into(); + cx.new(|cx| Self { + focus_handle: cx.focus_handle(), + content: "".into(), + placeholder, + cursor: 0, + last_layout: None, + last_bounds: None, + }) + } + + pub fn value(&self) -> String { + self.content.to_string() + } + + pub fn clear(&mut self) { + self.content = "".into(); + self.cursor = 0; + self.last_layout = None; + self.last_bounds = None; + } + + fn move_to(&mut self, offset: usize, cx: &mut Context) { + self.cursor = offset.min(self.content.len()); + cx.notify(); + } + + fn previous_boundary(&self) -> usize { + self.content + .grapheme_indices(true) + .rev() + .find_map(|(index, _)| (index < self.cursor).then_some(index)) + .unwrap_or(0) + } + + fn next_boundary(&self) -> usize { + self.content + .grapheme_indices(true) + .find_map(|(index, _)| (index > self.cursor).then_some(index)) + .unwrap_or(self.content.len()) + } + + fn offset_from_utf16(&self, offset: usize) -> usize { + let mut utf8_offset = 0; + let mut utf16_count = 0; + for ch in self.content.chars() { + if utf16_count >= offset { + break; + } + utf16_count += ch.len_utf16(); + utf8_offset += ch.len_utf8(); + } + utf8_offset + } + + fn offset_to_utf16(&self, offset: usize) -> usize { + let mut utf16_offset = 0; + let mut utf8_count = 0; + for ch in self.content.chars() { + if utf8_count >= offset { + break; + } + utf8_count += ch.len_utf8(); + utf16_offset += ch.len_utf16(); + } + utf16_offset + } + + fn index_for_mouse_position(&self, position: Point) -> usize { + let (Some(bounds), Some(line)) = (self.last_bounds.as_ref(), self.last_layout.as_ref()) + else { + return 0; + }; + if position.x <= bounds.left() { + return 0; + } + if position.x >= bounds.right() { + return self.content.len(); + } + line.closest_index_for_x(position.x - bounds.left()) + } + + fn left(&mut self, _: &Left, _: &mut Window, cx: &mut Context) { + self.move_to(self.previous_boundary(), cx); + } + + fn right(&mut self, _: &Right, _: &mut Window, cx: &mut Context) { + self.move_to(self.next_boundary(), cx); + } + + fn home(&mut self, _: &Home, _: &mut Window, cx: &mut Context) { + self.move_to(0, cx); + } + + fn end(&mut self, _: &End, _: &mut Window, cx: &mut Context) { + self.move_to(self.content.len(), cx); + } + + fn backspace(&mut self, _: &Backspace, window: &mut Window, cx: &mut Context) { + let previous = self.previous_boundary(); + if previous < self.cursor { + self.replace_text_in_range( + Some(self.offset_to_utf16(previous)..self.offset_to_utf16(self.cursor)), + "", + window, + cx, + ); + } + } + + fn delete(&mut self, _: &Delete, window: &mut Window, cx: &mut Context) { + let next = self.next_boundary(); + if self.cursor < next { + self.replace_text_in_range( + Some(self.offset_to_utf16(self.cursor)..self.offset_to_utf16(next)), + "", + window, + cx, + ); + } + } + + fn paste(&mut self, _: &Paste, window: &mut Window, cx: &mut Context) { + if let Some(text) = cx.read_from_clipboard().and_then(|item| item.text()) { + self.replace_text_in_range(None, &text.replace('\n', " "), window, cx); + } + } + + fn on_mouse_down( + &mut self, + event: &MouseDownEvent, + _window: &mut Window, + cx: &mut Context, + ) { + self.move_to(self.index_for_mouse_position(event.position), cx); + } + + fn show_character_palette( + &mut self, + _: &ShowCharacterPalette, + window: &mut Window, + _: &mut Context, + ) { + window.show_character_palette(); + } +} + +impl EntityInputHandler for TextInput { + fn text_for_range( + &mut self, + range_utf16: Range, + actual_range: &mut Option>, + _window: &mut Window, + _cx: &mut Context, + ) -> Option { + let range = + self.offset_from_utf16(range_utf16.start)..self.offset_from_utf16(range_utf16.end); + actual_range.replace(self.offset_to_utf16(range.start)..self.offset_to_utf16(range.end)); + Some(self.content[range].to_string()) + } + + fn selected_text_range( + &mut self, + _ignore_disabled_input: bool, + _window: &mut Window, + _cx: &mut Context, + ) -> Option { + let cursor = self.offset_to_utf16(self.cursor); + Some(UTF16Selection { + range: cursor..cursor, + reversed: false, + }) + } + + fn marked_text_range( + &self, + _window: &mut Window, + _cx: &mut Context, + ) -> Option> { + None + } + + fn unmark_text(&mut self, _window: &mut Window, _cx: &mut Context) {} + + fn replace_text_in_range( + &mut self, + range_utf16: Option>, + new_text: &str, + _window: &mut Window, + cx: &mut Context, + ) { + let range = range_utf16 + .map(|range| self.offset_from_utf16(range.start)..self.offset_from_utf16(range.end)) + .unwrap_or(self.cursor..self.cursor); + self.content = format!( + "{}{}{}", + &self.content[..range.start], + new_text, + &self.content[range.end..] + ) + .into(); + self.cursor = range.start + new_text.len(); + cx.notify(); + } + + fn replace_and_mark_text_in_range( + &mut self, + range_utf16: Option>, + new_text: &str, + _new_selected_range_utf16: Option>, + window: &mut Window, + cx: &mut Context, + ) { + self.replace_text_in_range(range_utf16, new_text, window, cx); + } + + fn bounds_for_range( + &mut self, + range_utf16: Range, + bounds: Bounds, + _window: &mut Window, + _cx: &mut Context, + ) -> Option> { + let layout = self.last_layout.as_ref()?; + let start = self.offset_from_utf16(range_utf16.start); + let end = self.offset_from_utf16(range_utf16.end); + Some(Bounds::from_corners( + point(bounds.left() + layout.x_for_index(start), bounds.top()), + point(bounds.left() + layout.x_for_index(end), bounds.bottom()), + )) + } + + fn character_index_for_point( + &mut self, + point: Point, + _window: &mut Window, + _cx: &mut Context, + ) -> Option { + let layout = self.last_layout.as_ref()?; + let bounds = self.last_bounds.as_ref()?; + let index = layout.index_for_x(point.x - bounds.left())?; + Some(self.offset_to_utf16(index)) + } +} + +struct TextElement { + input: Entity, +} + +struct PrepaintState { + line: ShapedLine, + cursor: PaintQuad, +} + +impl IntoElement for TextElement { + type Element = Self; + + fn into_element(self) -> Self::Element { + self + } +} + +impl Element for TextElement { + type RequestLayoutState = (); + type PrepaintState = PrepaintState; + + fn id(&self) -> Option { + None + } + fn source_location(&self) -> Option<&'static core::panic::Location<'static>> { + None + } + + fn request_layout( + &mut self, + _id: Option<&GlobalElementId>, + _inspector_id: Option<&gpui::InspectorElementId>, + window: &mut Window, + cx: &mut App, + ) -> (LayoutId, Self::RequestLayoutState) { + let mut style = Style::default(); + style.size.width = relative(1.0).into(); + style.size.height = window.line_height().into(); + (window.request_layout(style, [], cx), ()) + } + + fn prepaint( + &mut self, + _id: Option<&GlobalElementId>, + _inspector_id: Option<&gpui::InspectorElementId>, + bounds: Bounds, + _request_layout: &mut Self::RequestLayoutState, + window: &mut Window, + cx: &mut App, + ) -> Self::PrepaintState { + let input = self.input.read(cx); + let style = window.text_style(); + let text = if input.content.is_empty() { + input.placeholder.clone() + } else { + input.content.clone() + }; + let color = if input.content.is_empty() { + hsla(0.0, 0.0, 0.0, 0.35) + } else { + style.color + }; + let run = TextRun { + len: text.len(), + font: style.font(), + color, + background_color: None, + underline: None, + strikethrough: None, + }; + let font_size = style.font_size.to_pixels(window.rem_size()); + let line = window + .text_system() + .shape_line(text, font_size, &[run], None); + let cursor_x = bounds.left() + line.x_for_index(input.cursor); + let cursor = fill( + Bounds::new( + point(cursor_x, bounds.top()), + size(px(2.0), bounds.bottom() - bounds.top()), + ), + rgb(0x9e3d2d), + ); + PrepaintState { line, cursor } + } + + fn paint( + &mut self, + _id: Option<&GlobalElementId>, + _inspector_id: Option<&gpui::InspectorElementId>, + bounds: Bounds, + _request_layout: &mut Self::RequestLayoutState, + prepaint: &mut Self::PrepaintState, + window: &mut Window, + cx: &mut App, + ) { + let focus_handle = self.input.read(cx).focus_handle.clone(); + window.handle_input( + &focus_handle, + ElementInputHandler::new(bounds, self.input.clone()), + cx, + ); + prepaint + .line + .paint(bounds.origin, window.line_height(), window, cx) + .ok(); + if focus_handle.is_focused(window) { + window.paint_quad(prepaint.cursor.clone()); + } + let line = prepaint.line.clone(); + self.input.update(cx, |input, _| { + input.last_layout = Some(line); + input.last_bounds = Some(bounds); + }); + } +} + +impl Render for TextInput { + fn render(&mut self, _window: &mut Window, cx: &mut Context) -> impl IntoElement { + div() + .key_context("TextInput") + .track_focus(&self.focus_handle(cx)) + .cursor(CursorStyle::IBeam) + .on_action(cx.listener(Self::backspace)) + .on_action(cx.listener(Self::delete)) + .on_action(cx.listener(Self::left)) + .on_action(cx.listener(Self::right)) + .on_action(cx.listener(Self::home)) + .on_action(cx.listener(Self::end)) + .on_action(cx.listener(Self::paste)) + .on_action(cx.listener(Self::show_character_palette)) + .on_mouse_down(MouseButton::Left, cx.listener(Self::on_mouse_down)) + .bg(rgb(0xfffbf5)) + .border_1() + .border_color(rgb(0xd9cdbf)) + .rounded_md() + .px_3() + .py_2() + .line_height(px(24.0)) + .text_size(px(18.0)) + .child( + div() + .h(px(24.0)) + .w_full() + .bg(white()) + .child(TextElement { input: cx.entity() }), + ) + } +} + +impl Focusable for TextInput { + fn focus_handle(&self, _: &App) -> FocusHandle { + self.focus_handle.clone() + } +} diff --git a/AgentCompany-Rust/crates/domain/Cargo.toml b/AgentCompany-Rust/crates/domain/Cargo.toml new file mode 100644 index 00000000..65b483a3 --- /dev/null +++ b/AgentCompany-Rust/crates/domain/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "domain" +edition.workspace = true +license.workspace = true +publish.workspace = true +version.workspace = true + +[dependencies] +serde.workspace = true +serde_json.workspace = true diff --git a/AgentCompany-Rust/crates/domain/src/catalog.rs b/AgentCompany-Rust/crates/domain/src/catalog.rs new file mode 100644 index 00000000..c35d9499 --- /dev/null +++ b/AgentCompany-Rust/crates/domain/src/catalog.rs @@ -0,0 +1,139 @@ +#[derive(Clone, Copy, Debug)] +pub struct ConnectorSeed { + pub id: &'static str, + pub label: &'static str, + pub description: &'static str, +} + +pub const CONNECTOR_SEEDS: &[ConnectorSeed] = &[ + ConnectorSeed { + id: "claude-pro", + label: "Claude Pro", + description: "Anthropic OAuth session for Claude Pro.", + }, + ConnectorSeed { + id: "openai-codex", + label: "OpenAI Codex", + description: "OpenAI OAuth session for Codex desktop flows.", + }, + ConnectorSeed { + id: "github-copilot", + label: "GitHub Copilot", + description: "GitHub Copilot OAuth session.", + }, + ConnectorSeed { + id: "gemini-cli", + label: "Gemini CLI", + description: "Google Gemini CLI OAuth session.", + }, + ConnectorSeed { + id: "antigravity", + label: "Antigravity", + description: "Google Antigravity OAuth session.", + }, + ConnectorSeed { + id: "anthropic", + label: "Anthropic", + description: "Anthropic API key connector.", + }, + ConnectorSeed { + id: "openai", + label: "OpenAI", + description: "OpenAI API key connector.", + }, + ConnectorSeed { + id: "google", + label: "Google", + description: "Google AI Studio API key connector.", + }, + ConnectorSeed { + id: "mistral", + label: "Mistral", + description: "Mistral API key connector.", + }, + ConnectorSeed { + id: "groq", + label: "Groq", + description: "Groq API key connector.", + }, + ConnectorSeed { + id: "cerebras", + label: "Cerebras", + description: "Cerebras API key connector.", + }, + ConnectorSeed { + id: "xai", + label: "xAI", + description: "xAI API key connector.", + }, + ConnectorSeed { + id: "openrouter", + label: "OpenRouter", + description: "OpenRouter API key connector.", + }, + ConnectorSeed { + id: "vercel-ai-gateway", + label: "Vercel AI Gateway", + description: "Vercel AI Gateway API key connector.", + }, + ConnectorSeed { + id: "zai", + label: "Z AI", + description: "Z AI API key connector.", + }, + ConnectorSeed { + id: "opencode", + label: "OpenCode", + description: "OpenCode API key connector.", + }, + ConnectorSeed { + id: "opencode-go", + label: "OpenCode Go", + description: "OpenCode Go API key connector.", + }, + ConnectorSeed { + id: "huggingface", + label: "Hugging Face", + description: "Hugging Face API key connector.", + }, + ConnectorSeed { + id: "kimi-coding", + label: "Kimi Coding", + description: "Kimi Coding API key connector.", + }, + ConnectorSeed { + id: "minimax", + label: "MiniMax", + description: "MiniMax global API connector.", + }, + ConnectorSeed { + id: "minimax-cn", + label: "MiniMax CN", + description: "MiniMax China API connector.", + }, + ConnectorSeed { + id: "fireworks", + label: "Fireworks", + description: "Fireworks API key connector.", + }, + ConnectorSeed { + id: "fireworks-firepass", + label: "Fireworks Firepass", + description: "Fireworks Firepass API key connector.", + }, + ConnectorSeed { + id: "amazon-bedrock", + label: "Amazon Bedrock", + description: "AWS Bedrock cloud connector.", + }, + ConnectorSeed { + id: "azure-openai", + label: "Azure OpenAI", + description: "Azure OpenAI cloud connector.", + }, + ConnectorSeed { + id: "google-vertex", + label: "Google Vertex", + description: "Google Vertex AI cloud connector.", + }, +]; diff --git a/AgentCompany-Rust/crates/domain/src/enums.rs b/AgentCompany-Rust/crates/domain/src/enums.rs new file mode 100644 index 00000000..7b785683 --- /dev/null +++ b/AgentCompany-Rust/crates/domain/src/enums.rs @@ -0,0 +1,130 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum SectionId { + #[default] + Overview, + Runs, + Inbox, + Messages, + Approvals, + Documents, + Workspaces, + Settings, +} + +impl SectionId { + pub fn label(self) -> &'static str { + match self { + Self::Overview => "Dashboard", + Self::Runs => "Runs", + Self::Inbox => "Inbox", + Self::Messages => "Messages", + Self::Approvals => "Approvals", + Self::Documents => "Documents", + Self::Workspaces => "Workspaces", + Self::Settings => "Settings", + } + } +} + +#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum CompanyStatus { + #[default] + Active, + Paused, + Archived, +} + +#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum ExecutionMode { + #[default] + AiCeo, + AiCofounder, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum WorkspaceState { + Ready, + Busy, + Blocked, + Missing, + Error, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum AgentStatus { + Idle, + Active, + Running, + Paused, + Error, + PendingApproval, + Terminated, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum TaskStatus { + Backlog, + Todo, + InProgress, + InReview, + Done, + Blocked, + Cancelled, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum ApprovalState { + Pending, + Approved, + Rejected, + RevisionRequested, +} + +impl ApprovalState { + pub fn as_str(self) -> &'static str { + match self { + Self::Pending => "pending", + Self::Approved => "approved", + Self::Rejected => "rejected", + Self::RevisionRequested => "revision_requested", + } + } +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum MessageChannel { + Direct, + Company, + Department, + Project, + Incident, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum DocumentStatus { + Draft, + InReview, + Approved, + Archived, + Superseded, +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum ThreadWaitingFor { + HumanApproval, + HumanReply, + ToolResult, + ExternalEvent, +} diff --git a/AgentCompany-Rust/crates/domain/src/lib.rs b/AgentCompany-Rust/crates/domain/src/lib.rs new file mode 100644 index 00000000..3b567dfd --- /dev/null +++ b/AgentCompany-Rust/crates/domain/src/lib.rs @@ -0,0 +1,9 @@ +pub mod catalog; +pub mod enums; +pub mod models; +pub mod snapshot; + +pub use catalog::{CONNECTOR_SEEDS, ConnectorSeed}; +pub use enums::*; +pub use models::*; +pub use snapshot::ProfileSnapshot; diff --git a/AgentCompany-Rust/crates/domain/src/models.rs b/AgentCompany-Rust/crates/domain/src/models.rs new file mode 100644 index 00000000..f7839d7f --- /dev/null +++ b/AgentCompany-Rust/crates/domain/src/models.rs @@ -0,0 +1,213 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +pub struct Company { + pub id: String, + pub name: String, + pub description: String, + pub status: String, + pub auto_approve_hires: bool, + pub review_deliverables: bool, + pub execution_mode: String, + pub created_at: String, + pub updated_at: String, +} + +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +pub struct Connector { + pub id: String, + pub label: String, + pub description: String, + pub status: String, + pub version: Option, + pub auth_state: String, + pub last_checked_at: Option, + pub last_error: Option, + pub model: Option, + pub env_binding_text: String, + pub notes: String, +} + +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +pub struct Workspace { + pub id: String, + pub company_id: String, + pub name: String, + pub local_path: String, + pub repo_url: String, + pub repo_ref: String, + pub project_id: Option, + pub state: String, + pub is_primary: bool, + pub created_at: String, + pub updated_at: String, +} + +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +pub struct Agent { + pub id: String, + pub company_id: String, + pub name: String, + pub role: String, + pub title: String, + pub department: Option, + pub status: String, + pub reports_to: Option, + pub connector_id: String, + pub workspace_id: Option, + pub model: Option, + pub capabilities: String, + pub budget_monthly_usd: f64, + pub spent_monthly_usd: f64, + pub created_at: String, + pub updated_at: String, +} + +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +pub struct Goal { + pub id: String, + pub company_id: String, + pub title: String, + pub description: String, + pub parent_id: Option, + pub owner_agent_id: Option, + pub status: String, + pub created_at: String, + pub updated_at: String, +} + +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +pub struct Project { + pub id: String, + pub company_id: String, + pub goal_id: Option, + pub name: String, + pub description: String, + pub lead_agent_id: Option, + pub status: String, + pub target_date: Option, + pub created_at: String, + pub updated_at: String, +} + +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +pub struct Task { + pub id: String, + pub company_id: String, + pub project_id: Option, + pub goal_id: Option, + pub parent_id: Option, + pub title: String, + pub description: String, + pub assignee_agent_id: Option, + pub workspace_id: Option, + pub status: String, + pub priority: String, + pub active_run_id: Option, + pub cost_usd: f64, + pub task_type: Option, + pub requires_user_review: bool, + pub started_at: Option, + pub completed_at: Option, + pub cancelled_at: Option, + pub created_at: String, + pub updated_at: String, +} + +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +pub struct Approval { + pub id: String, + pub company_id: String, + pub related_task_id: Option, + pub related_agent_id: Option, + pub requested_by_agent_id: Option, + pub approval_type: String, + pub payload_summary: String, + pub impact_summary: String, + pub payload_json: Option, + pub decision_note: String, + pub state: String, + pub created_at: String, + pub updated_at: String, +} + +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +pub struct Run { + pub id: String, + pub company_id: String, + pub task_id: Option, + pub agent_id: String, + pub workspace_id: Option, + pub connector_id: String, + pub status: String, + pub summary: String, + pub error_message: Option, + pub model: Option, + pub cost_usd: Option, + pub started_at: Option, + pub finished_at: Option, + pub created_at: String, + pub updated_at: String, +} + +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +pub struct Activity { + pub id: String, + pub company_id: String, + pub actor: String, + pub action: String, + pub entity_type: String, + pub entity_id: String, + pub detail: String, + pub created_at: String, +} + +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +pub struct AgentMessage { + pub id: String, + pub company_id: String, + pub from_agent_id: String, + pub to_agent_id: Option, + pub sender_kind: String, + pub channel: String, + pub channel_target_id: Option, + pub subject: String, + pub body: String, + pub priority: String, + pub read_at: Option, + pub parent_message_id: Option, + pub attachments_json: String, + pub created_at: String, +} + +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +pub struct Document { + pub id: String, + pub company_id: String, + pub document_type: String, + pub title: String, + pub content: String, + pub author_agent_id: Option, + pub reviewer_agent_id: Option, + pub project_id: Option, + pub goal_id: Option, + pub parent_doc_id: Option, + pub version: i64, + pub status: String, + pub tags_json: String, + pub latest_revision_id: Option, + pub created_at: String, + pub updated_at: String, +} + +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +pub struct ThreadWaitState { + pub id: String, + pub thread_id: String, + pub company_id: String, + pub waiting_for: String, + pub related_approval_id: Option, + pub reason: String, + pub created_at: String, + pub resolved_at: Option, +} diff --git a/AgentCompany-Rust/crates/domain/src/snapshot.rs b/AgentCompany-Rust/crates/domain/src/snapshot.rs new file mode 100644 index 00000000..ff215ed4 --- /dev/null +++ b/AgentCompany-Rust/crates/domain/src/snapshot.rs @@ -0,0 +1,71 @@ +use crate::{ + Activity, Agent, AgentMessage, Approval, Company, Connector, Document, Goal, Project, Run, + Task, Workspace, +}; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +pub struct ProfileSnapshot { + pub current_company_id: Option, + pub profile_path: String, + pub theme: String, + pub locale: String, + pub companies: Vec, + pub connectors: Vec, + pub workspaces: Vec, + pub agents: Vec, + pub goals: Vec, + pub projects: Vec, + pub tasks: Vec, + pub approvals: Vec, + pub runs: Vec, + pub activity: Vec, + pub agent_messages: Vec, + pub documents: Vec, +} + +impl ProfileSnapshot { + pub fn current_company(&self) -> Option<&Company> { + self.current_company_id + .as_ref() + .and_then(|company_id| { + self.companies + .iter() + .find(|company| &company.id == company_id) + }) + .or_else(|| self.companies.first()) + } + + pub fn unread_messages(&self) -> usize { + self.agent_messages + .iter() + .filter(|message| message.read_at.is_none()) + .count() + } + + pub fn pending_approvals(&self) -> usize { + self.approvals + .iter() + .filter(|approval| approval.state == "pending") + .count() + } + + pub fn active_tasks(&self) -> usize { + self.tasks + .iter() + .filter(|task| matches!(task.status.as_str(), "todo" | "in_progress" | "in_review")) + .count() + } + + pub fn active_runs(&self) -> usize { + self.runs + .iter() + .filter(|run| { + matches!( + run.status.as_str(), + "queued" | "running" | "waiting_approval" | "paused" + ) + }) + .count() + } +} diff --git a/AgentCompany-Rust/crates/pi_bridge/Cargo.toml b/AgentCompany-Rust/crates/pi_bridge/Cargo.toml new file mode 100644 index 00000000..a3f38d51 --- /dev/null +++ b/AgentCompany-Rust/crates/pi_bridge/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "pi_bridge" +edition.workspace = true +license.workspace = true +publish.workspace = true +version.workspace = true + +[dependencies] +anyhow.workspace = true +serde.workspace = true +serde_json.workspace = true +uuid.workspace = true diff --git a/AgentCompany-Rust/crates/pi_bridge/src/client.rs b/AgentCompany-Rust/crates/pi_bridge/src/client.rs new file mode 100644 index 00000000..32369621 --- /dev/null +++ b/AgentCompany-Rust/crates/pi_bridge/src/client.rs @@ -0,0 +1,79 @@ +use crate::{ClientRequest, RuntimeEvent}; +use anyhow::{Context, Result}; +use std::{ + io::{BufRead, BufReader, Write}, + path::PathBuf, + process::{Child, ChildStdin, ChildStdout, Command, Stdio}, +}; + +pub struct PiBridgeClient { + child: Child, + stdin: ChildStdin, + stdout: BufReader, +} + +impl PiBridgeClient { + pub fn spawn(command: PathBuf, args: &[String], working_dir: Option) -> Result { + let mut process = Command::new(&command); + process + .args(args) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::inherit()); + + if let Some(dir) = working_dir { + process.current_dir(dir); + } + + let mut child = process + .spawn() + .with_context(|| format!("failed to spawn Pi Mono sidecar at {}", command.display()))?; + let stdin = child + .stdin + .take() + .context("Pi Mono sidecar stdin is unavailable")?; + let stdout = child + .stdout + .take() + .context("Pi Mono sidecar stdout is unavailable")?; + Ok(Self { + child, + stdin, + stdout: BufReader::new(stdout), + }) + } + + pub fn send(&mut self, message: &ClientRequest) -> Result<()> { + let payload = + serde_json::to_vec(message).context("failed to serialize Pi bridge request")?; + self.stdin + .write_all(&payload) + .context("failed to write Pi bridge request")?; + self.stdin + .write_all(b"\n") + .context("failed to terminate Pi bridge request")?; + self.stdin + .flush() + .context("failed to flush Pi bridge request")?; + Ok(()) + } + + pub fn read_event(&mut self) -> Result { + let mut line = String::new(); + let bytes = self + .stdout + .read_line(&mut line) + .context("failed to read Pi bridge event")?; + if bytes == 0 { + return Err(anyhow::anyhow!("Pi Mono sidecar closed stdout")); + } + serde_json::from_str(line.trim()).context("failed to decode Pi bridge event") + } + + pub fn wait(&mut self) -> Result<()> { + self.child + .wait() + .context("failed while waiting for Pi Mono sidecar")?; + Ok(()) + } +} diff --git a/AgentCompany-Rust/crates/pi_bridge/src/lib.rs b/AgentCompany-Rust/crates/pi_bridge/src/lib.rs new file mode 100644 index 00000000..f1931788 --- /dev/null +++ b/AgentCompany-Rust/crates/pi_bridge/src/lib.rs @@ -0,0 +1,5 @@ +pub mod client; +pub mod protocol; + +pub use client::PiBridgeClient; +pub use protocol::*; diff --git a/AgentCompany-Rust/crates/pi_bridge/src/protocol.rs b/AgentCompany-Rust/crates/pi_bridge/src/protocol.rs new file mode 100644 index 00000000..9f39650d --- /dev/null +++ b/AgentCompany-Rust/crates/pi_bridge/src/protocol.rs @@ -0,0 +1,98 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct RuntimeHandshake { + pub protocol_version: u32, + pub app_name: String, + pub app_version: String, +} + +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +pub struct RunBudget { + pub thinking_level: Option, + pub token_budget: Option, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct RunRequest { + pub run_id: String, + pub session_id: Option, + pub company_id: String, + pub task_id: Option, + pub agent_id: String, + pub workspace_path: Option, + pub connector_id: String, + pub model: Option, + pub prompt: String, + pub context_json: serde_json::Value, + pub budget: RunBudget, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct ToolApprovalDecision { + pub run_id: String, + pub tool_call_id: String, + pub approved: bool, + pub note: String, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct SteerRequest { + pub run_id: String, + pub body: String, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct FollowUpRequest { + pub run_id: String, + pub body: String, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +#[serde(tag = "kind", rename_all = "snake_case")] +pub enum ClientRequest { + Handshake(RuntimeHandshake), + StartRun(Box), + ToolApproval(ToolApprovalDecision), + Steer(SteerRequest), + FollowUp(FollowUpRequest), +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +#[serde(tag = "kind", rename_all = "snake_case")] +pub enum RuntimeEvent { + HandshakeAck { + protocol_version: u32, + runtime_version: String, + }, + Message { + run_id: String, + role: String, + body: String, + }, + ToolCall { + run_id: String, + tool_call_id: String, + tool_name: String, + input_json: serde_json::Value, + }, + ToolResult { + run_id: String, + tool_call_id: String, + output_json: serde_json::Value, + }, + Artifact { + run_id: String, + provider: String, + external_id: String, + title: String, + metadata_json: serde_json::Value, + }, + RunFinished { + run_id: String, + status: String, + summary: String, + session_id: Option, + cost_usd: Option, + }, +} diff --git a/AgentCompany-Rust/crates/runtime/Cargo.toml b/AgentCompany-Rust/crates/runtime/Cargo.toml new file mode 100644 index 00000000..149b4358 --- /dev/null +++ b/AgentCompany-Rust/crates/runtime/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "runtime" +edition.workspace = true +license.workspace = true +publish.workspace = true +version.workspace = true + +[dependencies] +anyhow.workspace = true +pi_bridge.workspace = true + +[dev-dependencies] +serde_json.workspace = true diff --git a/AgentCompany-Rust/crates/runtime/src/lib.rs b/AgentCompany-Rust/crates/runtime/src/lib.rs new file mode 100644 index 00000000..6569336d --- /dev/null +++ b/AgentCompany-Rust/crates/runtime/src/lib.rs @@ -0,0 +1,3 @@ +pub mod service; + +pub use service::{RuntimeConfig, RuntimeService}; diff --git a/AgentCompany-Rust/crates/runtime/src/service.rs b/AgentCompany-Rust/crates/runtime/src/service.rs new file mode 100644 index 00000000..5de986b5 --- /dev/null +++ b/AgentCompany-Rust/crates/runtime/src/service.rs @@ -0,0 +1,51 @@ +use anyhow::Result; +use pi_bridge::{ + ClientRequest, FollowUpRequest, PiBridgeClient, RunRequest, RuntimeEvent, RuntimeHandshake, + SteerRequest, ToolApprovalDecision, +}; +use std::path::PathBuf; + +#[derive(Clone, Debug, Default)] +pub struct RuntimeConfig { + pub command: PathBuf, + pub args: Vec, + pub working_dir: Option, +} + +pub struct RuntimeService { + client: PiBridgeClient, +} + +impl RuntimeService { + pub fn connect(config: RuntimeConfig) -> Result { + Ok(Self { + client: PiBridgeClient::spawn(config.command, &config.args, config.working_dir)?, + }) + } + + pub fn handshake(&mut self, message: RuntimeHandshake) -> Result { + self.client.send(&ClientRequest::Handshake(message))?; + self.client.read_event() + } + + pub fn start_run(&mut self, request: RunRequest) -> Result<()> { + self.client + .send(&ClientRequest::StartRun(Box::new(request))) + } + + pub fn decide_tool_call(&mut self, decision: ToolApprovalDecision) -> Result<()> { + self.client.send(&ClientRequest::ToolApproval(decision)) + } + + pub fn steer(&mut self, request: SteerRequest) -> Result<()> { + self.client.send(&ClientRequest::Steer(request)) + } + + pub fn follow_up(&mut self, request: FollowUpRequest) -> Result<()> { + self.client.send(&ClientRequest::FollowUp(request)) + } + + pub fn next_event(&mut self) -> Result { + self.client.read_event() + } +} diff --git a/AgentCompany-Rust/crates/runtime/tests/sidecar_contract.rs b/AgentCompany-Rust/crates/runtime/tests/sidecar_contract.rs new file mode 100644 index 00000000..2c427d50 --- /dev/null +++ b/AgentCompany-Rust/crates/runtime/tests/sidecar_contract.rs @@ -0,0 +1,170 @@ +use pi_bridge::{ + FollowUpRequest, RunBudget, RunRequest, RuntimeEvent, RuntimeHandshake, SteerRequest, + ToolApprovalDecision, +}; +use runtime::{RuntimeConfig, RuntimeService}; +use std::path::PathBuf; + +fn fake_sidecar_script() -> &'static str { + r#" +while IFS= read -r line; do + case "$line" in + *'"kind":"handshake"'*) + printf '%s\n' '{"kind":"handshake_ack","protocol_version":1,"runtime_version":"pi-mono-test"}' + ;; + *'"kind":"start_run"'*) + printf '%s\n' '{"kind":"message","run_id":"run-1","role":"assistant","body":"Run queued"}' + printf '%s\n' '{"kind":"tool_call","run_id":"run-1","tool_call_id":"tool-1","tool_name":"write_file","input_json":{"path":"README.md"}}' + ;; + *'"kind":"tool_approval"'*) + printf '%s\n' '{"kind":"tool_result","run_id":"run-1","tool_call_id":"tool-1","output_json":{"status":"approved"}}' + printf '%s\n' '{"kind":"run_finished","run_id":"run-1","status":"completed","summary":"Run complete","session_id":"session-1","cost_usd":1.25}' + ;; + *'"kind":"steer"'*) + printf '%s\n' '{"kind":"message","run_id":"run-1","role":"system","body":"Steer accepted"}' + ;; + *'"kind":"follow_up"'*) + printf '%s\n' '{"kind":"message","run_id":"run-1","role":"system","body":"Follow-up accepted"}' + ;; + esac +done +"# +} + +#[test] +fn runtime_service_round_trips_sidecar_contract() { + let mut service = RuntimeService::connect(RuntimeConfig { + command: PathBuf::from("/bin/sh"), + args: vec!["-c".to_string(), fake_sidecar_script().to_string()], + working_dir: None, + }) + .expect("connect runtime"); + + let handshake = service + .handshake(RuntimeHandshake { + protocol_version: 1, + app_name: "AgentCompany-Rust".to_string(), + app_version: "0.1.0".to_string(), + }) + .expect("handshake"); + match handshake { + RuntimeEvent::HandshakeAck { + protocol_version, + runtime_version, + } => { + assert_eq!(protocol_version, 1); + assert_eq!(runtime_version, "pi-mono-test"); + } + other => panic!("unexpected handshake event: {other:?}"), + } + + service + .start_run(RunRequest { + run_id: "run-1".to_string(), + session_id: Some("session-1".to_string()), + company_id: "company-1".to_string(), + task_id: Some("task-1".to_string()), + agent_id: "agent-1".to_string(), + workspace_path: Some("/tmp/agentcompany".to_string()), + connector_id: "anthropic".to_string(), + model: Some("claude-sonnet".to_string()), + prompt: "Draft the weekly status update".to_string(), + context_json: serde_json::json!({ "thread_id": "thread-1" }), + budget: RunBudget { + thinking_level: Some("high".to_string()), + token_budget: Some(4096), + }, + }) + .expect("start run"); + + let first_event = service.next_event().expect("first event"); + match first_event { + RuntimeEvent::Message { run_id, role, body } => { + assert_eq!(run_id, "run-1"); + assert_eq!(role, "assistant"); + assert_eq!(body, "Run queued"); + } + other => panic!("unexpected first event: {other:?}"), + } + + let second_event = service.next_event().expect("second event"); + match second_event { + RuntimeEvent::ToolCall { + run_id, + tool_call_id, + tool_name, + input_json, + } => { + assert_eq!(run_id, "run-1"); + assert_eq!(tool_call_id, "tool-1"); + assert_eq!(tool_name, "write_file"); + assert_eq!(input_json["path"], "README.md"); + } + other => panic!("unexpected second event: {other:?}"), + } + + service + .decide_tool_call(ToolApprovalDecision { + run_id: "run-1".to_string(), + tool_call_id: "tool-1".to_string(), + approved: true, + note: "Approved from test.".to_string(), + }) + .expect("tool approval"); + + let third_event = service.next_event().expect("third event"); + match third_event { + RuntimeEvent::ToolResult { + run_id, + tool_call_id, + output_json, + } => { + assert_eq!(run_id, "run-1"); + assert_eq!(tool_call_id, "tool-1"); + assert_eq!(output_json["status"], "approved"); + } + other => panic!("unexpected third event: {other:?}"), + } + + let fourth_event = service.next_event().expect("fourth event"); + match fourth_event { + RuntimeEvent::RunFinished { + run_id, + status, + summary, + session_id, + cost_usd, + } => { + assert_eq!(run_id, "run-1"); + assert_eq!(status, "completed"); + assert_eq!(summary, "Run complete"); + assert_eq!(session_id.as_deref(), Some("session-1")); + assert_eq!(cost_usd, Some(1.25)); + } + other => panic!("unexpected fourth event: {other:?}"), + } + + service + .steer(SteerRequest { + run_id: "run-1".to_string(), + body: "Tighten the summary.".to_string(), + }) + .expect("steer"); + let steer_event = service.next_event().expect("steer event"); + match steer_event { + RuntimeEvent::Message { body, .. } => assert_eq!(body, "Steer accepted"), + other => panic!("unexpected steer event: {other:?}"), + } + + service + .follow_up(FollowUpRequest { + run_id: "run-1".to_string(), + body: "Add customer risk notes.".to_string(), + }) + .expect("follow up"); + let follow_up_event = service.next_event().expect("follow up event"); + match follow_up_event { + RuntimeEvent::Message { body, .. } => assert_eq!(body, "Follow-up accepted"), + other => panic!("unexpected follow-up event: {other:?}"), + } +} diff --git a/AgentCompany-Rust/crates/storage/Cargo.toml b/AgentCompany-Rust/crates/storage/Cargo.toml new file mode 100644 index 00000000..02076e33 --- /dev/null +++ b/AgentCompany-Rust/crates/storage/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "storage" +edition.workspace = true +license.workspace = true +publish.workspace = true +version.workspace = true + +[dependencies] +anyhow.workspace = true +domain.workspace = true +rusqlite.workspace = true +serde_json.workspace = true +support.workspace = true +uuid.workspace = true + +[dev-dependencies] +tempfile.workspace = true diff --git a/AgentCompany-Rust/crates/storage/src/lib.rs b/AgentCompany-Rust/crates/storage/src/lib.rs new file mode 100644 index 00000000..e86f5407 --- /dev/null +++ b/AgentCompany-Rust/crates/storage/src/lib.rs @@ -0,0 +1,4 @@ +mod schema; +mod store; + +pub use store::{NewCompanyInput, ProfileStore}; diff --git a/AgentCompany-Rust/crates/storage/src/schema.rs b/AgentCompany-Rust/crates/storage/src/schema.rs new file mode 100644 index 00000000..1e56d52f --- /dev/null +++ b/AgentCompany-Rust/crates/storage/src/schema.rs @@ -0,0 +1,343 @@ +use anyhow::Result; +use domain::CONNECTOR_SEEDS; +use rusqlite::{Connection, params}; +use support::time::now_iso; + +pub fn initialize(conn: &Connection) -> Result<()> { + conn.execute_batch( + r#" + create table if not exists settings ( + key text primary key, + value text not null + ); + + create table if not exists companies ( + id text primary key, + name text not null, + description text not null default '', + status text not null default 'active', + auto_approve_hires integer not null default 0, + review_deliverables integer not null default 0, + execution_mode text not null default 'ai_ceo', + created_at text not null, + updated_at text not null + ); + + create table if not exists connectors ( + id text primary key, + label text not null, + description text not null, + status text not null default 'not_installed', + command text not null default '', + version text null, + auth_state text not null default 'unknown', + last_checked_at text null, + last_error text null, + model text null, + env_binding_text text not null default '', + notes text not null default '', + updated_at text not null + ); + + create table if not exists workspaces ( + id text primary key, + company_id text not null, + name text not null, + local_path text not null, + repo_url text not null default '', + repo_ref text not null default '', + project_id text null, + state text not null default 'ready', + is_primary integer not null default 0, + lock_holder_run_id text null, + lock_acquired_at text null, + created_at text not null, + updated_at text not null, + foreign key(company_id) references companies(id) on delete cascade + ); + + create table if not exists agents ( + id text primary key, + company_id text not null, + name text not null, + role text not null default '', + title text not null default '', + department text null, + status text not null default 'idle', + reports_to text null, + connector_id text not null default 'anthropic', + workspace_id text null, + model text null, + capabilities text not null default '[]', + budget_monthly_usd real not null default 0, + spent_monthly_usd real not null default 0, + metadata_json text not null default '{}', + heartbeat_enabled integer not null default 0, + heartbeat_interval_sec integer not null default 0, + last_heartbeat_at text null, + created_at text not null, + updated_at text not null, + foreign key(company_id) references companies(id) on delete cascade + ); + + create table if not exists goals ( + id text primary key, + company_id text not null, + title text not null, + description text not null default '', + parent_id text null, + owner_agent_id text null, + status text not null default 'planned', + created_at text not null, + updated_at text not null, + foreign key(company_id) references companies(id) on delete cascade + ); + + create table if not exists projects ( + id text primary key, + company_id text not null, + goal_id text null, + name text not null, + description text not null default '', + lead_agent_id text null, + status text not null default 'planned', + target_date text null, + created_at text not null, + updated_at text not null, + foreign key(company_id) references companies(id) on delete cascade + ); + + create table if not exists tasks ( + id text primary key, + company_id text not null, + project_id text null, + goal_id text null, + parent_id text null, + title text not null, + description text not null default '', + assignee_agent_id text null, + workspace_id text null, + status text not null default 'todo', + priority text not null default 'medium', + active_run_id text null, + cost_usd real not null default 0, + task_type text null, + requires_user_review integer not null default 0, + started_at text null, + completed_at text null, + cancelled_at text null, + created_at text not null, + updated_at text not null, + foreign key(company_id) references companies(id) on delete cascade + ); + + create table if not exists approvals ( + id text primary key, + company_id text not null, + related_task_id text null, + requested_by_agent_id text null, + related_agent_id text null, + type text not null, + payload_summary text not null default '', + impact_summary text not null default '', + payload_json text null, + decision_note text not null default '', + state text not null default 'pending', + created_at text not null, + updated_at text not null, + foreign key(company_id) references companies(id) on delete cascade + ); + + create table if not exists runs ( + id text primary key, + company_id text not null, + task_id text null, + agent_id text not null, + workspace_id text null, + connector_id text not null, + status text not null default 'queued', + summary text not null default '', + error_message text null, + exit_code integer null, + signal text null, + model text null, + cost_usd real null, + unattributed_cost integer not null default 0, + started_at text null, + finished_at text null, + log_path text null, + created_at text not null, + updated_at text not null, + foreign key(company_id) references companies(id) on delete cascade + ); + + create table if not exists activity ( + id text primary key, + company_id text not null, + actor text not null, + action text not null, + entity_type text not null, + entity_id text not null, + detail text not null, + created_at text not null, + foreign key(company_id) references companies(id) on delete cascade + ); + + create table if not exists agent_messages ( + id text primary key, + company_id text not null, + from_agent_id text not null, + to_agent_id text null, + sender_kind text not null default 'human', + channel text not null default 'company', + channel_target_id text null, + subject text not null, + body text not null, + priority text not null default 'normal', + read_at text null, + parent_message_id text null, + attachments_json text not null default '[]', + created_at text not null, + foreign key(company_id) references companies(id) on delete cascade + ); + + create table if not exists agent_message_reads ( + message_id text not null, + agent_id text not null, + read_at text not null, + primary key(message_id, agent_id) + ); + + create table if not exists documents ( + id text primary key, + company_id text not null, + type text not null, + title text not null, + content text not null default '', + author_agent_id text null, + reviewer_agent_id text null, + project_id text null, + goal_id text null, + parent_doc_id text null, + version integer not null default 1, + status text not null default 'draft', + tags_json text not null default '[]', + latest_revision_id text null, + source_run_id text null, + created_at text not null, + updated_at text not null, + foreign key(company_id) references companies(id) on delete cascade + ); + + create table if not exists document_revisions ( + id text primary key, + company_id text not null, + document_id text not null, + revision_number integer not null, + body text not null, + change_summary text null, + created_by_agent_id text null, + created_by_user_id text null, + created_at text not null, + foreign key(company_id) references companies(id) on delete cascade, + foreign key(document_id) references documents(id) on delete cascade + ); + + create table if not exists conversation_threads ( + id text primary key, + company_id text not null, + title text not null, + type text not null, + related_entity_type text null, + related_entity_id text null, + created_at text not null, + updated_at text not null, + foreign key(company_id) references companies(id) on delete cascade + ); + + create table if not exists conversation_events ( + id text primary key, + thread_id text not null, + actor_id text not null, + actor_type text not null, + event_type text not null, + body text not null, + metadata_json text not null default '{}', + created_at text not null, + foreign key(thread_id) references conversation_threads(id) on delete cascade + ); + + create table if not exists conversation_participants ( + thread_id text not null, + participant_id text not null, + participant_type text not null, + role text not null default 'member', + joined_at text not null, + primary key(thread_id, participant_id) + ); + + create table if not exists thread_wait_states ( + id text primary key, + thread_id text not null, + company_id text not null, + waiting_for text not null, + related_approval_id text null, + reason text not null, + created_at text not null, + resolved_at text null, + foreign key(thread_id) references conversation_threads(id) on delete cascade, + foreign key(company_id) references companies(id) on delete cascade + ); + + create table if not exists work_products ( + id text primary key, + company_id text not null, + project_id text null, + task_id text null, + type text not null, + provider text not null, + external_id text null, + title text not null, + url text null, + status text not null default 'active', + review_state text not null default 'none', + is_primary integer not null default 0, + summary text null, + metadata_json text null, + created_by_run_id text null, + created_at text not null, + updated_at text not null, + foreign key(company_id) references companies(id) on delete cascade + ); + "#, + )?; + seed_connectors(conn)?; + Ok(()) +} + +fn seed_connectors(conn: &Connection) -> Result<()> { + let updated_at = now_iso()?; + let mut statement = conn.prepare( + r#" + insert into connectors ( + id, label, description, status, command, version, auth_state, + last_checked_at, last_error, model, env_binding_text, notes, updated_at + ) + values (?1, ?2, ?3, 'not_installed', '', null, 'unknown', null, null, null, '', '', ?4) + on conflict(id) do update set + label = excluded.label, + description = excluded.description, + updated_at = excluded.updated_at + "#, + )?; + + for connector in CONNECTOR_SEEDS { + statement.execute(params![ + connector.id, + connector.label, + connector.description, + updated_at + ])?; + } + Ok(()) +} diff --git a/AgentCompany-Rust/crates/storage/src/store.rs b/AgentCompany-Rust/crates/storage/src/store.rs new file mode 100644 index 00000000..d4fa8551 --- /dev/null +++ b/AgentCompany-Rust/crates/storage/src/store.rs @@ -0,0 +1,711 @@ +use crate::schema; +use anyhow::{Context, Result, anyhow}; +use domain::{ + Activity, Agent, AgentMessage, Approval, ApprovalState, Company, Connector, Document, Goal, + ProfileSnapshot, Project, Run, Task, Workspace, +}; +use rusqlite::{Connection, OptionalExtension, params}; +use std::{ + env, + path::{Path, PathBuf}, + time::Duration, +}; +use support::{ + paths::{ensure_profile_dir, profile_db_path}, + time::now_iso, +}; +use uuid::Uuid; + +const BOARD_READER_ID: &str = "__board__"; + +#[derive(Clone, Debug, Default)] +pub struct NewCompanyInput { + pub name: String, + pub description: String, + pub workspace_path: String, + pub execution_mode: String, +} + +pub struct ProfileStore { + profile_dir: PathBuf, + db_path: PathBuf, + conn: Connection, +} + +impl ProfileStore { + pub fn open(profile_dir: impl AsRef) -> Result { + let profile_dir = profile_dir.as_ref().to_path_buf(); + ensure_profile_dir(&profile_dir)?; + let db_path = profile_db_path(&profile_dir); + let conn = Connection::open(&db_path) + .with_context(|| format!("failed to open SQLite database at {}", db_path.display()))?; + conn.busy_timeout(Duration::from_secs(5))?; + conn.execute_batch("pragma foreign_keys = on; pragma journal_mode = wal;")?; + schema::initialize(&conn)?; + Ok(Self { + profile_dir, + db_path, + conn, + }) + } + + pub fn profile_dir(&self) -> &Path { + &self.profile_dir + } + + pub fn db_path(&self) -> &Path { + &self.db_path + } + + pub fn snapshot(&self) -> Result { + let companies = self.query_companies()?; + let preferred_company_id = self.setting("current_company_id")?; + let current_company_id = preferred_company_id + .filter(|value| !value.is_empty()) + .or_else(|| companies.first().map(|company| company.id.clone())); + + let current_company_key = current_company_id.clone(); + let current_ref = current_company_key.as_deref(); + Ok(ProfileSnapshot { + current_company_id, + profile_path: self.profile_dir.display().to_string(), + theme: self + .setting("theme")? + .filter(|value| !value.is_empty()) + .unwrap_or_else(|| "system".to_string()), + locale: self + .setting("locale")? + .filter(|value| !value.is_empty()) + .unwrap_or_else(default_locale), + companies, + connectors: self.query_connectors()?, + workspaces: self.query_workspaces(current_ref)?, + agents: self.query_agents(current_ref)?, + goals: self.query_goals(current_ref)?, + projects: self.query_projects(current_ref)?, + tasks: self.query_tasks(current_ref)?, + approvals: self.query_approvals(current_ref)?, + runs: self.query_runs(current_ref)?, + activity: self.query_activity(current_ref)?, + agent_messages: self.query_messages(current_ref)?, + documents: self.query_documents(current_ref)?, + }) + } + + pub fn create_company(&mut self, input: NewCompanyInput) -> Result { + let name = input.name.trim(); + if name.len() < 2 { + return Err(anyhow!("company name must be at least 2 characters")); + } + + let company_id = Uuid::new_v4().to_string(); + let ts = now_iso()?; + self.conn.execute( + r#" + insert into companies ( + id, name, description, status, auto_approve_hires, + review_deliverables, execution_mode, created_at, updated_at + ) values (?1, ?2, ?3, 'active', 0, 0, ?4, ?5, ?5) + "#, + params![ + company_id, + name, + input.description.trim(), + normalized_execution_mode(&input.execution_mode), + ts + ], + )?; + self.set_current_company(&company_id)?; + + if !input.workspace_path.trim().is_empty() { + self.conn.execute( + r#" + insert into workspaces ( + id, company_id, name, local_path, repo_url, repo_ref, + project_id, state, is_primary, created_at, updated_at + ) values (?1, ?2, ?3, ?4, '', '', null, 'ready', 1, ?5, ?5) + "#, + params![ + Uuid::new_v4().to_string(), + company_id, + "Primary Workspace", + input.workspace_path.trim(), + ts + ], + )?; + } + + self.add_activity( + &company_id, + BOARD_READER_ID, + "created_company", + "companies", + &company_id, + name, + )?; + Ok(company_id) + } + + pub fn set_current_company(&mut self, company_id: &str) -> Result<()> { + self.conn.execute( + "insert into settings (key, value) values ('current_company_id', ?1) on conflict(key) do update set value = excluded.value", + params![company_id], + )?; + Ok(()) + } + + pub fn decide_approval( + &mut self, + company_id: &str, + approval_id: &str, + state: ApprovalState, + note: &str, + ) -> Result<()> { + let ts = now_iso()?; + let tx = self.conn.transaction()?; + let approval = tx + .query_row( + "select type, related_agent_id from approvals where id = ?1 and company_id = ?2", + params![approval_id, company_id], + |row| Ok((row.get::<_, String>(0)?, row.get::<_, Option>(1)?)), + ) + .optional()? + .ok_or_else(|| anyhow!("approval {approval_id} was not found"))?; + + tx.execute( + "update approvals set state = ?1, decision_note = ?2, updated_at = ?3 where id = ?4 and company_id = ?5", + params![state.as_str(), note.trim(), ts, approval_id, company_id], + )?; + + if approval.0 == "hire_agent" + && let Some(agent_id) = approval.1 + { + let next_status = match state { + ApprovalState::Approved => Some("idle"), + ApprovalState::Rejected => Some("terminated"), + _ => None, + }; + if let Some(status) = next_status { + tx.execute( + "update agents set status = ?1, updated_at = ?2 where id = ?3 and company_id = ?4", + params![status, ts, agent_id, company_id], + )?; + } + } + + tx.commit()?; + self.add_activity( + company_id, + BOARD_READER_ID, + format!("approval_{}", state.as_str()).as_str(), + "approvals", + approval_id, + note.trim(), + )?; + Ok(()) + } + + pub fn mark_message_read(&mut self, company_id: &str, message_id: &str) -> Result<()> { + let ts = now_iso()?; + self.conn.execute( + r#" + insert into agent_message_reads (message_id, agent_id, read_at) + select id, ?1, ?2 from agent_messages where id = ?3 and company_id = ?4 + on conflict(message_id, agent_id) do update set read_at = excluded.read_at + "#, + params![BOARD_READER_ID, ts, message_id, company_id], + )?; + Ok(()) + } + + pub fn send_board_message(&mut self, company_id: &str, body: &str) -> Result { + let body = body.trim(); + if body.is_empty() { + return Err(anyhow!("message body cannot be empty")); + } + + let message_id = Uuid::new_v4().to_string(); + let ts = now_iso()?; + self.conn.execute( + r#" + insert into agent_messages ( + id, company_id, from_agent_id, to_agent_id, sender_kind, channel, + channel_target_id, subject, body, priority, read_at, parent_message_id, + attachments_json, created_at + ) values (?1, ?2, ?3, null, 'human', 'company', null, ?4, ?5, 'normal', null, null, '[]', ?6) + "#, + params![message_id, company_id, BOARD_READER_ID, subject_for(body), body, ts], + )?; + self.add_activity( + company_id, + BOARD_READER_ID, + "sent_message", + "agent_messages", + &message_id, + body, + )?; + Ok(message_id) + } + + pub fn create_document( + &mut self, + company_id: &str, + title: &str, + content: &str, + ) -> Result { + let title = title.trim(); + if title.is_empty() { + return Err(anyhow!("document title cannot be empty")); + } + + let document_id = Uuid::new_v4().to_string(); + let ts = now_iso()?; + self.conn.execute( + r#" + insert into documents ( + id, company_id, type, title, content, author_agent_id, reviewer_agent_id, + project_id, goal_id, parent_doc_id, version, status, tags_json, + latest_revision_id, source_run_id, created_at, updated_at + ) values (?1, ?2, 'status_report', ?3, ?4, null, null, null, null, null, 1, 'draft', '[]', null, null, ?5, ?5) + "#, + params![document_id, company_id, title, content.trim(), ts], + )?; + self.add_activity( + company_id, + BOARD_READER_ID, + "created_document", + "documents", + &document_id, + title, + )?; + Ok(document_id) + } + + fn add_activity( + &self, + company_id: &str, + actor: &str, + action: &str, + entity_type: &str, + entity_id: &str, + detail: &str, + ) -> Result<()> { + self.conn.execute( + r#" + insert into activity (id, company_id, actor, action, entity_type, entity_id, detail, created_at) + values (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8) + "#, + params![ + Uuid::new_v4().to_string(), + company_id, + actor, + action, + entity_type, + entity_id, + detail, + now_iso()? + ], + )?; + Ok(()) + } + + fn setting(&self, key: &str) -> Result> { + self.conn + .query_row( + "select value from settings where key = ?1", + params![key], + |row| row.get(0), + ) + .optional() + .context("failed to read settings row") + } + + fn query_companies(&self) -> Result> { + query_many( + &self.conn, + "select id, name, description, status, auto_approve_hires, review_deliverables, execution_mode, created_at, updated_at from companies order by created_at asc", + [], + |row| { + Ok(Company { + id: row.get(0)?, + name: row.get(1)?, + description: row.get(2)?, + status: row.get(3)?, + auto_approve_hires: int_to_bool(row.get(4)?), + review_deliverables: int_to_bool(row.get(5)?), + execution_mode: row.get(6)?, + created_at: row.get(7)?, + updated_at: row.get(8)?, + }) + }, + ) + } + + fn query_connectors(&self) -> Result> { + query_many( + &self.conn, + "select id, label, description, status, version, auth_state, last_checked_at, last_error, model, env_binding_text, notes from connectors order by label asc", + [], + |row| { + Ok(Connector { + id: row.get(0)?, + label: row.get(1)?, + description: row.get(2)?, + status: row.get(3)?, + version: row.get(4)?, + auth_state: row.get(5)?, + last_checked_at: row.get(6)?, + last_error: row.get(7)?, + model: row.get(8)?, + env_binding_text: row.get(9)?, + notes: row.get(10)?, + }) + }, + ) + } + + fn query_workspaces(&self, company_id: Option<&str>) -> Result> { + match company_id { + Some(company_id) => query_many( + &self.conn, + "select id, company_id, name, local_path, repo_url, repo_ref, project_id, state, is_primary, created_at, updated_at from workspaces where company_id = ?1 order by is_primary desc, created_at asc", + [company_id], + |row| { + Ok(Workspace { + id: row.get(0)?, + company_id: row.get(1)?, + name: row.get(2)?, + local_path: row.get(3)?, + repo_url: row.get(4)?, + repo_ref: row.get(5)?, + project_id: row.get(6)?, + state: row.get(7)?, + is_primary: int_to_bool(row.get(8)?), + created_at: row.get(9)?, + updated_at: row.get(10)?, + }) + }, + ), + None => Ok(Vec::new()), + } + } + + fn query_agents(&self, company_id: Option<&str>) -> Result> { + match company_id { + Some(company_id) => query_many( + &self.conn, + "select id, company_id, name, role, title, department, status, reports_to, connector_id, workspace_id, model, capabilities, budget_monthly_usd, spent_monthly_usd, created_at, updated_at from agents where company_id = ?1 order by created_at asc", + [company_id], + |row| { + Ok(Agent { + id: row.get(0)?, + company_id: row.get(1)?, + name: row.get(2)?, + role: row.get(3)?, + title: row.get(4)?, + department: row.get(5)?, + status: row.get(6)?, + reports_to: row.get(7)?, + connector_id: row.get(8)?, + workspace_id: row.get(9)?, + model: row.get(10)?, + capabilities: row.get(11)?, + budget_monthly_usd: row.get(12)?, + spent_monthly_usd: row.get(13)?, + created_at: row.get(14)?, + updated_at: row.get(15)?, + }) + }, + ), + None => Ok(Vec::new()), + } + } + + fn query_goals(&self, company_id: Option<&str>) -> Result> { + match company_id { + Some(company_id) => query_many( + &self.conn, + "select id, company_id, title, description, parent_id, owner_agent_id, status, created_at, updated_at from goals where company_id = ?1 order by created_at desc", + [company_id], + |row| { + Ok(Goal { + id: row.get(0)?, + company_id: row.get(1)?, + title: row.get(2)?, + description: row.get(3)?, + parent_id: row.get(4)?, + owner_agent_id: row.get(5)?, + status: row.get(6)?, + created_at: row.get(7)?, + updated_at: row.get(8)?, + }) + }, + ), + None => Ok(Vec::new()), + } + } + + fn query_projects(&self, company_id: Option<&str>) -> Result> { + match company_id { + Some(company_id) => query_many( + &self.conn, + "select id, company_id, goal_id, name, description, lead_agent_id, status, target_date, created_at, updated_at from projects where company_id = ?1 order by created_at desc", + [company_id], + |row| { + Ok(Project { + id: row.get(0)?, + company_id: row.get(1)?, + goal_id: row.get(2)?, + name: row.get(3)?, + description: row.get(4)?, + lead_agent_id: row.get(5)?, + status: row.get(6)?, + target_date: row.get(7)?, + created_at: row.get(8)?, + updated_at: row.get(9)?, + }) + }, + ), + None => Ok(Vec::new()), + } + } + + fn query_tasks(&self, company_id: Option<&str>) -> Result> { + match company_id { + Some(company_id) => query_many( + &self.conn, + "select id, company_id, project_id, goal_id, parent_id, title, description, assignee_agent_id, workspace_id, status, priority, active_run_id, cost_usd, task_type, requires_user_review, started_at, completed_at, cancelled_at, created_at, updated_at from tasks where company_id = ?1 order by created_at desc", + [company_id], + |row| { + Ok(Task { + id: row.get(0)?, + company_id: row.get(1)?, + project_id: row.get(2)?, + goal_id: row.get(3)?, + parent_id: row.get(4)?, + title: row.get(5)?, + description: row.get(6)?, + assignee_agent_id: row.get(7)?, + workspace_id: row.get(8)?, + status: row.get(9)?, + priority: row.get(10)?, + active_run_id: row.get(11)?, + cost_usd: row.get(12)?, + task_type: row.get(13)?, + requires_user_review: int_to_bool(row.get(14)?), + started_at: row.get(15)?, + completed_at: row.get(16)?, + cancelled_at: row.get(17)?, + created_at: row.get(18)?, + updated_at: row.get(19)?, + }) + }, + ), + None => Ok(Vec::new()), + } + } + + fn query_approvals(&self, company_id: Option<&str>) -> Result> { + match company_id { + Some(company_id) => query_many( + &self.conn, + "select id, company_id, related_task_id, related_agent_id, requested_by_agent_id, type, payload_summary, impact_summary, payload_json, decision_note, state, created_at, updated_at from approvals where company_id = ?1 order by created_at desc", + [company_id], + |row| { + Ok(Approval { + id: row.get(0)?, + company_id: row.get(1)?, + related_task_id: row.get(2)?, + related_agent_id: row.get(3)?, + requested_by_agent_id: row.get(4)?, + approval_type: row.get(5)?, + payload_summary: row.get(6)?, + impact_summary: row.get(7)?, + payload_json: row.get(8)?, + decision_note: row.get(9)?, + state: row.get(10)?, + created_at: row.get(11)?, + updated_at: row.get(12)?, + }) + }, + ), + None => Ok(Vec::new()), + } + } + + fn query_runs(&self, company_id: Option<&str>) -> Result> { + match company_id { + Some(company_id) => query_many( + &self.conn, + "select id, company_id, task_id, agent_id, workspace_id, connector_id, status, summary, error_message, model, cost_usd, started_at, finished_at, created_at, updated_at from runs where company_id = ?1 order by created_at desc limit 50", + [company_id], + |row| { + Ok(Run { + id: row.get(0)?, + company_id: row.get(1)?, + task_id: row.get(2)?, + agent_id: row.get(3)?, + workspace_id: row.get(4)?, + connector_id: row.get(5)?, + status: row.get(6)?, + summary: row.get(7)?, + error_message: row.get(8)?, + model: row.get(9)?, + cost_usd: row.get(10)?, + started_at: row.get(11)?, + finished_at: row.get(12)?, + created_at: row.get(13)?, + updated_at: row.get(14)?, + }) + }, + ), + None => Ok(Vec::new()), + } + } + + fn query_activity(&self, company_id: Option<&str>) -> Result> { + match company_id { + Some(company_id) => query_many( + &self.conn, + "select id, company_id, actor, action, entity_type, entity_id, detail, created_at from activity where company_id = ?1 order by created_at desc limit 50", + [company_id], + |row| { + Ok(Activity { + id: row.get(0)?, + company_id: row.get(1)?, + actor: row.get(2)?, + action: row.get(3)?, + entity_type: row.get(4)?, + entity_id: row.get(5)?, + detail: row.get(6)?, + created_at: row.get(7)?, + }) + }, + ), + None => Ok(Vec::new()), + } + } + + fn query_messages(&self, company_id: Option<&str>) -> Result> { + match company_id { + Some(company_id) => query_many( + &self.conn, + r#" + select + m.id, + m.company_id, + m.from_agent_id, + m.to_agent_id, + m.sender_kind, + m.channel, + m.channel_target_id, + m.subject, + m.body, + m.priority, + coalesce(r.read_at, m.read_at) as effective_read_at, + m.parent_message_id, + m.attachments_json, + m.created_at + from agent_messages m + left join agent_message_reads r + on r.message_id = m.id and r.agent_id = ?1 + where m.company_id = ?2 + order by m.created_at desc + limit 200 + "#, + [BOARD_READER_ID, company_id], + |row| { + Ok(AgentMessage { + id: row.get(0)?, + company_id: row.get(1)?, + from_agent_id: row.get(2)?, + to_agent_id: row.get(3)?, + sender_kind: row.get(4)?, + channel: row.get(5)?, + channel_target_id: row.get(6)?, + subject: row.get(7)?, + body: row.get(8)?, + priority: row.get(9)?, + read_at: row.get(10)?, + parent_message_id: row.get(11)?, + attachments_json: row.get(12)?, + created_at: row.get(13)?, + }) + }, + ), + None => Ok(Vec::new()), + } + } + + fn query_documents(&self, company_id: Option<&str>) -> Result> { + match company_id { + Some(company_id) => query_many( + &self.conn, + "select id, company_id, type, title, content, author_agent_id, reviewer_agent_id, project_id, goal_id, parent_doc_id, version, status, tags_json, latest_revision_id, created_at, updated_at from documents where company_id = ?1 order by updated_at desc", + [company_id], + |row| { + Ok(Document { + id: row.get(0)?, + company_id: row.get(1)?, + document_type: row.get(2)?, + title: row.get(3)?, + content: row.get(4)?, + author_agent_id: row.get(5)?, + reviewer_agent_id: row.get(6)?, + project_id: row.get(7)?, + goal_id: row.get(8)?, + parent_doc_id: row.get(9)?, + version: row.get(10)?, + status: row.get(11)?, + tags_json: row.get(12)?, + latest_revision_id: row.get(13)?, + created_at: row.get(14)?, + updated_at: row.get(15)?, + }) + }, + ), + None => Ok(Vec::new()), + } + } +} + +fn query_many(conn: &Connection, sql: &str, params: P, mut mapper: F) -> Result> +where + P: rusqlite::Params, + F: FnMut(&rusqlite::Row<'_>) -> rusqlite::Result, +{ + let mut statement = conn.prepare(sql)?; + let rows = statement.query_map(params, |row| mapper(row))?; + let mut values = Vec::new(); + for row in rows { + values.push(row?); + } + Ok(values) +} + +fn int_to_bool(value: i64) -> bool { + value != 0 +} + +fn subject_for(body: &str) -> String { + let line = body.lines().next().unwrap_or(body).trim(); + let mut subject = line.chars().take(72).collect::(); + if subject.is_empty() { + subject = "Board update".to_string(); + } + subject +} + +fn normalized_execution_mode(value: &str) -> &str { + match value { + "ai_cofounder" => "ai_cofounder", + _ => "ai_ceo", + } +} + +fn default_locale() -> String { + match env::var("LANG") { + Ok(lang) if lang.to_ascii_lowercase().contains("zh") => "zh".to_string(), + _ => "en".to_string(), + } +} diff --git a/AgentCompany-Rust/crates/storage/tests/profile_store_e2e.rs b/AgentCompany-Rust/crates/storage/tests/profile_store_e2e.rs new file mode 100644 index 00000000..a38242e6 --- /dev/null +++ b/AgentCompany-Rust/crates/storage/tests/profile_store_e2e.rs @@ -0,0 +1,61 @@ +use domain::ApprovalState; +use storage::{NewCompanyInput, ProfileStore}; +use tempfile::tempdir; + +#[test] +fn profile_store_bootstraps_and_round_trips_core_flows() { + let sandbox = tempdir().expect("temp dir"); + let mut store = ProfileStore::open(sandbox.path()).expect("open store"); + + let company_id = store + .create_company(NewCompanyInput { + name: "Orbit Lab".to_string(), + description: "Semantic communication thesis program".to_string(), + workspace_path: "/tmp/orbit-lab".to_string(), + execution_mode: "ai_ceo".to_string(), + }) + .expect("create company"); + + let snapshot = store.snapshot().expect("snapshot"); + assert_eq!(snapshot.companies.len(), 1); + assert_eq!(snapshot.workspaces.len(), 1); + assert_eq!( + snapshot.current_company_id.as_deref(), + Some(company_id.as_str()) + ); + assert_eq!(snapshot.connectors.len(), 26); + + let approval_id = uuid::Uuid::new_v4().to_string(); + let ts = support::time::now_iso().expect("timestamp"); + let conn = rusqlite::Connection::open(store.db_path()).expect("open raw db"); + conn.execute( + "insert into approvals (id, company_id, related_task_id, requested_by_agent_id, related_agent_id, type, payload_summary, impact_summary, payload_json, decision_note, state, created_at, updated_at) values (?1, ?2, null, null, null, 'strategy_review', 'Review launch plan', 'Affects milestone timing', null, '', 'pending', ?3, ?3)", + rusqlite::params![approval_id, company_id, ts], + ) + .expect("insert approval"); + + store + .decide_approval( + &company_id, + &approval_id, + ApprovalState::Approved, + "Ship the native shell.", + ) + .expect("decide approval"); + store + .send_board_message(&company_id, "Board update: thesis plan is in review.") + .expect("send message"); + store + .create_document( + &company_id, + "Weekly status", + "Native Rust shell connected to the real profile.", + ) + .expect("create document"); + + let after = store.snapshot().expect("snapshot after writes"); + assert_eq!(after.pending_approvals(), 0); + assert_eq!(after.agent_messages.len(), 1); + assert_eq!(after.documents.len(), 1); + assert!(!after.activity.is_empty()); +} diff --git a/AgentCompany-Rust/crates/support/Cargo.toml b/AgentCompany-Rust/crates/support/Cargo.toml new file mode 100644 index 00000000..3aad4190 --- /dev/null +++ b/AgentCompany-Rust/crates/support/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "support" +edition.workspace = true +license.workspace = true +publish.workspace = true +version.workspace = true + +[dependencies] +anyhow.workspace = true +dirs.workspace = true +time.workspace = true diff --git a/AgentCompany-Rust/crates/support/src/lib.rs b/AgentCompany-Rust/crates/support/src/lib.rs new file mode 100644 index 00000000..e17c85a5 --- /dev/null +++ b/AgentCompany-Rust/crates/support/src/lib.rs @@ -0,0 +1,2 @@ +pub mod paths; +pub mod time; diff --git a/AgentCompany-Rust/crates/support/src/paths.rs b/AgentCompany-Rust/crates/support/src/paths.rs new file mode 100644 index 00000000..80f15a13 --- /dev/null +++ b/AgentCompany-Rust/crates/support/src/paths.rs @@ -0,0 +1,30 @@ +use anyhow::{Result, anyhow}; +use std::{ + env, fs, + path::{Path, PathBuf}, +}; + +pub const APP_NAME: &str = "AgentCompany"; +pub const PROFILE_ENV: &str = "AGENTCOMPANY_PROFILE_DIR"; + +pub fn default_profile_dir() -> Result { + dirs::data_dir() + .map(|path| path.join(APP_NAME).join("profile")) + .ok_or_else(|| anyhow!("OS data directory is unavailable")) +} + +pub fn resolve_profile_dir() -> Result { + match env::var(PROFILE_ENV) { + Ok(value) if !value.trim().is_empty() => Ok(PathBuf::from(value)), + _ => default_profile_dir(), + } +} + +pub fn profile_db_path(profile_dir: &Path) -> PathBuf { + profile_dir.join("profile.sqlite") +} + +pub fn ensure_profile_dir(profile_dir: &Path) -> Result<()> { + fs::create_dir_all(profile_dir)?; + Ok(()) +} diff --git a/AgentCompany-Rust/crates/support/src/time.rs b/AgentCompany-Rust/crates/support/src/time.rs new file mode 100644 index 00000000..946af240 --- /dev/null +++ b/AgentCompany-Rust/crates/support/src/time.rs @@ -0,0 +1,8 @@ +use anyhow::{Context, Result}; +use time::{OffsetDateTime, format_description::well_known::Rfc3339}; + +pub fn now_iso() -> Result { + OffsetDateTime::now_utc() + .format(&Rfc3339) + .context("failed to format UTC timestamp") +} diff --git a/AgentCompany-Rust/rust-toolchain.toml b/AgentCompany-Rust/rust-toolchain.toml new file mode 100644 index 00000000..292fe499 --- /dev/null +++ b/AgentCompany-Rust/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "stable"