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,81 @@
|
|
|
1
|
+
import { spawn } from "node:child_process"
|
|
2
|
+
import { isAbsolute } from "node:path"
|
|
3
|
+
import { createStatuslineController, runStatusline } from "../rtrt-statusline-core.mjs"
|
|
4
|
+
|
|
5
|
+
/** @typedef {import("@opencode/plugin/tui").Plugin.Context} Context */
|
|
6
|
+
/** @typedef {import("@opencode/plugin/tui/context").SlotMap["prompt.footer.status"]} FooterInput */
|
|
7
|
+
|
|
8
|
+
/** @type {readonly import("@opencode/client").OpenCodeEvent["type"][]} */
|
|
9
|
+
export const NATIVE_REFRESH_EVENTS = Object.freeze([
|
|
10
|
+
"session.created", "session.deleted", "session.renamed", "session.moved",
|
|
11
|
+
"session.model.selected", "session.status", "session.idle",
|
|
12
|
+
"session.step.ended", "session.step.failed",
|
|
13
|
+
"session.usage.updated",
|
|
14
|
+
"session.compaction.ended", "session.compaction.failed",
|
|
15
|
+
"model.updated", "provider.updated",
|
|
16
|
+
])
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @param {Context} ctx
|
|
20
|
+
* @param {{readonly sessionID: () => string, readonly refresh: () => void, readonly dispose: () => void}} entry
|
|
21
|
+
* @param {(input: FooterInput) => import("@opentui/solid").JSX.Element} render
|
|
22
|
+
*/
|
|
23
|
+
export function registerNativeStatusline(ctx, entry, render) {
|
|
24
|
+
/** @type {Array<() => void>} */
|
|
25
|
+
const disposers = []
|
|
26
|
+
let disposed = false
|
|
27
|
+
const cleanup = () => {
|
|
28
|
+
if (disposed) return
|
|
29
|
+
disposed = true
|
|
30
|
+
/** @type {unknown[]} */
|
|
31
|
+
const errors = []
|
|
32
|
+
for (const dispose of [entry.dispose, ...disposers.reverse()]) {
|
|
33
|
+
try { dispose() } catch (error) { errors.push(error) }
|
|
34
|
+
}
|
|
35
|
+
if (errors.length) throw new AggregateError(errors, "Native statusline cleanup failed")
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
for (const name of NATIVE_REFRESH_EVENTS) {
|
|
39
|
+
disposers.push(ctx.data.on(name, (event) => {
|
|
40
|
+
if (disposed) return
|
|
41
|
+
if ("sessionID" in event.data && event.data.sessionID !== entry.sessionID()) return
|
|
42
|
+
entry.refresh()
|
|
43
|
+
}))
|
|
44
|
+
}
|
|
45
|
+
disposers.push(ctx.ui.slot({ append: "prompt.footer.status", render }))
|
|
46
|
+
return cleanup
|
|
47
|
+
} catch (error) {
|
|
48
|
+
try { cleanup() } catch (cleanupError) {
|
|
49
|
+
throw new AggregateError([error, cleanupError], "Native statusline registration failed")
|
|
50
|
+
}
|
|
51
|
+
throw error
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* The existing controller serializes refreshes and owns subprocess aborts.
|
|
57
|
+
* The runner keeps its 1.5s total deadline, 64KiB cap and shell:false argv.
|
|
58
|
+
* An explicit bin must be absolute and never falls back after failure.
|
|
59
|
+
* When omitted, the optional CLI uses RTRT_BIN then PATH's rtrt; if neither
|
|
60
|
+
* works, the shared view shows unavailable rather than inventing CLI data.
|
|
61
|
+
* @param {Readonly<Record<string, unknown>>} options
|
|
62
|
+
* @param {(state: import("../rtrt-statusline-core.mjs").StatuslineState) => void} onState
|
|
63
|
+
* @param {typeof spawn} [spawnImpl]
|
|
64
|
+
*/
|
|
65
|
+
export function createNativeController(options, onState, spawnImpl = spawn) {
|
|
66
|
+
const explicit = Object.hasOwn(options, "bin")
|
|
67
|
+
const bin = typeof options["bin"] === "string" ? options["bin"] : undefined
|
|
68
|
+
/** @type {(binary: string, args: readonly string[], settings: import("node:child_process").SpawnOptions) => import("node:child_process").ChildProcess | undefined} */
|
|
69
|
+
const spawnCandidate = (binary, args, settings) => {
|
|
70
|
+
// Keep the shared legacy runner unchanged, but deny its fallback candidates.
|
|
71
|
+
if (explicit && binary !== bin) return undefined
|
|
72
|
+
return spawnImpl(binary, args, settings)
|
|
73
|
+
}
|
|
74
|
+
return createStatuslineController({
|
|
75
|
+
load: (context, signal) => {
|
|
76
|
+
if (explicit && (bin === undefined || !isAbsolute(bin))) return undefined
|
|
77
|
+
return runStatusline({ ...context, bin, signal, spawnImpl: spawnCandidate })
|
|
78
|
+
},
|
|
79
|
+
onState,
|
|
80
|
+
})
|
|
81
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { deriveSessionEconomics } from "../rtrt-statusline-core.mjs"
|
|
2
|
+
|
|
3
|
+
/** @typedef {import("@opencode/plugin/tui").Plugin.Context} Context */
|
|
4
|
+
|
|
5
|
+
/** @param {never} value @returns {never} */
|
|
6
|
+
function assertNever(value) {
|
|
7
|
+
throw new TypeError(`Unsupported native route: ${String(value)}`)
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @param {Context} ctx
|
|
12
|
+
* @param {string} [slotSessionID]
|
|
13
|
+
*/
|
|
14
|
+
export function activeSessionID(ctx, slotSessionID) {
|
|
15
|
+
if (slotSessionID !== undefined) return slotSessionID
|
|
16
|
+
const route = ctx.ui.router.current()
|
|
17
|
+
switch (route.type) {
|
|
18
|
+
case "session": return route.sessionID
|
|
19
|
+
case "home":
|
|
20
|
+
case "plugin": return ""
|
|
21
|
+
default: return assertNever(route)
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Translate only documented 2.0.20 values; never use aggregate session tokens
|
|
27
|
+
* as context usage, message costs as session spend, or pricing as quota.
|
|
28
|
+
* @param {Context} ctx
|
|
29
|
+
* @param {string} sessionID
|
|
30
|
+
* @param {ReturnType<Context["ui"]["model"]["current"]>} [selected]
|
|
31
|
+
* @returns {{ readonly cwd: string, readonly economics: import("../rtrt-statusline-core.mjs").StatuslineEconomics }}
|
|
32
|
+
*/
|
|
33
|
+
export function nativeSnapshot(ctx, sessionID, selected = ctx.ui.model.current()) {
|
|
34
|
+
const session = sessionID ? ctx.data.session.get(sessionID) : undefined
|
|
35
|
+
const location = session?.location ?? ctx.location ?? ctx.data.location.default()
|
|
36
|
+
const models = ctx.data.location.model.list(location) ?? []
|
|
37
|
+
const providers = Array.from(new Set(models.map((model) => model.providerID)), (id) => ({
|
|
38
|
+
id,
|
|
39
|
+
models: Object.fromEntries(models.filter((model) => model.providerID === id).map((model) => [model.id, model])),
|
|
40
|
+
}))
|
|
41
|
+
const model = selected ? { id: selected.modelID, providerID: selected.providerID } : session?.model
|
|
42
|
+
const messages = session ? ctx.data.session.message.list(sessionID) : []
|
|
43
|
+
const economics = deriveSessionEconomics({
|
|
44
|
+
session: {
|
|
45
|
+
...(session ? { cost: session.cost } : {}),
|
|
46
|
+
...(model ? { model } : {}),
|
|
47
|
+
},
|
|
48
|
+
messages: messages.filter((message) => message.type === "assistant").map((message) => ({
|
|
49
|
+
role: "assistant",
|
|
50
|
+
providerID: message.model.providerID,
|
|
51
|
+
modelID: message.model.id,
|
|
52
|
+
time: message.time,
|
|
53
|
+
...(message.tokens ? { tokens: message.tokens } : {}),
|
|
54
|
+
...(message.error ? { error: message.error } : {}),
|
|
55
|
+
})),
|
|
56
|
+
providers,
|
|
57
|
+
status: { type: session && ctx.data.session.status(sessionID) === "running" ? "busy" : "idle" },
|
|
58
|
+
})
|
|
59
|
+
return {
|
|
60
|
+
cwd: location.directory,
|
|
61
|
+
economics: {
|
|
62
|
+
...economics,
|
|
63
|
+
status: session ? economics.status : { text: "UNKNOWN", tone: "muted" },
|
|
64
|
+
},
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/** @jsxImportSource @opentui/solid */
|
|
2
|
+
import type { Plugin } from "@opencode/plugin/tui"
|
|
3
|
+
import type { SlotMap } from "@opencode/plugin/tui/context"
|
|
4
|
+
import type { BoxRenderable } from "@opentui/core"
|
|
5
|
+
import { useTerminalDimensions } from "@opentui/solid"
|
|
6
|
+
import { createEffect, createMemo, createSignal, For, onMount, untrack } from "solid-js"
|
|
7
|
+
import {
|
|
8
|
+
createStatuslineViewModel,
|
|
9
|
+
initialStatuslineState,
|
|
10
|
+
type StatuslineState,
|
|
11
|
+
type StatuslineViewPart,
|
|
12
|
+
} from "../rtrt-statusline-core.mjs"
|
|
13
|
+
import { activeSessionID, nativeSnapshot } from "./native-state.mjs"
|
|
14
|
+
import { createNativeController, registerNativeStatusline } from "./native-runtime.mjs"
|
|
15
|
+
|
|
16
|
+
// Preserve the legacy footer's two-cell gutters, inherited terminal typography,
|
|
17
|
+
// truncation and responsive view model. All colors come from the native theme.
|
|
18
|
+
const GUTTER = 2
|
|
19
|
+
|
|
20
|
+
function partColor(theme: Plugin.Context["theme"], part: StatuslineViewPart) {
|
|
21
|
+
switch (part.role) {
|
|
22
|
+
case "separator": return theme.border.base
|
|
23
|
+
case "label": return theme.text.muted
|
|
24
|
+
case "badge":
|
|
25
|
+
case "value": return {
|
|
26
|
+
accent: theme.hue.accent[600],
|
|
27
|
+
good: theme.text.feedback.success.base,
|
|
28
|
+
warn: theme.text.feedback.warning.base,
|
|
29
|
+
bad: theme.text.feedback.error.base,
|
|
30
|
+
muted: theme.text.muted,
|
|
31
|
+
}[part.tone]
|
|
32
|
+
default: {
|
|
33
|
+
const exhaustive: never = part.role
|
|
34
|
+
return exhaustive
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
type Entry = {
|
|
40
|
+
readonly state: () => StatuslineState
|
|
41
|
+
readonly revision: () => number
|
|
42
|
+
readonly controller: ReturnType<typeof createNativeController>
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function NativeLine(props: {
|
|
46
|
+
readonly ctx: Plugin.Context
|
|
47
|
+
readonly input: SlotMap["prompt.footer.status"]
|
|
48
|
+
readonly entry: Entry
|
|
49
|
+
}) {
|
|
50
|
+
const dimensions = useTerminalDimensions()
|
|
51
|
+
const [measuredWidth, setMeasuredWidth] = createSignal<number>()
|
|
52
|
+
const width = createMemo(() => Math.max(1, (measuredWidth() ?? dimensions().width) - GUTTER * 2))
|
|
53
|
+
const sessionID = () => activeSessionID(props.ctx, props.input.sessionID)
|
|
54
|
+
const snapshot = createMemo(() => {
|
|
55
|
+
props.entry.revision()
|
|
56
|
+
const session = sessionID()
|
|
57
|
+
const selected = props.ctx.ui.model.current()
|
|
58
|
+
// Stream deltas never subscribe the footer to every token.
|
|
59
|
+
return untrack(() => nativeSnapshot(props.ctx, session, selected))
|
|
60
|
+
})
|
|
61
|
+
const view = createMemo(() => createStatuslineViewModel(props.entry.state(), {
|
|
62
|
+
width: width(), economics: snapshot().economics,
|
|
63
|
+
}))
|
|
64
|
+
createEffect(() => {
|
|
65
|
+
props.entry.controller.setContext({
|
|
66
|
+
cwd: snapshot().cwd,
|
|
67
|
+
session: sessionID(),
|
|
68
|
+
width: width(),
|
|
69
|
+
model: snapshot().economics.modelRef ?? "",
|
|
70
|
+
})
|
|
71
|
+
})
|
|
72
|
+
onMount(() => props.entry.controller.start())
|
|
73
|
+
|
|
74
|
+
return (
|
|
75
|
+
<box
|
|
76
|
+
width="100%"
|
|
77
|
+
height={view().rows.length}
|
|
78
|
+
flexDirection="column"
|
|
79
|
+
flexShrink={0}
|
|
80
|
+
paddingLeft={GUTTER}
|
|
81
|
+
paddingRight={GUTTER}
|
|
82
|
+
overflow="hidden"
|
|
83
|
+
onSizeChange={function (this: BoxRenderable) { setMeasuredWidth(this.width) }}
|
|
84
|
+
>
|
|
85
|
+
<For each={view().rows}>
|
|
86
|
+
{(row) => (
|
|
87
|
+
<text fg={props.ctx.theme.text.muted} wrapMode="none" truncate>
|
|
88
|
+
<For each={row.parts}>
|
|
89
|
+
{(part) => <span style={{ fg: partColor(props.ctx.theme, part) }}>{part.text}</span>}
|
|
90
|
+
</For>
|
|
91
|
+
</text>
|
|
92
|
+
)}
|
|
93
|
+
</For>
|
|
94
|
+
</box>
|
|
95
|
+
)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export default {
|
|
99
|
+
id: "rtrt-statusline",
|
|
100
|
+
setup(ctx) {
|
|
101
|
+
if (ctx.options["enabled"] === false) return
|
|
102
|
+
const [state, setState] = createSignal(initialStatuslineState())
|
|
103
|
+
const [revision, setRevision] = createSignal(0)
|
|
104
|
+
const refreshEconomics = () => { setRevision((value) => value + 1) }
|
|
105
|
+
const controller = createNativeController(ctx.options, (next) => {
|
|
106
|
+
setState(next)
|
|
107
|
+
refreshEconomics()
|
|
108
|
+
})
|
|
109
|
+
const entry: Entry = { state, revision, controller }
|
|
110
|
+
return registerNativeStatusline(ctx, {
|
|
111
|
+
sessionID: () => controller.getContext().session,
|
|
112
|
+
refresh: () => { refreshEconomics(); controller.request() },
|
|
113
|
+
dispose: controller.dispose,
|
|
114
|
+
}, (input) => <NativeLine ctx={ctx} input={input} entry={entry} />)
|
|
115
|
+
},
|
|
116
|
+
} satisfies Plugin.Definition
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { constants } from "node:fs"
|
|
2
|
+
import { lstat, open } from "node:fs/promises"
|
|
3
|
+
import { homedir } from "node:os"
|
|
4
|
+
import path from "node:path"
|
|
5
|
+
|
|
6
|
+
const SESSION_ID = /^[A-Za-z0-9_-]{1,256}$/
|
|
7
|
+
const OWNER = "rtrt-opencode-task-agents"
|
|
8
|
+
const MANAGER = "rtrt-manager"
|
|
9
|
+
const STATE_LIMIT = 65_536
|
|
10
|
+
const configuredPath = (value) => typeof value === "string" && value.length > 0 && !value.includes("\0")
|
|
11
|
+
|
|
12
|
+
function boundedState(value, depth = 8, count = { value: 0 }) {
|
|
13
|
+
count.value++
|
|
14
|
+
if (count.value > 512 || depth < 0) return false
|
|
15
|
+
if (!value || typeof value !== "object") return true
|
|
16
|
+
const items = Object.values(value)
|
|
17
|
+
if (items.length > 128) return false
|
|
18
|
+
return items.every((item) => boundedState(item, depth - 1, count))
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function secureStateFile(stat, uid) {
|
|
22
|
+
return stat.isFile() && !stat.isSymbolicLink() && stat.uid === uid &&
|
|
23
|
+
stat.nlink === 1n && (stat.mode & 0o777n) === 0o600n && stat.size <= BigInt(STATE_LIMIT)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function sameFile(left, right) {
|
|
27
|
+
return ["dev", "ino", "uid", "mode", "nlink", "size", "mtimeNs", "ctimeNs"]
|
|
28
|
+
.every((field) => left[field] === right[field])
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async function secureAncestors(file, uid, statPath = lstat) {
|
|
32
|
+
let directory = path.dirname(file)
|
|
33
|
+
while (true) {
|
|
34
|
+
const stat = await statPath(directory, { bigint: true })
|
|
35
|
+
if (!stat.isDirectory() || stat.isSymbolicLink() ||
|
|
36
|
+
(stat.uid !== uid && stat.uid !== 0n) || (stat.mode & 0o022n) !== 0n) return false
|
|
37
|
+
const parent = path.dirname(directory)
|
|
38
|
+
if (parent === directory) return true
|
|
39
|
+
directory = parent
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function managedAgentStatePath(env = process.env) {
|
|
44
|
+
const home = configuredPath(env.HOME) ? env.HOME : homedir()
|
|
45
|
+
const root = configuredPath(env.OPENCODE_CONFIG_DIR)
|
|
46
|
+
? path.resolve(env.OPENCODE_CONFIG_DIR)
|
|
47
|
+
: configuredPath(env.XDG_CONFIG_HOME)
|
|
48
|
+
? path.resolve(env.XDG_CONFIG_HOME, "opencode")
|
|
49
|
+
: path.resolve(home, ".config", "opencode")
|
|
50
|
+
return path.join(root, "agents", ".rtrt-managed-state.json")
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export async function loadAgents(file, io = { lstat, open }) {
|
|
54
|
+
let handle
|
|
55
|
+
let result
|
|
56
|
+
try {
|
|
57
|
+
const currentUser = process.getuid?.()
|
|
58
|
+
if (currentUser === undefined || typeof file !== "string" || !path.isAbsolute(file) || file.includes("\0")) return undefined
|
|
59
|
+
const uid = BigInt(currentUser)
|
|
60
|
+
if (!(await secureAncestors(file, uid, io.lstat))) return undefined
|
|
61
|
+
const stat = await io.lstat(file, { bigint: true })
|
|
62
|
+
if (!secureStateFile(stat, uid)) return undefined
|
|
63
|
+
handle = await io.open(file, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0))
|
|
64
|
+
const opened = await handle.stat({ bigint: true })
|
|
65
|
+
if (!secureStateFile(opened, uid) || !sameFile(stat, opened)) return undefined
|
|
66
|
+
const raw = await handle.readFile("utf8")
|
|
67
|
+
if (Buffer.byteLength(raw) > STATE_LIMIT) return undefined
|
|
68
|
+
const after = await handle.stat({ bigint: true })
|
|
69
|
+
const finalPath = await io.lstat(file, { bigint: true })
|
|
70
|
+
if (!sameFile(opened, after) || !sameFile(opened, finalPath) ||
|
|
71
|
+
!(await secureAncestors(file, uid, io.lstat))) return undefined
|
|
72
|
+
const state = JSON.parse(raw)
|
|
73
|
+
if (!state || typeof state !== "object" || Array.isArray(state) || !boundedState(state)) return undefined
|
|
74
|
+
if (state.owner !== OWNER || state.version !== 1 || !Array.isArray(state.agents)) return undefined
|
|
75
|
+
if (state.agents.length < 1 || state.agents.length > 128 || !state.agents.every((id) =>
|
|
76
|
+
typeof id === "string" && SESSION_ID.test(id))) return undefined
|
|
77
|
+
const agents = new Set(state.agents)
|
|
78
|
+
result = agents.size === state.agents.length && agents.has(MANAGER) ? agents : undefined
|
|
79
|
+
} catch {
|
|
80
|
+
// State is an authorization boundary; unreadable or malformed state fails closed.
|
|
81
|
+
return undefined
|
|
82
|
+
} finally {
|
|
83
|
+
if (handle) {
|
|
84
|
+
try { await handle.close() } catch { result = undefined }
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return result
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export async function createPermissionEvaluator(ctx, statePath = managedAgentStatePath(), active = () => true) {
|
|
91
|
+
const managed = await loadAgents(statePath)
|
|
92
|
+
const project = ctx.location.project
|
|
93
|
+
const directory = ctx.location.directory
|
|
94
|
+
return async (request) => {
|
|
95
|
+
if (
|
|
96
|
+
!active() || !managed || request.effect !== "ask" || request.action !== "shell" ||
|
|
97
|
+
request.resources?.length !== 1 || request.resources[0] !== "pwd" ||
|
|
98
|
+
!SESSION_ID.test(request.sessionID ?? "")
|
|
99
|
+
) return
|
|
100
|
+
try {
|
|
101
|
+
const session = await ctx.session.get({ sessionID: request.sessionID })
|
|
102
|
+
if (
|
|
103
|
+
session?.id !== request.sessionID || !managed.has(session.agent) ||
|
|
104
|
+
session.agent === MANAGER || request.agent && request.agent !== session.agent ||
|
|
105
|
+
session.projectID !== project.id || session.location?.directory !== directory ||
|
|
106
|
+
!SESSION_ID.test(session.parentID ?? "")
|
|
107
|
+
) return
|
|
108
|
+
const parent = await ctx.session.get({ sessionID: session.parentID })
|
|
109
|
+
if (
|
|
110
|
+
parent?.id !== session.parentID || parent.agent !== MANAGER ||
|
|
111
|
+
parent.projectID !== project.id || parent.location?.directory !== directory
|
|
112
|
+
) return
|
|
113
|
+
if (active() && request.effect === "ask") request.effect = "allow"
|
|
114
|
+
} catch {
|
|
115
|
+
// Unknown session or unavailable host API must preserve the host's decision.
|
|
116
|
+
return
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|