rtrt-agent 0.1.7 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +203 -15
- package/README.md +211 -15
- package/THIRD_PARTY_NOTICES/INDEX.md +120 -18
- package/THIRD_PARTY_NOTICES/INVENTORY.json +8151 -0
- package/THIRD_PARTY_NOTICES/SUPPLEMENTS.json +148 -0
- package/THIRD_PARTY_NOTICES/adler2@2.0.1/LICENSE-0BSD +12 -0
- package/THIRD_PARTY_NOTICES/adler2@2.0.1/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/adler2@2.0.1/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/ahash@0.8.12/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/ahash@0.8.12/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/aho-corasick@1.1.4/COPYING +3 -0
- package/THIRD_PARTY_NOTICES/aho-corasick@1.1.4/LICENSE-MIT +21 -0
- package/THIRD_PARTY_NOTICES/allocator-api2@0.2.21/LICENSE-APACHE +176 -0
- package/THIRD_PARTY_NOTICES/allocator-api2@0.2.21/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/anstream@1.0.0/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/anstream@1.0.0/LICENSE-MIT +19 -0
- package/THIRD_PARTY_NOTICES/anstyle-parse@1.0.0/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/anstyle-parse@1.0.0/LICENSE-MIT +19 -0
- package/THIRD_PARTY_NOTICES/anstyle-query@1.1.5/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/anstyle-query@1.1.5/LICENSE-MIT +19 -0
- package/THIRD_PARTY_NOTICES/anstyle-wincon@3.0.11/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/anstyle-wincon@3.0.11/LICENSE-MIT +19 -0
- package/THIRD_PARTY_NOTICES/anstyle@1.0.14/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/anstyle@1.0.14/LICENSE-MIT +19 -0
- package/THIRD_PARTY_NOTICES/anyhow@1.0.103/LICENSE-APACHE +176 -0
- package/THIRD_PARTY_NOTICES/anyhow@1.0.103/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/async-compression@0.4.42/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/async-compression@0.4.42/LICENSE-MIT +21 -0
- package/THIRD_PARTY_NOTICES/async-trait@0.1.92/LICENSE-APACHE +176 -0
- package/THIRD_PARTY_NOTICES/async-trait@0.1.92/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/atomic-waker@1.1.2/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/atomic-waker@1.1.2/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/atomic-waker@1.1.2/LICENSE-THIRD-PARTY +45 -0
- package/THIRD_PARTY_NOTICES/autocfg@1.5.0/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/autocfg@1.5.0/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/axum-core@0.5.6/LICENSE +27 -0
- package/THIRD_PARTY_NOTICES/axum-macros@0.5.1/LICENSE +7 -0
- package/THIRD_PARTY_NOTICES/axum@0.8.9/LICENSE +25 -0
- package/THIRD_PARTY_NOTICES/base64@0.22.1/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/base64@0.22.1/LICENSE-MIT +21 -0
- package/THIRD_PARTY_NOTICES/bitflags@2.11.1/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/bitflags@2.11.1/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/block-buffer@0.10.4/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/block-buffer@0.10.4/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/bytes@1.11.1/LICENSE +25 -0
- package/THIRD_PARTY_NOTICES/cc@1.2.62/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/cc@1.2.62/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/cfg-if@1.0.4/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/cfg-if@1.0.4/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/chacha20@0.10.2/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/chacha20@0.10.2/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/chrono@0.4.44/LICENSE.txt +240 -0
- package/THIRD_PARTY_NOTICES/clap@4.6.1/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/clap@4.6.1/LICENSE-MIT +19 -0
- package/THIRD_PARTY_NOTICES/clap_builder@4.6.0/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/clap_builder@4.6.0/LICENSE-MIT +19 -0
- package/THIRD_PARTY_NOTICES/clap_derive@4.6.1/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/clap_derive@4.6.1/LICENSE-MIT +19 -0
- package/THIRD_PARTY_NOTICES/clap_lex@1.1.0/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/clap_lex@1.1.0/LICENSE-MIT +19 -0
- package/THIRD_PARTY_NOTICES/colorchoice@1.0.5/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/colorchoice@1.0.5/LICENSE-MIT +19 -0
- package/THIRD_PARTY_NOTICES/compression-codecs@0.4.38/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/compression-codecs@0.4.38/LICENSE-MIT +21 -0
- package/THIRD_PARTY_NOTICES/compression-core@0.4.32/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/compression-core@0.4.32/LICENSE-MIT +21 -0
- package/THIRD_PARTY_NOTICES/cpufeatures@0.2.17/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/cpufeatures@0.2.17/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/cpufeatures@0.3.0/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/cpufeatures@0.3.0/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/crc32fast@1.5.0/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/crc32fast@1.5.0/LICENSE-MIT +21 -0
- package/THIRD_PARTY_NOTICES/crossbeam-deque@0.8.6/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/crossbeam-deque@0.8.6/LICENSE-MIT +27 -0
- package/THIRD_PARTY_NOTICES/crossbeam-epoch@0.9.20/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/crossbeam-epoch@0.9.20/LICENSE-MIT +27 -0
- package/THIRD_PARTY_NOTICES/crossbeam-utils@0.8.21/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/crossbeam-utils@0.8.21/LICENSE-MIT +27 -0
- package/THIRD_PARTY_NOTICES/crypto-common@0.1.7/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/crypto-common@0.1.7/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/darling@0.20.11/LICENSE +21 -0
- package/THIRD_PARTY_NOTICES/darling@0.23.0/LICENSE +21 -0
- package/THIRD_PARTY_NOTICES/darling_core@0.20.11/LICENSE +21 -0
- package/THIRD_PARTY_NOTICES/darling_core@0.23.0/LICENSE +21 -0
- package/THIRD_PARTY_NOTICES/darling_macro@0.20.11/LICENSE +21 -0
- package/THIRD_PARTY_NOTICES/darling_macro@0.23.0/LICENSE +21 -0
- package/THIRD_PARTY_NOTICES/derive_builder@0.20.2/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/derive_builder@0.20.2/LICENSE-MIT +21 -0
- package/THIRD_PARTY_NOTICES/derive_builder_core@0.20.2/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/derive_builder_core@0.20.2/LICENSE-MIT +21 -0
- package/THIRD_PARTY_NOTICES/derive_builder_macro@0.20.2/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/derive_builder_macro@0.20.2/LICENSE-MIT +21 -0
- package/THIRD_PARTY_NOTICES/digest@0.10.7/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/digest@0.10.7/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/dirs-sys@0.4.1/LICENSE-APACHE +174 -0
- package/THIRD_PARTY_NOTICES/dirs-sys@0.4.1/LICENSE-MIT +19 -0
- package/THIRD_PARTY_NOTICES/dirs@5.0.1/LICENSE-APACHE +174 -0
- package/THIRD_PARTY_NOTICES/dirs@5.0.1/LICENSE-MIT +19 -0
- package/THIRD_PARTY_NOTICES/displaydoc@0.2.5/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/displaydoc@0.2.5/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/dyn-clone@1.0.20/LICENSE-APACHE +176 -0
- package/THIRD_PARTY_NOTICES/dyn-clone@1.0.20/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/either@1.16.0/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/either@1.16.0/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/equivalent@1.0.2/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/equivalent@1.0.2/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/errno@0.3.14/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/errno@0.3.14/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/eventsource-stream@0.2.3/Cargo.toml +74 -0
- package/THIRD_PARTY_NOTICES/eventsource-stream@0.2.3/DECLARED-APACHE-2.0.txt +202 -0
- package/THIRD_PARTY_NOTICES/fallible-iterator@0.3.0/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/fallible-iterator@0.3.0/LICENSE-MIT +19 -0
- package/THIRD_PARTY_NOTICES/fallible-streaming-iterator@0.1.9/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/fallible-streaming-iterator@0.1.9/LICENSE-MIT +19 -0
- package/THIRD_PARTY_NOTICES/fastrand@2.4.1/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/fastrand@2.4.1/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/find-msvc-tools@0.1.9/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/find-msvc-tools@0.1.9/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/flate2@1.1.9/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/flate2@1.1.9/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/fnv@1.0.7/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/fnv@1.0.7/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/form_urlencoded@1.2.2/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/form_urlencoded@1.2.2/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/fs2@0.4.3/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/fs2@0.4.3/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/futures-channel@0.3.32/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/futures-channel@0.3.32/LICENSE-MIT +26 -0
- package/THIRD_PARTY_NOTICES/futures-core@0.3.32/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/futures-core@0.3.32/LICENSE-MIT +26 -0
- package/THIRD_PARTY_NOTICES/futures-executor@0.3.32/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/futures-executor@0.3.32/LICENSE-MIT +26 -0
- package/THIRD_PARTY_NOTICES/futures-io@0.3.32/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/futures-io@0.3.32/LICENSE-MIT +26 -0
- package/THIRD_PARTY_NOTICES/futures-macro@0.3.32/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/futures-macro@0.3.32/LICENSE-MIT +26 -0
- package/THIRD_PARTY_NOTICES/futures-sink@0.3.32/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/futures-sink@0.3.32/LICENSE-MIT +26 -0
- package/THIRD_PARTY_NOTICES/futures-task@0.3.32/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/futures-task@0.3.32/LICENSE-MIT +26 -0
- package/THIRD_PARTY_NOTICES/futures-util@0.3.32/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/futures-util@0.3.32/LICENSE-MIT +26 -0
- package/THIRD_PARTY_NOTICES/futures@0.3.32/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/futures@0.3.32/LICENSE-MIT +26 -0
- package/THIRD_PARTY_NOTICES/generic-array@0.14.7/LICENSE +21 -0
- package/THIRD_PARTY_NOTICES/getrandom@0.2.17/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/getrandom@0.2.17/LICENSE-MIT +26 -0
- package/THIRD_PARTY_NOTICES/getrandom@0.3.4/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/getrandom@0.3.4/LICENSE-MIT +26 -0
- package/THIRD_PARTY_NOTICES/getrandom@0.4.2/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/getrandom@0.4.2/LICENSE-MIT +26 -0
- package/THIRD_PARTY_NOTICES/handlebars@6.4.1/LICENSE +22 -0
- package/THIRD_PARTY_NOTICES/handlebars@6.4.1/wasm/LICENSE +22 -0
- package/THIRD_PARTY_NOTICES/hashbrown@0.14.5/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/hashbrown@0.14.5/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/hashbrown@0.17.1/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/hashbrown@0.17.1/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/hashlink@0.9.1/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/hashlink@0.9.1/LICENSE-MIT +26 -0
- package/THIRD_PARTY_NOTICES/heck@0.5.0/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/heck@0.5.0/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/hmac@0.12.1/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/hmac@0.12.1/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/http-body-util@0.1.3/LICENSE +25 -0
- package/THIRD_PARTY_NOTICES/http-body@1.0.1/LICENSE +25 -0
- package/THIRD_PARTY_NOTICES/http-range-header@0.4.2/LICENSE +21 -0
- package/THIRD_PARTY_NOTICES/http@1.4.0/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/http@1.4.0/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/httparse@1.10.1/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/httparse@1.10.1/LICENSE-MIT +20 -0
- package/THIRD_PARTY_NOTICES/httpdate@1.0.3/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/httpdate@1.0.3/LICENSE-MIT +19 -0
- package/THIRD_PARTY_NOTICES/hyper-rustls@0.27.9/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/hyper-rustls@0.27.9/LICENSE-ISC +15 -0
- package/THIRD_PARTY_NOTICES/hyper-rustls@0.27.9/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/hyper-util@0.1.20/LICENSE +19 -0
- package/THIRD_PARTY_NOTICES/hyper@1.9.0/LICENSE +19 -0
- package/THIRD_PARTY_NOTICES/icu_collections@2.1.1/LICENSE +46 -0
- package/THIRD_PARTY_NOTICES/icu_locale_core@2.1.1/LICENSE +46 -0
- package/THIRD_PARTY_NOTICES/icu_normalizer@2.1.1/LICENSE +46 -0
- package/THIRD_PARTY_NOTICES/icu_normalizer_data@2.1.1/LICENSE +46 -0
- package/THIRD_PARTY_NOTICES/icu_properties@2.1.2/LICENSE +46 -0
- package/THIRD_PARTY_NOTICES/icu_properties_data@2.1.2/LICENSE +46 -0
- package/THIRD_PARTY_NOTICES/icu_provider@2.1.1/LICENSE +46 -0
- package/THIRD_PARTY_NOTICES/ident_case@1.0.1/LICENSE +19 -0
- package/THIRD_PARTY_NOTICES/idna@1.1.0/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/idna@1.1.0/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/idna_adapter@1.2.1/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/idna_adapter@1.2.1/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/indexmap@2.14.0/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/indexmap@2.14.0/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/instant-distance@0.6.1/Cargo.toml +65 -0
- package/THIRD_PARTY_NOTICES/instant-distance@0.6.1/LICENSE +201 -0
- package/THIRD_PARTY_NOTICES/ipnet@2.12.0/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/ipnet@2.12.0/LICENSE-MIT +7 -0
- package/THIRD_PARTY_NOTICES/is_terminal_polyfill@1.70.2/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/is_terminal_polyfill@1.70.2/LICENSE-MIT +19 -0
- package/THIRD_PARTY_NOTICES/itoa@1.0.18/LICENSE-APACHE +176 -0
- package/THIRD_PARTY_NOTICES/itoa@1.0.18/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/layout-base@2.0.1/JamaJS-APACHE.txt +210 -0
- package/THIRD_PARTY_NOTICES/lazy_static@1.5.0/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/lazy_static@1.5.0/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/libc@0.2.186/LICENSE-APACHE +176 -0
- package/THIRD_PARTY_NOTICES/libc@0.2.186/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/libsqlite3-sys@0.30.1/LICENSE +19 -0
- package/THIRD_PARTY_NOTICES/libsqlite3-sys@0.30.1/sqlcipher/LICENSE +24 -0
- package/THIRD_PARTY_NOTICES/linux-raw-sys@0.12.1/COPYRIGHT +29 -0
- package/THIRD_PARTY_NOTICES/linux-raw-sys@0.12.1/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/linux-raw-sys@0.12.1/LICENSE-Apache-2.0_WITH_LLVM-exception +220 -0
- package/THIRD_PARTY_NOTICES/linux-raw-sys@0.12.1/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/litemap@0.8.2/LICENSE +46 -0
- package/THIRD_PARTY_NOTICES/lock_api@0.4.14/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/lock_api@0.4.14/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/log@0.4.29/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/log@0.4.29/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/matchers@0.2.0/LICENSE +19 -0
- package/THIRD_PARTY_NOTICES/matchit@0.8.4/LICENSE +21 -0
- package/THIRD_PARTY_NOTICES/matchit@0.8.4/LICENSE.httprouter +29 -0
- package/THIRD_PARTY_NOTICES/memchr@2.8.0/COPYING +3 -0
- package/THIRD_PARTY_NOTICES/memchr@2.8.0/LICENSE-MIT +21 -0
- package/THIRD_PARTY_NOTICES/mime@0.3.17/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/mime@0.3.17/LICENSE-MIT +20 -0
- package/THIRD_PARTY_NOTICES/mime_guess@2.0.5/LICENSE +22 -0
- package/THIRD_PARTY_NOTICES/minimal-lexical@0.2.1/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/minimal-lexical@0.2.1/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/minimal-lexical@0.2.1/LICENSE.md +37 -0
- package/THIRD_PARTY_NOTICES/miniz_oxide@0.8.9/LICENSE +25 -0
- package/THIRD_PARTY_NOTICES/miniz_oxide@0.8.9/LICENSE-APACHE.md +177 -0
- package/THIRD_PARTY_NOTICES/miniz_oxide@0.8.9/LICENSE-MIT.md +24 -0
- package/THIRD_PARTY_NOTICES/miniz_oxide@0.8.9/LICENSE-ZLIB.md +14 -0
- package/THIRD_PARTY_NOTICES/mio@1.2.0/LICENSE +19 -0
- package/THIRD_PARTY_NOTICES/nom@7.1.3/LICENSE +20 -0
- package/THIRD_PARTY_NOTICES/nu-ansi-term@0.50.3/LICENSE +22 -0
- package/THIRD_PARTY_NOTICES/num-modular@0.6.1/LICENSE +201 -0
- package/THIRD_PARTY_NOTICES/num-order@1.2.0/LICENSE +201 -0
- package/THIRD_PARTY_NOTICES/num-traits@0.2.19/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/num-traits@0.2.19/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/num_cpus@1.17.0/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/num_cpus@1.17.0/LICENSE-MIT +20 -0
- package/THIRD_PARTY_NOTICES/once_cell@1.21.4/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/once_cell@1.21.4/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/once_cell_polyfill@1.70.2/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/once_cell_polyfill@1.70.2/LICENSE-MIT +19 -0
- package/THIRD_PARTY_NOTICES/option-ext@0.2.0/SOURCE.crate +0 -0
- package/THIRD_PARTY_NOTICES/ordered-float@3.9.2/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/parking_lot@0.12.5/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/parking_lot@0.12.5/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/parking_lot_core@0.9.12/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/parking_lot_core@0.9.12/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/pastey@0.2.3/LICENSE-APACHE +176 -0
- package/THIRD_PARTY_NOTICES/pastey@0.2.3/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/percent-encoding@2.3.2/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/percent-encoding@2.3.2/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/pest@2.8.6/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/pest@2.8.6/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/pest_derive@2.8.6/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/pest_derive@2.8.6/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/pest_generator@2.8.6/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/pest_generator@2.8.6/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/pest_meta@2.8.6/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/pest_meta@2.8.6/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/pin-project-lite@0.2.17/LICENSE-APACHE +177 -0
- package/THIRD_PARTY_NOTICES/pin-project-lite@0.2.17/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/pkg-config@0.3.33/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/pkg-config@0.3.33/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/potential_utf@0.1.5/LICENSE +46 -0
- package/THIRD_PARTY_NOTICES/ppv-lite86@0.2.21/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/ppv-lite86@0.2.21/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/proc-macro2@1.0.106/LICENSE-APACHE +176 -0
- package/THIRD_PARTY_NOTICES/proc-macro2@1.0.106/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/quote@1.0.45/LICENSE-APACHE +176 -0
- package/THIRD_PARTY_NOTICES/quote@1.0.45/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/rand@0.10.1/COPYRIGHT +12 -0
- package/THIRD_PARTY_NOTICES/rand@0.10.1/LICENSE-APACHE +176 -0
- package/THIRD_PARTY_NOTICES/rand@0.10.1/LICENSE-MIT +26 -0
- package/THIRD_PARTY_NOTICES/rand@0.8.6/COPYRIGHT +12 -0
- package/THIRD_PARTY_NOTICES/rand@0.8.6/LICENSE-APACHE +176 -0
- package/THIRD_PARTY_NOTICES/rand@0.8.6/LICENSE-MIT +26 -0
- package/THIRD_PARTY_NOTICES/rand_chacha@0.3.1/COPYRIGHT +12 -0
- package/THIRD_PARTY_NOTICES/rand_chacha@0.3.1/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/rand_chacha@0.3.1/LICENSE-MIT +26 -0
- package/THIRD_PARTY_NOTICES/rand_core@0.10.1/COPYRIGHT +9 -0
- package/THIRD_PARTY_NOTICES/rand_core@0.10.1/LICENSE-APACHE +187 -0
- package/THIRD_PARTY_NOTICES/rand_core@0.10.1/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/rand_core@0.6.4/COPYRIGHT +12 -0
- package/THIRD_PARTY_NOTICES/rand_core@0.6.4/LICENSE-APACHE +187 -0
- package/THIRD_PARTY_NOTICES/rand_core@0.6.4/LICENSE-MIT +26 -0
- package/THIRD_PARTY_NOTICES/rayon-core@1.13.0/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/rayon-core@1.13.0/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/rayon@1.12.0/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/rayon@1.12.0/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/ref-cast-impl@1.0.25/LICENSE-APACHE +176 -0
- package/THIRD_PARTY_NOTICES/ref-cast-impl@1.0.25/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/ref-cast@1.0.25/LICENSE-APACHE +176 -0
- package/THIRD_PARTY_NOTICES/ref-cast@1.0.25/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/regex-automata@0.4.14/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/regex-automata@0.4.14/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/regex-syntax@0.8.10/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/regex-syntax@0.8.10/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/regex-syntax@0.8.10/src/unicode_tables/LICENSE-UNICODE +57 -0
- package/THIRD_PARTY_NOTICES/regex@1.12.3/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/regex@1.12.3/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/reqwest@0.12.28/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/reqwest@0.12.28/LICENSE-MIT +20 -0
- package/THIRD_PARTY_NOTICES/rmcp-macros@1.7.0/Cargo.toml +54 -0
- package/THIRD_PARTY_NOTICES/rmcp-macros@1.7.0/LICENSE +216 -0
- package/THIRD_PARTY_NOTICES/rmcp@1.7.0/Cargo.toml +683 -0
- package/THIRD_PARTY_NOTICES/rmcp@1.7.0/LICENSE +216 -0
- package/THIRD_PARTY_NOTICES/rusqlite@0.32.1/LICENSE +19 -0
- package/THIRD_PARTY_NOTICES/rustix@1.1.4/COPYRIGHT +29 -0
- package/THIRD_PARTY_NOTICES/rustix@1.1.4/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/rustix@1.1.4/LICENSE-Apache-2.0_WITH_LLVM-exception +220 -0
- package/THIRD_PARTY_NOTICES/rustix@1.1.4/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/rustls-pki-types@1.14.1/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/rustls-pki-types@1.14.1/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/rustls-webpki@0.103.15/LICENSE +19 -0
- package/THIRD_PARTY_NOTICES/rustls@0.23.45/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/rustls@0.23.45/LICENSE-ISC +15 -0
- package/THIRD_PARTY_NOTICES/rustls@0.23.45/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/ryu@1.0.23/LICENSE-APACHE +176 -0
- package/THIRD_PARTY_NOTICES/ryu@1.0.23/LICENSE-BOOST +23 -0
- package/THIRD_PARTY_NOTICES/same-file@1.0.6/COPYING +3 -0
- package/THIRD_PARTY_NOTICES/same-file@1.0.6/LICENSE-MIT +21 -0
- package/THIRD_PARTY_NOTICES/schemars@0.8.22/LICENSE +21 -0
- package/THIRD_PARTY_NOTICES/schemars@1.2.1/LICENSE +21 -0
- package/THIRD_PARTY_NOTICES/schemars_derive@0.8.22/LICENSE +21 -0
- package/THIRD_PARTY_NOTICES/schemars_derive@1.2.1/LICENSE +21 -0
- package/THIRD_PARTY_NOTICES/scopeguard@1.2.0/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/scopeguard@1.2.0/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/serde@1.0.228/LICENSE-APACHE +176 -0
- package/THIRD_PARTY_NOTICES/serde@1.0.228/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/serde_core@1.0.228/LICENSE-APACHE +176 -0
- package/THIRD_PARTY_NOTICES/serde_core@1.0.228/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/serde_derive@1.0.228/LICENSE-APACHE +176 -0
- package/THIRD_PARTY_NOTICES/serde_derive@1.0.228/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/serde_derive_internals@0.29.1/LICENSE-APACHE +176 -0
- package/THIRD_PARTY_NOTICES/serde_derive_internals@0.29.1/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/serde_json@1.0.149/LICENSE-APACHE +176 -0
- package/THIRD_PARTY_NOTICES/serde_json@1.0.149/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/serde_path_to_error@0.1.20/LICENSE-APACHE +176 -0
- package/THIRD_PARTY_NOTICES/serde_path_to_error@0.1.20/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/serde_spanned@0.6.9/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/serde_spanned@0.6.9/LICENSE-MIT +19 -0
- package/THIRD_PARTY_NOTICES/serde_urlencoded@0.7.1/LICENSE-APACHE +176 -0
- package/THIRD_PARTY_NOTICES/serde_urlencoded@0.7.1/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/sha2@0.10.9/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/sha2@0.10.9/LICENSE-MIT +27 -0
- package/THIRD_PARTY_NOTICES/sharded-slab@0.1.7/LICENSE +19 -0
- package/THIRD_PARTY_NOTICES/shlex@1.3.0/LICENSE-APACHE +13 -0
- package/THIRD_PARTY_NOTICES/shlex@1.3.0/LICENSE-MIT +21 -0
- package/THIRD_PARTY_NOTICES/signal-hook-registry@1.4.8/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/signal-hook-registry@1.4.8/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/simd-adler32@0.3.9/LICENSE.md +21 -0
- package/THIRD_PARTY_NOTICES/slab@0.4.12/LICENSE +25 -0
- package/THIRD_PARTY_NOTICES/smallvec@1.15.1/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/smallvec@1.15.1/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/socket2@0.6.3/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/socket2@0.6.3/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/sse-stream@0.2.3/Cargo.toml +124 -0
- package/THIRD_PARTY_NOTICES/sse-stream@0.2.3/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/sse-stream@0.2.3/LICENSE-MIT +21 -0
- package/THIRD_PARTY_NOTICES/stable_deref_trait@1.2.1/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/stable_deref_trait@1.2.1/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/streaming-iterator@0.1.9/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/streaming-iterator@0.1.9/LICENSE-MIT +19 -0
- package/THIRD_PARTY_NOTICES/strsim@0.11.1/LICENSE +23 -0
- package/THIRD_PARTY_NOTICES/syn@2.0.117/LICENSE-APACHE +176 -0
- package/THIRD_PARTY_NOTICES/syn@2.0.117/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/syn@3.0.6/LICENSE-APACHE +176 -0
- package/THIRD_PARTY_NOTICES/syn@3.0.6/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/sync_wrapper@1.0.2/LICENSE +177 -0
- package/THIRD_PARTY_NOTICES/synstructure@0.13.2/LICENSE +7 -0
- package/THIRD_PARTY_NOTICES/tempfile@3.27.0/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/tempfile@3.27.0/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/thiserror-impl@2.0.18/LICENSE-APACHE +176 -0
- package/THIRD_PARTY_NOTICES/thiserror-impl@2.0.18/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/thiserror@2.0.18/LICENSE-APACHE +176 -0
- package/THIRD_PARTY_NOTICES/thiserror@2.0.18/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/thread_local@1.1.9/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/thread_local@1.1.9/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/tinystr@0.8.3/LICENSE +46 -0
- package/THIRD_PARTY_NOTICES/tokio-macros@2.7.0/LICENSE +22 -0
- package/THIRD_PARTY_NOTICES/tokio-rustls@0.26.4/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/tokio-rustls@0.26.4/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/tokio-stream@0.1.18/LICENSE +21 -0
- package/THIRD_PARTY_NOTICES/tokio-util@0.7.18/LICENSE +21 -0
- package/THIRD_PARTY_NOTICES/tokio@1.52.3/LICENSE +21 -0
- package/THIRD_PARTY_NOTICES/toml@0.8.23/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/toml@0.8.23/LICENSE-MIT +19 -0
- package/THIRD_PARTY_NOTICES/toml_datetime@0.6.11/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/toml_datetime@0.6.11/LICENSE-MIT +19 -0
- package/THIRD_PARTY_NOTICES/toml_edit@0.22.27/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/toml_edit@0.22.27/LICENSE-MIT +19 -0
- package/THIRD_PARTY_NOTICES/toml_write@0.1.2/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/toml_write@0.1.2/LICENSE-MIT +19 -0
- package/THIRD_PARTY_NOTICES/tower-http@0.6.11/LICENSE +25 -0
- package/THIRD_PARTY_NOTICES/tower-layer@0.3.3/LICENSE +25 -0
- package/THIRD_PARTY_NOTICES/tower-service@0.3.3/LICENSE +25 -0
- package/THIRD_PARTY_NOTICES/tower@0.5.3/LICENSE +25 -0
- package/THIRD_PARTY_NOTICES/tracing-attributes@0.1.31/LICENSE +25 -0
- package/THIRD_PARTY_NOTICES/tracing-core@0.1.36/LICENSE +25 -0
- package/THIRD_PARTY_NOTICES/tracing-core@0.1.36/src/spin/LICENSE +21 -0
- package/THIRD_PARTY_NOTICES/tracing-log@0.2.0/LICENSE +25 -0
- package/THIRD_PARTY_NOTICES/tracing-subscriber@0.3.23/LICENSE +25 -0
- package/THIRD_PARTY_NOTICES/tracing@0.1.44/LICENSE +25 -0
- package/THIRD_PARTY_NOTICES/tree-sitter-language@0.1.7/LICENSE +21 -0
- package/THIRD_PARTY_NOTICES/tree-sitter-python@0.23.6/Cargo.toml +60 -0
- package/THIRD_PARTY_NOTICES/tree-sitter-python@0.23.6/LICENSE +21 -0
- package/THIRD_PARTY_NOTICES/tree-sitter-rust@0.24.2/LICENSE +21 -0
- package/THIRD_PARTY_NOTICES/tree-sitter-typescript@0.23.2/Cargo.toml +62 -0
- package/THIRD_PARTY_NOTICES/tree-sitter-typescript@0.23.2/LICENSE +21 -0
- package/THIRD_PARTY_NOTICES/tree-sitter@0.26.9/LICENSE +21 -0
- package/THIRD_PARTY_NOTICES/tree-sitter@0.26.9/src/unicode/LICENSE +414 -0
- package/THIRD_PARTY_NOTICES/try-lock@0.2.5/LICENSE +21 -0
- package/THIRD_PARTY_NOTICES/typenum@1.20.0/LICENSE +1 -0
- package/THIRD_PARTY_NOTICES/typenum@1.20.0/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/typenum@1.20.0/LICENSE-MIT +21 -0
- package/THIRD_PARTY_NOTICES/ucd-trie@0.1.7/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/ucd-trie@0.1.7/LICENSE-MIT +21 -0
- package/THIRD_PARTY_NOTICES/unicase@2.9.0/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/unicase@2.9.0/LICENSE-MIT +20 -0
- package/THIRD_PARTY_NOTICES/unicode-ident@1.0.24/LICENSE-APACHE +176 -0
- package/THIRD_PARTY_NOTICES/unicode-ident@1.0.24/LICENSE-MIT +23 -0
- package/THIRD_PARTY_NOTICES/unicode-ident@1.0.24/LICENSE-UNICODE +39 -0
- package/THIRD_PARTY_NOTICES/untrusted@0.9.0/LICENSE.txt +13 -0
- package/THIRD_PARTY_NOTICES/ureq@2.12.1/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/ureq@2.12.1/LICENSE-MIT +21 -0
- package/THIRD_PARTY_NOTICES/ureq@2.12.1/src/chunked/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/ureq@2.12.1/src/chunked/LICENSE-MIT +22 -0
- package/THIRD_PARTY_NOTICES/url@2.5.8/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/url@2.5.8/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/utf8_iter@1.0.4/COPYRIGHT +42 -0
- package/THIRD_PARTY_NOTICES/utf8_iter@1.0.4/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/utf8_iter@1.0.4/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/utf8parse@0.2.2/LICENSE-APACHE +176 -0
- package/THIRD_PARTY_NOTICES/utf8parse@0.2.2/LICENSE-MIT +25 -0
- package/THIRD_PARTY_NOTICES/uuid@1.23.1/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/uuid@1.23.1/LICENSE-MIT +26 -0
- package/THIRD_PARTY_NOTICES/vcpkg@0.2.15/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/vcpkg@0.2.15/LICENSE-MIT +26 -0
- package/THIRD_PARTY_NOTICES/version_check@0.9.5/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/version_check@0.9.5/LICENSE-MIT +19 -0
- package/THIRD_PARTY_NOTICES/walkdir@2.5.0/COPYING +3 -0
- package/THIRD_PARTY_NOTICES/walkdir@2.5.0/LICENSE-MIT +21 -0
- package/THIRD_PARTY_NOTICES/want@0.3.1/LICENSE +20 -0
- package/THIRD_PARTY_NOTICES/whatlang@0.16.4/Cargo.toml +76 -0
- package/THIRD_PARTY_NOTICES/whatlang@0.16.4/LICENSE +26 -0
- package/THIRD_PARTY_NOTICES/winapi-util@0.1.11/COPYING +3 -0
- package/THIRD_PARTY_NOTICES/winapi-util@0.1.11/LICENSE-MIT +21 -0
- package/THIRD_PARTY_NOTICES/winapi@0.3.9/LICENSE-APACHE +201 -0
- package/THIRD_PARTY_NOTICES/winapi@0.3.9/LICENSE-MIT +19 -0
- package/THIRD_PARTY_NOTICES/windows-link@0.2.1/license-apache-2.0 +201 -0
- package/THIRD_PARTY_NOTICES/windows-link@0.2.1/license-mit +21 -0
- package/THIRD_PARTY_NOTICES/windows-sys@0.48.0/license-apache-2.0 +201 -0
- package/THIRD_PARTY_NOTICES/windows-sys@0.48.0/license-mit +21 -0
- package/THIRD_PARTY_NOTICES/windows-sys@0.61.2/license-apache-2.0 +201 -0
- package/THIRD_PARTY_NOTICES/windows-sys@0.61.2/license-mit +21 -0
- package/THIRD_PARTY_NOTICES/windows-targets@0.48.5/license-apache-2.0 +201 -0
- package/THIRD_PARTY_NOTICES/windows-targets@0.48.5/license-mit +21 -0
- package/THIRD_PARTY_NOTICES/windows_x86_64_msvc@0.48.5/license-apache-2.0 +201 -0
- package/THIRD_PARTY_NOTICES/windows_x86_64_msvc@0.48.5/license-mit +21 -0
- package/THIRD_PARTY_NOTICES/winnow@0.7.15/LICENSE-MIT +18 -0
- package/THIRD_PARTY_NOTICES/writeable@0.6.3/LICENSE +46 -0
- package/THIRD_PARTY_NOTICES/yoke-derive@0.8.2/LICENSE +46 -0
- package/THIRD_PARTY_NOTICES/yoke@0.8.2/LICENSE +46 -0
- package/THIRD_PARTY_NOTICES/zerocopy@0.8.48/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/zerocopy@0.8.48/LICENSE-BSD +24 -0
- package/THIRD_PARTY_NOTICES/zerocopy@0.8.48/LICENSE-MIT +26 -0
- package/THIRD_PARTY_NOTICES/zerofrom-derive@0.1.7/LICENSE +46 -0
- package/THIRD_PARTY_NOTICES/zerofrom@0.1.8/LICENSE +46 -0
- package/THIRD_PARTY_NOTICES/zeroize@1.8.2/LICENSE-APACHE +202 -0
- package/THIRD_PARTY_NOTICES/zeroize@1.8.2/LICENSE-MIT +21 -0
- package/THIRD_PARTY_NOTICES/zerotrie@0.2.4/LICENSE +46 -0
- package/THIRD_PARTY_NOTICES/zerovec-derive@0.11.3/LICENSE +46 -0
- package/THIRD_PARTY_NOTICES/zerovec@0.11.6/LICENSE +46 -0
- package/THIRD_PARTY_NOTICES/zmij@1.0.21/LICENSE-MIT +23 -0
- package/package.json +45 -28
- package/runtime/dashboard-acl.js +22 -0
- package/runtime/dashboard-acl.ps1 +103 -0
- package/runtime/dashboard-binary.js +5 -0
- package/runtime/dashboard-bootstrap.js +45 -0
- package/runtime/dashboard-files.js +20 -3
- package/runtime/dashboard-process.js +6 -5
- package/runtime/dashboard-supervisor.js +3 -1
- package/server.js +98 -0
- package/tui/index.js +1 -0
- package/tui/rtrt-statusline-core.d.mts +205 -0
- package/tui/rtrt-statusline-core.mjs +1145 -0
- package/tui/v2/native-runtime.mjs +81 -0
- package/tui/v2/native-state.mjs +66 -0
- package/tui/v2/rtrt-statusline.tsx +116 -0
- package/v2/permissions.js +119 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
$ErrorActionPreference = 'Stop'
|
|
2
|
+
$target = $env:RTRT_ACL_PATH
|
|
3
|
+
$action = $env:RTRT_ACL_ACTION
|
|
4
|
+
if (-not [IO.Path]::IsPathRooted($target) -or $target.Contains([char]0)) { throw 'Invalid ACL path' }
|
|
5
|
+
$self = [Security.Principal.WindowsIdentity]::GetCurrent().User
|
|
6
|
+
$system = New-Object Security.Principal.SecurityIdentifier 'S-1-5-18'
|
|
7
|
+
$admins = New-Object Security.Principal.SecurityIdentifier 'S-1-5-32-544'
|
|
8
|
+
$creatorOwner = New-Object Security.Principal.SecurityIdentifier 'S-1-3-0'
|
|
9
|
+
|
|
10
|
+
function Assert-Item([string] $name) {
|
|
11
|
+
$item = Get-Item -LiteralPath $name -Force
|
|
12
|
+
if (($item.Attributes -band [IO.FileAttributes]::ReparsePoint) -ne 0) { throw 'Reparse point refused' }
|
|
13
|
+
return $item
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function Assert-Private([string] $name) {
|
|
17
|
+
$item = Assert-Item $name
|
|
18
|
+
$acl = Get-Acl -LiteralPath $name
|
|
19
|
+
if ($acl.GetOwner([Security.Principal.SecurityIdentifier]).Value -ne $self.Value -or
|
|
20
|
+
-not $acl.AreAccessRulesProtected) { throw 'Private owner or inheritance mismatch' }
|
|
21
|
+
$rules = @($acl.GetAccessRules($true, $true, [Security.Principal.SecurityIdentifier]))
|
|
22
|
+
if ($rules.Count -ne 1) { throw 'Private ACE count mismatch' }
|
|
23
|
+
$rule = $rules[0]
|
|
24
|
+
if ($rule.IsInherited -or $rule.IdentityReference.Value -ne $self.Value -or
|
|
25
|
+
$rule.AccessControlType -ne [Security.AccessControl.AccessControlType]::Allow -or
|
|
26
|
+
[int]$rule.FileSystemRights -ne [int][Security.AccessControl.FileSystemRights]::FullControl) {
|
|
27
|
+
throw 'Private ACE mismatch'
|
|
28
|
+
}
|
|
29
|
+
if ($item.PSIsContainer) {
|
|
30
|
+
if ($rule.InheritanceFlags -ne ([Security.AccessControl.InheritanceFlags]::ContainerInherit -bor
|
|
31
|
+
[Security.AccessControl.InheritanceFlags]::ObjectInherit) -or
|
|
32
|
+
$rule.PropagationFlags -ne [Security.AccessControl.PropagationFlags]::None) { throw 'Private directory ACE mismatch' }
|
|
33
|
+
} elseif ($rule.InheritanceFlags -ne [Security.AccessControl.InheritanceFlags]::None) {
|
|
34
|
+
throw 'Private file ACE mismatch'
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if ($action -eq 'private-create') {
|
|
39
|
+
$item = Assert-Item $target
|
|
40
|
+
if ($item.PSIsContainer) {
|
|
41
|
+
$acl = New-Object Security.AccessControl.DirectorySecurity
|
|
42
|
+
$flags = 'ContainerInherit,ObjectInherit'
|
|
43
|
+
$rule = New-Object Security.AccessControl.FileSystemAccessRule -ArgumentList @($self, 'FullControl', $flags, 'None', 'Allow')
|
|
44
|
+
} else {
|
|
45
|
+
$acl = New-Object Security.AccessControl.FileSecurity
|
|
46
|
+
$rule = New-Object Security.AccessControl.FileSystemAccessRule -ArgumentList @($self, 'FullControl', 'Allow')
|
|
47
|
+
}
|
|
48
|
+
$acl.SetOwner($self)
|
|
49
|
+
$acl.SetAccessRuleProtection($true, $false)
|
|
50
|
+
$acl.AddAccessRule($rule)
|
|
51
|
+
Set-Acl -LiteralPath $target -AclObject $acl
|
|
52
|
+
Assert-Private $target
|
|
53
|
+
} elseif ($action -eq 'private-check') {
|
|
54
|
+
Assert-Private $target
|
|
55
|
+
} elseif ($action -eq 'binary-check') {
|
|
56
|
+
$current = $target
|
|
57
|
+
$trustedInstaller = New-Object Security.Principal.SecurityIdentifier 'S-1-5-80-956008885-3418522649-1831038044-1853292631-2271478464'
|
|
58
|
+
$trustedBinarySids = @($self.Value, $system.Value, $admins.Value, $trustedInstaller.Value)
|
|
59
|
+
$writes = [int]([Security.AccessControl.FileSystemRights]::WriteData -bor
|
|
60
|
+
[Security.AccessControl.FileSystemRights]::AppendData -bor
|
|
61
|
+
[Security.AccessControl.FileSystemRights]::WriteExtendedAttributes -bor
|
|
62
|
+
[Security.AccessControl.FileSystemRights]::WriteAttributes -bor
|
|
63
|
+
[Security.AccessControl.FileSystemRights]::Delete -bor
|
|
64
|
+
[Security.AccessControl.FileSystemRights]::DeleteSubdirectoriesAndFiles -bor
|
|
65
|
+
[Security.AccessControl.FileSystemRights]::ChangePermissions -bor
|
|
66
|
+
[Security.AccessControl.FileSystemRights]::TakeOwnership)
|
|
67
|
+
$replaceChildren = [int]([Security.AccessControl.FileSystemRights]::Delete -bor
|
|
68
|
+
[Security.AccessControl.FileSystemRights]::DeleteSubdirectoriesAndFiles -bor
|
|
69
|
+
[Security.AccessControl.FileSystemRights]::ChangePermissions -bor
|
|
70
|
+
[Security.AccessControl.FileSystemRights]::TakeOwnership)
|
|
71
|
+
while ($current) {
|
|
72
|
+
$item = Assert-Item $current
|
|
73
|
+
$acl = Get-Acl -LiteralPath $current
|
|
74
|
+
$owner = $acl.GetOwner([Security.Principal.SecurityIdentifier]).Value
|
|
75
|
+
if ($trustedBinarySids -cnotcontains $owner) { throw 'Untrusted binary owner' }
|
|
76
|
+
$effectiveWrites = $writes
|
|
77
|
+
if ($item.PSIsContainer) {
|
|
78
|
+
# Creation and directory-metadata rights alone cannot replace protected checked
|
|
79
|
+
# children; deletion or ACL/ownership control can.
|
|
80
|
+
$effectiveWrites = $replaceChildren
|
|
81
|
+
}
|
|
82
|
+
foreach ($rule in $acl.GetAccessRules($true, $true, [Security.Principal.SecurityIdentifier])) {
|
|
83
|
+
$sid = $rule.IdentityReference.Value
|
|
84
|
+
$rights = [int]$rule.FileSystemRights
|
|
85
|
+
# Expand generic masks before comparing filesystem rights. GenericWrite creates
|
|
86
|
+
# directory entries but does not itself grant delete-child or ownership control.
|
|
87
|
+
if (($rights -band 0x10000000) -ne 0) {
|
|
88
|
+
$rights = $rights -bor [int][Security.AccessControl.FileSystemRights]::FullControl
|
|
89
|
+
}
|
|
90
|
+
if (($rights -band 0x40000000) -ne 0) {
|
|
91
|
+
$rights = $rights -bor [int][Security.AccessControl.FileSystemRights]::Write
|
|
92
|
+
}
|
|
93
|
+
if ($rule.AccessControlType -eq [Security.AccessControl.AccessControlType]::Allow -and
|
|
94
|
+
$trustedBinarySids -cnotcontains $sid -and
|
|
95
|
+
$sid -ne $creatorOwner.Value -and
|
|
96
|
+
(([int]$rule.PropagationFlags -band [int][Security.AccessControl.PropagationFlags]::InheritOnly) -eq 0) -and
|
|
97
|
+
($rights -band $effectiveWrites) -ne 0) { throw 'Untrusted binary writer' }
|
|
98
|
+
}
|
|
99
|
+
$parent = [IO.Path]::GetDirectoryName($current.TrimEnd([IO.Path]::DirectorySeparatorChar))
|
|
100
|
+
if (-not $parent -or $parent -eq $current) { break }
|
|
101
|
+
$current = $parent
|
|
102
|
+
}
|
|
103
|
+
} else { throw 'Invalid ACL operation' }
|
|
@@ -2,6 +2,7 @@ import { lstat, readFile } from "node:fs/promises"
|
|
|
2
2
|
import path from "node:path"
|
|
3
3
|
import { fileURLToPath } from "node:url"
|
|
4
4
|
import { readRegular, realPath, unavailable } from "./dashboard-files.js"
|
|
5
|
+
import { windowsAcl } from "./dashboard-acl.js"
|
|
5
6
|
|
|
6
7
|
const PACKAGES = new Map([
|
|
7
8
|
["linux-x64", "rtrt-dashboard-linux-x64"],
|
|
@@ -52,11 +53,15 @@ export async function resolveDashboardBinary({
|
|
|
52
53
|
if (parent === ancestor) break
|
|
53
54
|
ancestor = parent
|
|
54
55
|
}
|
|
56
|
+
if (platform === "win32") await windowsAcl(path.join(directory, "package.json"), "binary-check")
|
|
55
57
|
const manifest = JSON.parse(await readRegular(path.join(directory, "package.json"), validate))
|
|
56
58
|
if (manifest.name !== name || manifest.version !== expected) continue
|
|
57
59
|
const binary = path.join(directory, "bin", platform === "win32" ? "rtrt-dashboard.exe" : "rtrt-dashboard")
|
|
58
60
|
await realPath(binary)
|
|
59
61
|
validate(await lstat(path.dirname(binary)))
|
|
62
|
+
if (platform === "win32") {
|
|
63
|
+
await windowsAcl(binary, "binary-check")
|
|
64
|
+
}
|
|
60
65
|
const stat = await lstat(binary)
|
|
61
66
|
validate(stat)
|
|
62
67
|
if (!stat.isFile() || stat.nlink !== 1 || (platform !== "win32" && (stat.mode & 0o111) === 0)) throw unavailable()
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto"
|
|
2
|
+
import { constants } from "node:fs"
|
|
3
|
+
import { lstat, open, rename, unlink } from "node:fs/promises"
|
|
4
|
+
import path from "node:path"
|
|
5
|
+
import { privateMetadata, realPath, unavailable } from "./dashboard-files.js"
|
|
6
|
+
import { windowsAcl } from "./dashboard-acl.js"
|
|
7
|
+
|
|
8
|
+
export async function writeDashboardBootstrap(state, credential, { platform = process.platform, uid = process.geteuid?.() } = {}) {
|
|
9
|
+
if (!/^[A-Za-z0-9_-]{87}$/.test(credential)) throw unavailable()
|
|
10
|
+
await realPath(state)
|
|
11
|
+
const stateMetadata = await lstat(state)
|
|
12
|
+
privateMetadata(stateMetadata, { platform, uid }, 0o700)
|
|
13
|
+
if (!stateMetadata.isDirectory()) throw unavailable()
|
|
14
|
+
if (platform === "win32") await windowsAcl(state, "private-check")
|
|
15
|
+
const destination = path.join(state, "bootstrap.html")
|
|
16
|
+
try {
|
|
17
|
+
const existing = await lstat(destination)
|
|
18
|
+
privateMetadata(existing, { platform, uid }, 0o600)
|
|
19
|
+
if (!existing.isFile() || existing.nlink !== 1 || existing.size > 512) throw unavailable()
|
|
20
|
+
if (platform === "win32") await windowsAcl(destination, "private-check")
|
|
21
|
+
} catch (error) {
|
|
22
|
+
if (error.code !== "ENOENT") throw error
|
|
23
|
+
}
|
|
24
|
+
const temporary = path.join(state, `.bootstrap-${randomBytes(16).toString("hex")}.tmp`)
|
|
25
|
+
const handle = await open(temporary, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | (constants.O_NOFOLLOW ?? 0), 0o600)
|
|
26
|
+
try {
|
|
27
|
+
if (platform === "win32") await windowsAcl(temporary, "private-create")
|
|
28
|
+
privateMetadata(await handle.stat(), { platform, uid }, 0o600)
|
|
29
|
+
const body = `<!doctype html><meta http-equiv="refresh" content="0;url=http://127.0.0.1:7311/#bootstrap=${credential}">`
|
|
30
|
+
await handle.writeFile(body)
|
|
31
|
+
await handle.sync()
|
|
32
|
+
} catch (error) {
|
|
33
|
+
await handle.close()
|
|
34
|
+
await unlink(temporary)
|
|
35
|
+
throw error
|
|
36
|
+
}
|
|
37
|
+
await handle.close()
|
|
38
|
+
try {
|
|
39
|
+
await rename(temporary, destination)
|
|
40
|
+
} catch (error) {
|
|
41
|
+
await unlink(temporary)
|
|
42
|
+
throw error
|
|
43
|
+
}
|
|
44
|
+
return destination
|
|
45
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { constants } from "node:fs"
|
|
2
2
|
import { lstat, mkdir, open, rmdir } from "node:fs/promises"
|
|
3
3
|
import path from "node:path"
|
|
4
|
+
import { windowsAcl } from "./dashboard-acl.js"
|
|
4
5
|
|
|
5
6
|
export const unavailable = () => new Error("Dashboard unavailable.")
|
|
6
7
|
|
|
@@ -11,7 +12,8 @@ export async function realPath(candidate) {
|
|
|
11
12
|
let current = path.parse(normalized).root
|
|
12
13
|
for (const part of parts) {
|
|
13
14
|
current = path.join(current, part)
|
|
14
|
-
|
|
15
|
+
const stat = await lstat(current)
|
|
16
|
+
if (stat.isSymbolicLink()) throw unavailable()
|
|
15
17
|
}
|
|
16
18
|
return normalized
|
|
17
19
|
}
|
|
@@ -48,6 +50,7 @@ export function dashboardFiles({ home, uid, platform }) {
|
|
|
48
50
|
const stat = await lstat(candidate)
|
|
49
51
|
privateMetadata(stat, identity, 0o700)
|
|
50
52
|
if (!stat.isDirectory()) throw unavailable()
|
|
53
|
+
if (platform === "win32") await windowsAcl(candidate, "private-check")
|
|
51
54
|
}
|
|
52
55
|
const checkLock = async () => {
|
|
53
56
|
try { await directory(lock) } catch (error) {
|
|
@@ -59,7 +62,10 @@ export function dashboardFiles({ home, uid, platform }) {
|
|
|
59
62
|
const stat = await lstat(home)
|
|
60
63
|
if (!stat.isDirectory() || (platform !== "win32" && (stat.uid !== uid || (stat.mode & 0o022) !== 0))) throw unavailable()
|
|
61
64
|
for (const candidate of [path.dirname(state), state]) {
|
|
62
|
-
try {
|
|
65
|
+
try {
|
|
66
|
+
await mkdir(candidate, { mode: 0o700 })
|
|
67
|
+
if (platform === "win32") await windowsAcl(candidate, "private-create")
|
|
68
|
+
} catch (error) {
|
|
63
69
|
if (error.code !== "EEXIST") throw error
|
|
64
70
|
}
|
|
65
71
|
await directory(candidate)
|
|
@@ -69,6 +75,13 @@ export function dashboardFiles({ home, uid, platform }) {
|
|
|
69
75
|
const readToken = async () => {
|
|
70
76
|
await realPath(state)
|
|
71
77
|
let raw
|
|
78
|
+
if (platform === "win32") {
|
|
79
|
+
try { await lstat(credential) } catch (error) {
|
|
80
|
+
if (error.code === "ENOENT") return undefined
|
|
81
|
+
throw error
|
|
82
|
+
}
|
|
83
|
+
await windowsAcl(credential, "private-check")
|
|
84
|
+
}
|
|
72
85
|
try { raw = await readRegular(credential, (stat) => privateMetadata(stat, identity, 0o600)) } catch (error) {
|
|
73
86
|
if (error.code === "ENOENT") return undefined
|
|
74
87
|
throw error
|
|
@@ -83,6 +96,7 @@ export function dashboardFiles({ home, uid, platform }) {
|
|
|
83
96
|
if (!/^[a-fA-F0-9]{64}$/.test(token)) throw unavailable()
|
|
84
97
|
const handle = await open(credential, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | (constants.O_NOFOLLOW ?? 0), 0o600)
|
|
85
98
|
try {
|
|
99
|
+
if (platform === "win32") await windowsAcl(credential, "private-create")
|
|
86
100
|
privateMetadata(await handle.stat(), identity, 0o600)
|
|
87
101
|
await handle.writeFile(`RTRT_DASHBOARD_TOKEN=${token}\n`)
|
|
88
102
|
await handle.sync()
|
|
@@ -91,7 +105,10 @@ export function dashboardFiles({ home, uid, platform }) {
|
|
|
91
105
|
}
|
|
92
106
|
}
|
|
93
107
|
const acquire = async () => {
|
|
94
|
-
try {
|
|
108
|
+
try {
|
|
109
|
+
await mkdir(lock, { mode: 0o700 })
|
|
110
|
+
if (platform === "win32") await windowsAcl(lock, "private-create")
|
|
111
|
+
} catch (error) {
|
|
95
112
|
if (error.code !== "EEXIST") throw error
|
|
96
113
|
await directory(lock)
|
|
97
114
|
return undefined
|
|
@@ -48,12 +48,13 @@ export function launchDetached(binary, args, { spawnProcess = spawn, ...options
|
|
|
48
48
|
})
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
export async function openDashboardBrowser(
|
|
52
|
-
// Never consult BROWSER or PATH.
|
|
51
|
+
export async function openDashboardBrowser(file, { platform = process.platform, launch = launchDetached } = {}) {
|
|
52
|
+
// Never consult BROWSER or PATH. Ordinary opener argv carries only a local file path.
|
|
53
|
+
if (!path.isAbsolute(file) || /:\/\/|#|bootstrap=/i.test(file)) throw unavailable()
|
|
53
54
|
switch (platform) {
|
|
54
|
-
case "linux": return launch("/usr/bin/xdg-open", [
|
|
55
|
-
case "darwin": return launch("/usr/bin/open", [
|
|
56
|
-
case "win32": return launch("C:\\Windows
|
|
55
|
+
case "linux": return launch("/usr/bin/xdg-open", [file])
|
|
56
|
+
case "darwin": return launch("/usr/bin/open", [file])
|
|
57
|
+
case "win32": return launch(path.win32.join(process.env.SystemRoot || "C:\\Windows", "System32", "rundll32.exe"), ["url.dll,FileProtocolHandler", file])
|
|
57
58
|
default: throw unavailable()
|
|
58
59
|
}
|
|
59
60
|
}
|
|
@@ -4,6 +4,7 @@ import { setTimeout as delay } from "node:timers/promises"
|
|
|
4
4
|
import { dashboardFiles, unavailable } from "./dashboard-files.js"
|
|
5
5
|
import { resolveDashboardBinary } from "./dashboard-binary.js"
|
|
6
6
|
import { launchDetached, openDashboardBrowser, probeDashboard } from "./dashboard-process.js"
|
|
7
|
+
import { writeDashboardBootstrap } from "./dashboard-bootstrap.js"
|
|
7
8
|
|
|
8
9
|
export function createDashboardSupervisor({
|
|
9
10
|
env = process.env, platform = process.platform, arch = process.arch, uid = process.geteuid?.(),
|
|
@@ -85,7 +86,8 @@ export function createDashboardSupervisor({
|
|
|
85
86
|
createHmac("sha256", Buffer.from(token, "hex"))
|
|
86
87
|
.update("rtrt-dashboard-browser-bootstrap\0v1\0")
|
|
87
88
|
.update(wire.subarray(0, 33)).digest().copy(wire, 33)
|
|
88
|
-
await
|
|
89
|
+
const bootstrap = await writeDashboardBootstrap(files.state, wire.toString("base64url"), { platform, uid })
|
|
90
|
+
await openBrowser(bootstrap, { platform })
|
|
89
91
|
return "Dashboard open requested."
|
|
90
92
|
} catch {
|
|
91
93
|
// Never expose dependency errors: process errors can contain the bootstrap URL.
|
package/server.js
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto"
|
|
2
|
+
import path from "node:path"
|
|
3
|
+
|
|
4
|
+
import { createDashboardSupervisor } from "./runtime/dashboard-supervisor.js"
|
|
5
|
+
import { createPermissionEvaluator } from "./v2/permissions.js"
|
|
6
|
+
|
|
7
|
+
const RTRT_TOOLS = new Set(["rtrt_agent_call", "rtrt_agent_route"])
|
|
8
|
+
const DASHBOARD_INPUT = { type: "object", properties: {}, additionalProperties: false }
|
|
9
|
+
|
|
10
|
+
function scheduleStartup(start) {
|
|
11
|
+
const timer = setTimeout(() => { void start() }, 0)
|
|
12
|
+
timer.unref?.()
|
|
13
|
+
return { cancel: () => clearTimeout(timer) }
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// The native server contract is @opencode/plugin 2.0.20. The v1 root remains
|
|
17
|
+
// separate: v2 has no permission.create or shell call identity, so it cannot
|
|
18
|
+
// provide the legacy Claude permission broker or per-call shell provenance.
|
|
19
|
+
export function createNativeServer({ supervisor, schedule = scheduleStartup, managedAgentStatePath, report = (message) => process.emitWarning(message, "RTRT_NATIVE_PLUGIN") } = {}) {
|
|
20
|
+
return {
|
|
21
|
+
id: "rtrt-agent",
|
|
22
|
+
async setup(ctx) {
|
|
23
|
+
const dashboard = supervisor ?? createDashboardSupervisor()
|
|
24
|
+
const invocations = new Map()
|
|
25
|
+
const registrations = []
|
|
26
|
+
let disposed = false
|
|
27
|
+
let cleanupPromise
|
|
28
|
+
const notify = (message) => {
|
|
29
|
+
try { report(message) } catch {
|
|
30
|
+
process.emitWarning("RTRT native diagnostic unavailable.", "RTRT_NATIVE_PLUGIN")
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const startup = schedule(() => Promise.resolve()
|
|
34
|
+
.then(() => { if (!disposed) return dashboard.ensure() })
|
|
35
|
+
.catch(() => { if (!disposed) notify("RTRT dashboard unavailable.") }))
|
|
36
|
+
const dispose = () => {
|
|
37
|
+
if (cleanupPromise) return cleanupPromise
|
|
38
|
+
disposed = true
|
|
39
|
+
invocations.clear()
|
|
40
|
+
cleanupPromise = (async () => {
|
|
41
|
+
const failures = []
|
|
42
|
+
try { startup.cancel() } catch { failures.push(new Error("RTRT startup cancellation failed.")) }
|
|
43
|
+
const outcomes = await Promise.allSettled(registrations.reverse().map((registration) =>
|
|
44
|
+
Promise.resolve().then(() => registration.dispose())))
|
|
45
|
+
for (const [index, outcome] of outcomes.entries()) {
|
|
46
|
+
if (outcome.status === "rejected") failures.push(new Error(`RTRT registration ${index} disposal failed.`))
|
|
47
|
+
}
|
|
48
|
+
if (failures.length) throw new AggregateError(failures, "RTRT native cleanup failed.")
|
|
49
|
+
})()
|
|
50
|
+
return cleanupPromise
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
registrations.push(await ctx.tool.hook("execute.before", (event) => {
|
|
54
|
+
if (disposed || !RTRT_TOOLS.has(event.tool) || !event.input || typeof event.input !== "object" || Array.isArray(event.input)) return
|
|
55
|
+
const key = `${event.sessionID}\0${event.id}`
|
|
56
|
+
let invocationID = invocations.get(key)
|
|
57
|
+
if (!invocationID) {
|
|
58
|
+
invocationID = randomUUID()
|
|
59
|
+
invocations.set(key, invocationID)
|
|
60
|
+
}
|
|
61
|
+
Object.assign(event.input, {
|
|
62
|
+
invocation_id: invocationID,
|
|
63
|
+
parent_project: path.basename(ctx.location.project.canonical),
|
|
64
|
+
parent_session_id: event.sessionID,
|
|
65
|
+
parent_call_id: event.id,
|
|
66
|
+
caller_agent: event.agent,
|
|
67
|
+
parent_cwd: ctx.location.directory,
|
|
68
|
+
parent_worktree: ctx.location.project.canonical,
|
|
69
|
+
})
|
|
70
|
+
}))
|
|
71
|
+
registrations.push(await ctx.tool.hook("execute.after", (event) => {
|
|
72
|
+
if (!disposed && RTRT_TOOLS.has(event.tool)) invocations.delete(`${event.sessionID}\0${event.id}`)
|
|
73
|
+
}))
|
|
74
|
+
registrations.push(await ctx.tool.transform((editor) => {
|
|
75
|
+
if (disposed) return
|
|
76
|
+
editor.add({
|
|
77
|
+
name: "rtrt_dashboard_open",
|
|
78
|
+
description: "Open the RTRT dashboard in the operator's browser when explicitly requested.",
|
|
79
|
+
input: DASHBOARD_INPUT,
|
|
80
|
+
async execute() {
|
|
81
|
+
if (disposed) return { content: "Dashboard unavailable." }
|
|
82
|
+
const status = await dashboard.open().catch(() => "Dashboard unavailable.")
|
|
83
|
+
return { content: status === "Dashboard open requested." ? status : "Dashboard unavailable." }
|
|
84
|
+
},
|
|
85
|
+
})
|
|
86
|
+
}))
|
|
87
|
+
const evaluate = await createPermissionEvaluator(ctx, managedAgentStatePath, () => !disposed)
|
|
88
|
+
registrations.push(await ctx.permission.hook("evaluate", evaluate))
|
|
89
|
+
return dispose
|
|
90
|
+
} catch (error) {
|
|
91
|
+
try { await dispose() } catch { notify("RTRT native cleanup failed.") }
|
|
92
|
+
throw error
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export default createNativeServer()
|
package/tui/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from "./v2/rtrt-statusline.tsx"
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
export type StatuslineTone =
|
|
2
|
+
| "accent"
|
|
3
|
+
| "good"
|
|
4
|
+
| "warn"
|
|
5
|
+
| "bad"
|
|
6
|
+
| "muted"
|
|
7
|
+
|
|
8
|
+
export type StatuslineSegment = {
|
|
9
|
+
id: string
|
|
10
|
+
text: string
|
|
11
|
+
compact: string | null
|
|
12
|
+
tone: StatuslineTone
|
|
13
|
+
priority: number
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export type StatuslinePayload = {
|
|
17
|
+
version: 1
|
|
18
|
+
stale: boolean
|
|
19
|
+
degraded: string[]
|
|
20
|
+
segments: StatuslineSegment[]
|
|
21
|
+
}
|
|
22
|
+
export type StatuslineViewRole = "badge" | "label" | "value" | "separator"
|
|
23
|
+
export type StatuslineViewPart = {
|
|
24
|
+
id: string
|
|
25
|
+
text: string
|
|
26
|
+
role: StatuslineViewRole
|
|
27
|
+
tone: StatuslineTone
|
|
28
|
+
}
|
|
29
|
+
export type StatuslineViewRow = { id: string; parts: StatuslineViewPart[] }
|
|
30
|
+
export type StatuslineViewModel = {
|
|
31
|
+
layout: "wide" | "medium" | "narrow"
|
|
32
|
+
width: number
|
|
33
|
+
rows: StatuslineViewRow[]
|
|
34
|
+
}
|
|
35
|
+
export type StatuslineEconomicsValue = {
|
|
36
|
+
text: string
|
|
37
|
+
tone: StatuslineTone
|
|
38
|
+
used?: number
|
|
39
|
+
limit?: number
|
|
40
|
+
percent?: number
|
|
41
|
+
headroom?: number
|
|
42
|
+
}
|
|
43
|
+
export type StatuslineEconomics = {
|
|
44
|
+
cost: StatuslineEconomicsValue
|
|
45
|
+
context: StatuslineEconomicsValue
|
|
46
|
+
model: StatuslineEconomicsValue
|
|
47
|
+
status: StatuslineEconomicsValue
|
|
48
|
+
week: StatuslineEconomicsValue
|
|
49
|
+
modelRef?: string
|
|
50
|
+
}
|
|
51
|
+
export type StatuslineViewOptions = {
|
|
52
|
+
width?: number
|
|
53
|
+
economics?: StatuslineEconomics
|
|
54
|
+
promptRight?: boolean
|
|
55
|
+
}
|
|
56
|
+
export type StatuslineState = {
|
|
57
|
+
payload: StatuslinePayload
|
|
58
|
+
lastGood: StatuslinePayload | undefined
|
|
59
|
+
stale: boolean
|
|
60
|
+
unavailable: boolean
|
|
61
|
+
}
|
|
62
|
+
export type StatuslineContext = { cwd: string; session: string; width: number; model?: string }
|
|
63
|
+
export type StatuslineRefreshEvent =
|
|
64
|
+
| "server.connected"
|
|
65
|
+
| "project.updated"
|
|
66
|
+
| "session.created"
|
|
67
|
+
| "session.updated"
|
|
68
|
+
| "session.compacted"
|
|
69
|
+
| "session.deleted"
|
|
70
|
+
| "session.diff"
|
|
71
|
+
| "session.error"
|
|
72
|
+
| "session.idle"
|
|
73
|
+
| "session.status"
|
|
74
|
+
export type StatuslineRefreshTarget = { app: boolean; sessionID?: string }
|
|
75
|
+
|
|
76
|
+
export const STATUSLINE_VERSION: 1
|
|
77
|
+
export const STATUSLINE_SEPARATOR: string
|
|
78
|
+
export const STATUSLINE_FALLBACK: string
|
|
79
|
+
export const STATUSLINE_GROUP_SEPARATOR: string
|
|
80
|
+
export const STATUSLINE_WIDE_WIDTH: number
|
|
81
|
+
export const STATUSLINE_MEDIUM_WIDTH: number
|
|
82
|
+
export const DEFAULT_DEBOUNCE_MS: number
|
|
83
|
+
export const DEFAULT_INTERVAL_MS: number
|
|
84
|
+
export const DEFAULT_TIMEOUT_MS: number
|
|
85
|
+
export const STATUSLINE_REFRESH_EVENTS: readonly StatuslineRefreshEvent[]
|
|
86
|
+
|
|
87
|
+
export function parseStatuslineJson(raw: string): StatuslinePayload | undefined
|
|
88
|
+
export function statuslineRefreshTarget(event: unknown, activeSessionID?: string): StatuslineRefreshTarget
|
|
89
|
+
export function statuslineCommandArgs(context: StatuslineContext): string[]
|
|
90
|
+
export function statuslineBinaryCandidates(bin?: unknown, env?: Record<string, string | undefined>): string[]
|
|
91
|
+
export function runStatusline(input: StatuslineContext & {
|
|
92
|
+
bin?: unknown
|
|
93
|
+
env?: Record<string, string | undefined>
|
|
94
|
+
spawnImpl?: (...args: any[]) => any
|
|
95
|
+
timeoutMs?: number
|
|
96
|
+
signal?: AbortSignal
|
|
97
|
+
nowFn?: () => number
|
|
98
|
+
setTimeoutFn?: typeof setTimeout
|
|
99
|
+
clearTimeoutFn?: typeof clearTimeout
|
|
100
|
+
}): Promise<StatuslinePayload | undefined>
|
|
101
|
+
export function createSpawnLimiter(input?: { concurrency?: number }): {
|
|
102
|
+
run<Value>(
|
|
103
|
+
task: (signal: AbortSignal) => Value | Promise<Value>,
|
|
104
|
+
options?: { signal?: AbortSignal; priority?: number },
|
|
105
|
+
): Promise<Value | undefined>
|
|
106
|
+
activeCount(): number
|
|
107
|
+
queuedCount(): number
|
|
108
|
+
dispose(): void
|
|
109
|
+
}
|
|
110
|
+
export function cellWidth(text: string): number
|
|
111
|
+
export function deriveSessionEconomics(input?: {
|
|
112
|
+
session?: {
|
|
113
|
+
cost?: number
|
|
114
|
+
model?: { id: string; providerID: string }
|
|
115
|
+
}
|
|
116
|
+
messages?: ReadonlyArray<{
|
|
117
|
+
role: string
|
|
118
|
+
providerID?: string
|
|
119
|
+
modelID?: string
|
|
120
|
+
time?: { completed?: number }
|
|
121
|
+
error?: unknown
|
|
122
|
+
tokens?: {
|
|
123
|
+
input?: number
|
|
124
|
+
output?: number
|
|
125
|
+
reasoning?: number
|
|
126
|
+
cache?: { read?: number; write?: number }
|
|
127
|
+
}
|
|
128
|
+
}>
|
|
129
|
+
providers?: ReadonlyArray<{
|
|
130
|
+
id: string
|
|
131
|
+
models: Readonly<Record<string, {
|
|
132
|
+
id: string
|
|
133
|
+
providerID?: string
|
|
134
|
+
name?: string
|
|
135
|
+
limit?: { context?: number }
|
|
136
|
+
}>>
|
|
137
|
+
}>
|
|
138
|
+
status?: { type?: string }
|
|
139
|
+
}): StatuslineEconomics
|
|
140
|
+
export function selectSegments(
|
|
141
|
+
payload: StatuslinePayload,
|
|
142
|
+
options?: { width?: number; compact?: boolean },
|
|
143
|
+
): StatuslineSegment[]
|
|
144
|
+
export function initialStatuslineState(): StatuslineState
|
|
145
|
+
export function nextStatuslineState(previous: StatuslineState, payload?: StatuslinePayload): StatuslineState
|
|
146
|
+
export function renderSegments(
|
|
147
|
+
state: StatuslineState,
|
|
148
|
+
options?: { width?: number; compact?: boolean },
|
|
149
|
+
): StatuslineSegment[]
|
|
150
|
+
export function renderStatuslineText(
|
|
151
|
+
state: StatuslineState,
|
|
152
|
+
options?: StatuslineViewOptions & { compact?: boolean },
|
|
153
|
+
): string
|
|
154
|
+
export function createStatuslineViewModel(
|
|
155
|
+
state: StatuslineState,
|
|
156
|
+
options?: StatuslineViewOptions,
|
|
157
|
+
): StatuslineViewModel
|
|
158
|
+
export function renderStatuslineViewText(
|
|
159
|
+
state: StatuslineState,
|
|
160
|
+
options?: StatuslineViewOptions,
|
|
161
|
+
): string
|
|
162
|
+
|
|
163
|
+
export function createRefreshScheduler(input: {
|
|
164
|
+
run: () => void | Promise<void>
|
|
165
|
+
debounceMs?: number
|
|
166
|
+
intervalMs?: number
|
|
167
|
+
setTimeoutFn?: typeof setTimeout
|
|
168
|
+
clearTimeoutFn?: typeof clearTimeout
|
|
169
|
+
setIntervalFn?: typeof setInterval
|
|
170
|
+
clearIntervalFn?: typeof clearInterval
|
|
171
|
+
}): {
|
|
172
|
+
start(): void
|
|
173
|
+
request(immediate?: boolean): void
|
|
174
|
+
flush(): Promise<void>
|
|
175
|
+
dispose(): void
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export function createStatuslineController(input: {
|
|
179
|
+
load: (
|
|
180
|
+
context: StatuslineContext,
|
|
181
|
+
signal: AbortSignal,
|
|
182
|
+
) => StatuslinePayload | undefined | Promise<StatuslinePayload | undefined>
|
|
183
|
+
onState?: (state: StatuslineState) => void
|
|
184
|
+
debounceMs?: number
|
|
185
|
+
intervalMs?: number
|
|
186
|
+
timers?: Record<string, unknown>
|
|
187
|
+
}): {
|
|
188
|
+
start(): void
|
|
189
|
+
request(immediate?: boolean): void
|
|
190
|
+
refreshNow(): Promise<void>
|
|
191
|
+
dispose(): void
|
|
192
|
+
setContext(context: Partial<StatuslineContext>): void
|
|
193
|
+
getState(): StatuslineState
|
|
194
|
+
getContext(): StatuslineContext
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export function createKeyedControllerPool<Key, Value extends { dispose(): void }>(input: {
|
|
198
|
+
create: (key: Key) => Value
|
|
199
|
+
}): {
|
|
200
|
+
acquire(key: Key): { value: Value; release(): void }
|
|
201
|
+
get(key: Key): Value | undefined
|
|
202
|
+
forEach(callback: (value: Value, key: Key) => void): void
|
|
203
|
+
size(): number
|
|
204
|
+
dispose(): void
|
|
205
|
+
}
|