From f17ad5b7cb2234a9f43cd65c1345f05a24c969f7 Mon Sep 17 00:00:00 2001 From: Will Killian Date: Fri, 24 Jul 2026 22:11:07 -0400 Subject: [PATCH 1/4] feat(observability)!: unify OpenTelemetry exporters Signed-off-by: Will Killian --- .../skills/maintain-observability/SKILL.md | 32 +- ATTRIBUTIONS-Rust.md | 14503 +++++++++------- Cargo.lock | 348 +- Cargo.toml | 5 +- README.md | 10 +- about.toml | 1 + crates/cli/Cargo.toml | 2 +- crates/cli/README.md | 2 +- crates/cli/src/diagnostics/mod.rs | 67 +- crates/cli/src/diagnostics/probes.rs | 101 + crates/cli/src/error.rs | 6 +- crates/cli/src/gateway/tls.rs | 6 + crates/cli/src/process/launcher.rs | 36 +- crates/cli/tests/cli_tests.rs | 13 +- .../tests/coverage/agents/launcher_tests.rs | 20 +- .../cli/tests/coverage/shared/doctor_tests.rs | 85 +- .../cli/tests/coverage/shared/error_tests.rs | 5 - .../tests/coverage/shared/plugins_tests.rs | 32 +- .../cli/tests/coverage/shared/server_tests.rs | 25 +- .../tests/coverage/shared/session_tests.rs | 13 +- crates/core/Cargo.toml | 42 +- crates/core/README.md | 4 +- crates/core/src/lib.rs | 2 +- crates/core/src/observability/manual.rs | 4 - crates/core/src/observability/mod.rs | 58 +- .../core/src/observability/openinference.rs | 932 +- crates/core/src/observability/otel.rs | 633 +- crates/core/src/observability/otel_genai.rs | 503 + .../src/observability/plugin_component.rs | 865 +- crates/core/src/plugin.rs | 120 +- .../tests/integration/atif_storage_tests.rs | 2 + .../tests/integration/middleware_tests.rs | 23 +- .../observability/exporter_parity_tests.rs | 8 +- .../tests/unit/observability/manual_tests.rs | 6 - .../unit/observability/openinference_tests.rs | 604 +- .../tests/unit/observability/otel_tests.rs | 598 +- .../observability/plugin_component_tests.rs | 724 +- crates/core/tests/unit/plugin_tests.rs | 118 +- crates/ffi/Cargo.toml | 2 +- crates/ffi/README.md | 4 + crates/ffi/nemo_relay.h | 118 +- crates/ffi/src/api/mod.rs | 8 +- crates/ffi/src/api/observability.rs | 479 +- crates/ffi/src/types/mod.rs | 19 - .../integration/api/coverage_sweeps_tests.rs | 2 +- crates/ffi/tests/unit/api/core_tests.rs | 6 +- .../tests/unit/api/coverage_sweeps_tests.rs | 9 +- crates/ffi/tests/unit/api/plugin_tests.rs | 158 +- crates/ffi/tests/unit/api/registry_tests.rs | 218 +- crates/ffi/tests/unit/types_tests.rs | 1 - crates/node/Cargo.toml | 2 +- crates/node/README.md | 10 +- crates/node/observability.d.ts | 28 +- crates/node/observability.js | 48 +- crates/node/src/api/mod.rs | 225 +- .../node/tests/observability_plugin_tests.mjs | 49 +- crates/node/tests/openinference_tests.mjs | 34 +- crates/node/tests/otel_tests.mjs | 57 +- crates/pii-redaction/Cargo.toml | 2 +- .../tests/unit/component_tests.rs | 9 +- crates/python/Cargo.toml | 2 +- crates/python/src/py_types/mod.rs | 2 - crates/python/src/py_types/observability.rs | 305 +- .../tests/coverage/py_types_coverage_tests.rs | 56 +- deny.toml | 7 +- .../about-nemo-relay/agent-runtime-primer.mdx | 4 +- docs/about-nemo-relay/concepts/codecs.mdx | 12 +- docs/about-nemo-relay/concepts/events.mdx | 8 +- docs/about-nemo-relay/concepts/plugins.mdx | 6 +- .../about-nemo-relay/concepts/subscribers.mdx | 15 +- docs/about-nemo-relay/ecosystem.mdx | 2 +- docs/about-nemo-relay/overview.mdx | 8 +- docs/about-nemo-relay/release-notes/index.mdx | 31 +- .../language-binding/code-examples.mdx | 5 +- docs/configure-plugins/about.mdx | 2 +- .../configure-plugins/observability/about.mdx | 41 +- docs/configure-plugins/observability/atif.mdx | 6 +- docs/configure-plugins/observability/atof.mdx | 6 +- .../observability/configuration.mdx | 500 +- .../observability/openinference.mdx | 409 +- .../observability/opentelemetry.mdx | 429 +- .../pii-redaction/configuration.mdx | 4 +- .../plugin-configuration-files.mdx | 53 +- .../switchyard/configuration.mdx | 4 +- docs/contribute/runtime-contract-docs.mdx | 6 +- docs/getting-started/configuration.mdx | 16 +- .../provider-response-codecs.mdx | 33 +- docs/nemo-relay-cli/claude-code.mdx | 12 +- docs/reference/migration-guides.mdx | 125 + docs/resources/glossary.mdx | 26 +- .../trace-incident-runbook.mdx | 9 +- .../openclaw-plugin.mdx | 49 +- .../switchyard/hermes-ollama-plugins.toml | 8 +- go/nemo_relay/README.md | 3 + go/nemo_relay/coverage_gap_test.go | 12 +- go/nemo_relay/nemo_relay.go | 242 +- go/nemo_relay/observability_plugin.go | 116 +- go/nemo_relay/observability_plugin_test.go | 41 +- go/nemo_relay/openinference_test.go | 209 +- go/nemo_relay/otel_test.go | 110 +- go/nemo_relay/top_level_coverage_test.go | 30 +- integrations/coding-agents/README.md | 12 +- integrations/openclaw/README.md | 54 +- integrations/openclaw/index.ts | 2 +- integrations/openclaw/openclaw.plugin.json | 4 +- integrations/openclaw/src/config.ts | 2 +- integrations/openclaw/src/health.ts | 9 +- integrations/openclaw/test/config.test.ts | 13 +- integrations/openclaw/test/live-smoke.test.ts | 2 +- python/nemo_relay/README.md | 9 +- python/nemo_relay/__init__.py | 6 +- python/nemo_relay/__init__.pyi | 6 - python/nemo_relay/_native.pyi | 99 +- python/nemo_relay/observability.py | 58 +- python/nemo_relay/observability.pyi | 27 +- .../test_deepagents_integration.py | 5 +- python/tests/test_observability_plugin.py | 28 +- python/tests/test_types.py | 124 +- scripts/licensing/attributions_lockfile_md.py | 1 + 119 files changed, 13930 insertions(+), 11541 deletions(-) create mode 100644 crates/core/src/observability/otel_genai.rs diff --git a/.agents/skills/maintain-observability/SKILL.md b/.agents/skills/maintain-observability/SKILL.md index 7f85170bd..49ca91f45 100644 --- a/.agents/skills/maintain-observability/SKILL.md +++ b/.agents/skills/maintain-observability/SKILL.md @@ -1,6 +1,6 @@ --- name: maintain-observability -description: Maintain or extend NeMo Relay observability surfaces across ATIF, OpenTelemetry, and OpenInference +description: Maintain or extend NeMo Relay observability surfaces across ATIF and typed OpenTelemetry projections author: NVIDIA Corporation and Affiliates license: Apache-2.0 --- @@ -15,7 +15,8 @@ work. Keep changes scoped, surface assumptions, and define focused validation before editing. Use this skill when changing event fields, exporter behavior, subscriber config, -or binding parity for ATIF, OpenTelemetry, or OpenInference. +or binding parity for ATIF or the `full`, `gen_ai`, and `openinference` +OpenTelemetry projections. ## Surfaces To Keep In Sync @@ -25,16 +26,29 @@ or binding parity for ATIF, OpenTelemetry, or OpenInference. - `crates/core/src/observability/openinference.rs` - FFI and binding-native wrappers where the config or lifecycle is exposed - Python, Go, and Node.js config objects and subscriber/exporter methods -- Docs under `docs/about/concepts/subscribers.md` and - `docs/export-observability-data/about.md` +- Observability config version 3, where one `opentelemetry` section contains + typed endpoints and OpenInference has no standalone public surface +- Docs under `docs/about-nemo-relay/concepts/subscribers.mdx` and + `docs/configure-plugins/observability/` ## Design Checklist - [ ] Is this an event-model change, exporter-config change, or lifecycle change? - [ ] Do all bindings expose the same logical knobs and semantics? +- [ ] Does every OpenTelemetry endpoint require a type and nonblank destination? +- [ ] Does each endpoint resolve `header_env` values at activation and reject + missing, blank, or duplicate headers? +- [ ] Do layered ATOF sink, ATIF storage, and OpenTelemetry endpoint lists + concatenate with higher-precedence entries first? +- [ ] Are OpenTelemetry and OpenInference dependencies unconditional rather + than Cargo feature-gated? +- [ ] Does `gen_ai` avoid `nemo_relay.*` and content-capture attributes while + preserving descendants through omitted scopes? +- [ ] Does Relay derive compliant trace and span IDs consistently across typed + OpenTelemetry endpoints while preserving lifecycle parentage? - [ ] Are mark events, start/end events, and orphan cases still handled correctly? -- [ ] Do examples and docs reflect the same lifecycle: create, register, run, - deregister, flush, shutdown? +- [ ] Do examples and docs use each exporter's documented flush/deregister + order before shutdown? - [ ] Are span or trajectory fields still derived from the intended event data? ## Validation @@ -47,9 +61,9 @@ or binding parity for ATIF, OpenTelemetry, or OpenInference. ## References -- `docs/about/concepts/subscribers.md` -- `docs/export-observability-data/about.md` -- `docs/export-observability-data/code-examples.md` +- `docs/about-nemo-relay/concepts/subscribers.mdx` +- `docs/configure-plugins/observability/about.mdx` +- `docs/configure-plugins/observability/opentelemetry.mdx` - `crates/core/src/observability/atif.rs` - `crates/core/src/observability/otel.rs` - `crates/core/src/observability/openinference.rs` diff --git a/ATTRIBUTIONS-Rust.md b/ATTRIBUTIONS-Rust.md index 2821c2c15..ee60e8a33 100644 --- a/ATTRIBUTIONS-Rust.md +++ b/ATTRIBUTIONS-Rust.md @@ -215,7 +215,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## aho-corasick - 1.1.4 @@ -244,7 +243,6 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## allocator-api2 - 0.2.21 @@ -325,7 +323,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## android_system_properties - 0.1.5 @@ -406,7 +403,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## anstream - 1.0.0 @@ -616,7 +612,6 @@ limitations under the License. See the License for the specific language governing permissions and limitations under the License. - ``` ## anstyle - 1.0.14 @@ -826,7 +821,6 @@ limitations under the License. See the License for the specific language governing permissions and limitations under the License. - ``` ## anstyle-parse - 1.0.0 @@ -1036,7 +1030,6 @@ limitations under the License. See the License for the specific language governing permissions and limitations under the License. - ``` ## anstyle-query - 1.1.5 @@ -1246,7 +1239,6 @@ limitations under the License. See the License for the specific language governing permissions and limitations under the License. - ``` ## anstyle-wincon - 3.0.11 @@ -1456,7 +1448,6 @@ limitations under the License. See the License for the specific language governing permissions and limitations under the License. - ``` ## anyhow - 1.0.102 @@ -1537,7 +1528,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## arc-swap - 1.9.1 @@ -1746,7 +1736,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## arcstr - 1.2.0 @@ -1955,7 +1944,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## async-lock - 3.4.2 @@ -2164,7 +2152,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## async-stream - 0.3.6 @@ -2190,7 +2177,6 @@ LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE A EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## async-stream-impl - 0.3.6 @@ -2216,7 +2202,6 @@ LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE A EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## async-trait - 0.1.89 @@ -2297,7 +2282,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## atomic - 0.6.1 @@ -2506,7 +2490,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## atomic-waker - 1.1.2 @@ -2715,7 +2698,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## autocfg - 1.5.0 @@ -2924,7 +2906,163 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +``` + +## aws-lc-rs - 1.17.3 +**Repository URL**: https://github.com/aws/aws-lc-rs +**License Type(s)**: ISC +### License: https://spdx.org/licenses/ISC.html +``` +ISC License: + +Copyright (c) 2004-2010 by Internet Systems Consortium, Inc. ("ISC") +Copyright (c) 1995-2003 by Internet Software Consortium +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +``` + +## aws-lc-sys - 0.43.0 +**Repository URL**: https://github.com/aws/aws-lc-rs +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +## aws-lc-sys - 0.43.0 +**Repository URL**: https://github.com/aws/aws-lc-rs +**License Type(s)**: BSD-3-Clause +### License: https://spdx.org/licenses/BSD-3-Clause.html +``` +Copyright (c) . + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +``` + +## aws-lc-sys - 0.43.0 +**Repository URL**: https://github.com/aws/aws-lc-rs +**License Type(s)**: ISC +### License: https://spdx.org/licenses/ISC.html +``` +ISC License: + +Copyright (c) 2004-2010 by Internet Systems Consortium, Inc. ("ISC") +Copyright (c) 1995-2003 by Internet Software Consortium + +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +``` + +## aws-lc-sys - 0.43.0 +**Repository URL**: https://github.com/aws/aws-lc-rs +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +The MIT License (MIT) + +Copyright (c) 2015-2020 the fiat-crypto authors (see +https://github.com/mit-plv/fiat-crypto/blob/master/AUTHORS). + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ``` ## axum - 0.8.9 @@ -2957,7 +3095,6 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## axum-core - 0.5.6 @@ -3408,7 +3545,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## bit-set - 0.8.0 @@ -3617,7 +3753,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## bit-vec - 0.8.0 @@ -3826,7 +3961,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## bitflags - 2.11.0 @@ -4035,7 +4169,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## block-buffer - 0.10.4 @@ -4244,7 +4377,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## block-buffer - 0.12.0 @@ -4453,7 +4585,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## borrow-or-share - 0.2.4 @@ -4687,7 +4818,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## bytecount - 0.6.9 @@ -4896,7 +5026,6 @@ limitations under the License. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## bytemuck - 1.25.1 @@ -4965,7 +5094,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## bytemuck_derive - 1.11.0 @@ -5034,7 +5162,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## bytes - 1.11.1 @@ -5067,7 +5194,6 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## cbindgen - 0.29.2 @@ -5448,7 +5574,6 @@ Exhibit B - "Incompatible With Secondary Licenses" Notice This Source Code Form is "Incompatible With Secondary Licenses", as defined by the Mozilla Public License, v. 2.0. - ``` ## cc - 1.2.60 @@ -5657,7 +5782,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## cfg-if - 1.0.4 @@ -5866,7 +5990,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## cfg_aliases - 0.2.1 @@ -6092,7 +6215,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## chrono - 0.4.44 @@ -6340,7 +6462,6 @@ See the License for the specific language governing permissions and limitations under the License. ~~~~ - ``` ## clap - 4.6.0 @@ -6550,7 +6671,6 @@ limitations under the License. See the License for the specific language governing permissions and limitations under the License. - ``` ## clap_builder - 4.6.0 @@ -6760,7 +6880,6 @@ limitations under the License. See the License for the specific language governing permissions and limitations under the License. - ``` ## clap_complete - 4.6.5 @@ -6970,7 +7089,6 @@ limitations under the License. See the License for the specific language governing permissions and limitations under the License. - ``` ## clap_derive - 4.6.0 @@ -7180,7 +7298,6 @@ limitations under the License. See the License for the specific language governing permissions and limitations under the License. - ``` ## clap_lex - 1.1.0 @@ -7390,7 +7507,214 @@ limitations under the License. See the License for the specific language governing permissions and limitations under the License. +``` +## cmake - 0.1.58 +**Repository URL**: https://github.com/rust-lang/cmake-rs +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. ``` ## colorchoice - 1.0.5 @@ -7600,7 +7924,6 @@ limitations under the License. See the License for the specific language governing permissions and limitations under the License. - ``` ## combine - 4.6.7 @@ -7630,7 +7953,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## concurrent-queue - 2.5.0 @@ -7839,7 +8161,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## console - 0.15.11 @@ -7869,7 +8190,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## console - 0.16.3 @@ -7899,7 +8219,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## const-oid - 0.10.2 @@ -8108,7 +8427,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## convert_case - 0.6.0 @@ -8137,7 +8455,6 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## core-foundation - 0.10.1 @@ -8346,7 +8663,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## core-foundation-sys - 0.8.7 @@ -8555,7 +8871,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## cpufeatures - 0.2.17 @@ -8764,7 +9079,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## cpufeatures - 0.3.0 @@ -8973,7 +9287,214 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +``` + +## crc-fast - 1.10.0 +**Repository URL**: https://github.com/awesomized/crc-fast-rust +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. ``` ## crossbeam - 0.8.4 @@ -9182,7 +9703,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## crossbeam-channel - 0.5.16 @@ -9391,7 +9911,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## crossbeam-deque - 0.8.7 @@ -9600,7 +10119,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## crossbeam-epoch - 0.9.20 @@ -9809,7 +10327,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## crossbeam-queue - 0.3.13 @@ -10018,7 +10535,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## crossbeam-utils - 0.8.21 @@ -10227,7 +10743,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## crypto-common - 0.1.7 @@ -10436,7 +10951,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## crypto-common - 0.2.1 @@ -10645,7 +11159,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## ctor - 0.2.9 @@ -10854,7 +11367,6 @@ Apache License WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## data-encoding - 2.11.0 @@ -10884,7 +11396,6 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## deranged - 0.5.8 @@ -11094,7 +11605,6 @@ SOFTWARE. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## dialoguer - 0.11.0 @@ -11124,7 +11634,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## digest - 0.10.7 @@ -11333,7 +11842,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## digest - 0.11.2 @@ -11542,7 +12050,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## displaydoc - 0.2.5 @@ -11751,7 +12258,86 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +``` +## dunce - 1.0.5 +**Repository URL**: https://gitlab.com/kornelski/dunce +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. ``` ## dyn-clone - 1.0.20 @@ -11832,7 +12418,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## either - 1.15.0 @@ -12041,7 +12626,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## email_address - 0.2.9 @@ -12070,7 +12654,6 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## encode_unicode - 1.0.0 @@ -12280,7 +12863,6 @@ SOFTWARE. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## encoding_rs - 0.8.35 @@ -12490,7 +13072,6 @@ SOFTWARE. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## encoding_rs - 0.8.35 @@ -12524,7 +13105,6 @@ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ``` ## env_filter - 0.1.4 @@ -12734,7 +13314,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. See the License for the specific language governing permissions and limitations under the License. - ``` ## equivalent - 1.0.2 @@ -12943,7 +13522,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## erased-serde - 0.4.10 @@ -13363,7 +13941,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## event-listener - 5.4.1 @@ -13572,7 +14149,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## event-listener-strategy - 0.5.4 @@ -13781,7 +14357,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## fancy-regex - 0.18.0 @@ -13810,7 +14385,6 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## fastrand - 2.4.1 @@ -14019,7 +14593,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## find-msvc-tools - 0.1.9 @@ -14228,7 +14801,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## fixedbitset - 0.5.7 @@ -14437,7 +15009,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## fluent-uri - 0.4.1 @@ -14674,7 +15245,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## foldhash - 0.1.5 @@ -14935,7 +15505,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## fraction - 0.15.4 @@ -15144,7 +15713,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## fs2 - 0.4.3 @@ -15353,7 +15921,34 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +``` +## fs_extra - 1.3.0 +**Repository URL**: https://github.com/webdesus/fs_extra +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License + +Copyright (c) 2017 Denis Kurilenko + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ``` ## futures - 0.3.32 @@ -15563,7 +16158,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## futures-channel - 0.3.32 @@ -15773,7 +16367,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## futures-core - 0.3.32 @@ -15983,7 +16576,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## futures-executor - 0.3.32 @@ -16193,7 +16785,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## futures-io - 0.3.32 @@ -16403,7 +16994,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## futures-macro - 0.3.32 @@ -16613,7 +17203,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## futures-sink - 0.3.32 @@ -16823,7 +17412,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## futures-task - 0.3.32 @@ -17033,7 +17621,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## futures-util - 0.3.32 @@ -17243,7 +17830,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## generic-array - 0.14.7 @@ -17251,239 +17837,30 @@ limitations under the License. **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -The MIT License (MIT) - -Copyright (c) 2015 Bartłomiej Kamiński - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -## getrandom - 0.2.17 -**Repository URL**: https://github.com/rust-random/getrandom -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` - Apache License - Version 2.0, January 2004 - https://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +The MIT License (MIT) -Copyright [yyyy] [name of copyright owner] +Copyright (c) 2015 Bartłomiej Kamiński -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - https://www.apache.org/licenses/LICENSE-2.0 +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ``` -## getrandom - 0.3.4 +## getrandom - 0.2.17 **Repository URL**: https://github.com/rust-random/getrandom **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -17689,10 +18066,9 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## getrandom - 0.4.2 +## getrandom - 0.3.4 **Repository URL**: https://github.com/rust-random/getrandom **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -17898,50 +18274,16 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - -``` - -## h2 - 0.4.13 -**Repository URL**: https://github.com/hyperium/h2 -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -Copyright (c) 2017 h2 authors - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - ``` -## hashbrown - 0.15.5 -**Repository URL**: https://github.com/rust-lang/hashbrown +## getrandom - 0.4.2 +**Repository URL**: https://github.com/rust-random/getrandom **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` Apache License Version 2.0, January 2004 - http://www.apache.org/licenses/ + https://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION @@ -18133,226 +18475,48 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## hashbrown - 0.16.1 -**Repository URL**: https://github.com/rust-lang/hashbrown -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html +## h2 - 0.4.13 +**Repository URL**: https://github.com/hyperium/h2 +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at +Copyright (c) 2017 h2 authors - http://www.apache.org/licenses/LICENSE-2.0 +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. ``` -## hashbrown - 0.17.0 +## hashbrown - 0.15.5 **Repository URL**: https://github.com/rust-lang/hashbrown **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html @@ -18558,11 +18722,10 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## heck - 0.5.0 -**Repository URL**: https://github.com/withoutboats/heck +## hashbrown - 0.16.1 +**Repository URL**: https://github.com/rust-lang/hashbrown **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -18767,11 +18930,10 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## http - 1.4.0 -**Repository URL**: https://github.com/hyperium/http +## hashbrown - 0.17.0 +**Repository URL**: https://github.com/rust-lang/hashbrown **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -18963,7 +19125,7 @@ APPENDIX: How to apply the Apache License to your work. same "printed page" as the copyright notice for easier identification within third-party archives. -Copyright 2017 http-rs authors +Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -18976,77 +19138,218 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## http-body - 1.0.1 -**Repository URL**: https://github.com/hyperium/http-body -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html +## heck - 0.5.0 +**Repository URL**: https://github.com/withoutboats/heck +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html ``` -Copyright (c) 2019-2024 Sean McArthur & Hyper Contributors + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. +1. Definitions. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -``` + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -## http-body-util - 0.1.3 -**Repository URL**: https://github.com/hyperium/http-body -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -Copyright (c) 2019-2025 Sean McArthur & Hyper Contributors + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. ``` -## httparse - 1.10.1 -**Repository URL**: https://github.com/seanmonstar/httparse +## http - 1.4.0 +**Repository URL**: https://github.com/hyperium/http **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -19238,7 +19541,7 @@ APPENDIX: How to apply the Apache License to your work. same "printed page" as the copyright notice for easier identification within third-party archives. -Copyright [yyyy] [name of copyright owner] +Copyright 2017 http-rs authors Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -19251,7 +19554,278 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +``` + +## http-body - 1.0.1 +**Repository URL**: https://github.com/hyperium/http-body +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +Copyright (c) 2019-2024 Sean McArthur & Hyper Contributors + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` +## http-body-util - 0.1.3 +**Repository URL**: https://github.com/hyperium/http-body +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +Copyright (c) 2019-2025 Sean McArthur & Hyper Contributors + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +## httparse - 1.10.1 +**Repository URL**: https://github.com/seanmonstar/httparse +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. ``` ## httpdate - 1.0.3 @@ -19460,7 +20034,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## humantime - 2.3.0 @@ -19670,7 +20243,6 @@ limitations under the License. See the License for the specific language governing permissions and limitations under the License. - ``` ## hybrid-array - 0.4.10 @@ -19879,7 +20451,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## hyper - 1.9.0 @@ -19906,7 +20477,6 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## hyper-rustls - 0.27.9 @@ -20115,7 +20685,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## hyper-timeout - 0.5.2 @@ -20324,7 +20893,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## hyper-util - 0.1.20 @@ -20351,7 +20919,6 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## iana-time-zone - 0.1.65 @@ -20560,7 +21127,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## iana-time-zone-haiku - 0.1.2 @@ -20769,7 +21335,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## icu_collections - 2.2.0 @@ -20823,7 +21388,6 @@ SPDX-License-Identifier: Unicode-3.0 Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. - ``` ## icu_locale_core - 2.2.0 @@ -20877,7 +21441,6 @@ SPDX-License-Identifier: Unicode-3.0 Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. - ``` ## icu_normalizer - 2.2.0 @@ -20931,7 +21494,6 @@ SPDX-License-Identifier: Unicode-3.0 Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. - ``` ## icu_normalizer_data - 2.2.0 @@ -20985,7 +21547,6 @@ SPDX-License-Identifier: Unicode-3.0 Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. - ``` ## icu_properties - 2.2.0 @@ -21039,7 +21600,6 @@ SPDX-License-Identifier: Unicode-3.0 Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. - ``` ## icu_properties_data - 2.2.0 @@ -21093,7 +21653,6 @@ SPDX-License-Identifier: Unicode-3.0 Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. - ``` ## icu_provider - 2.2.0 @@ -21147,7 +21706,6 @@ SPDX-License-Identifier: Unicode-3.0 Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. - ``` ## id-arena - 2.3.0 @@ -21594,7 +22152,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## idna_adapter - 1.2.1 @@ -21803,7 +22360,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## indexmap - 2.14.0 @@ -22012,7 +22568,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## ipnet - 2.12.0 @@ -22221,7 +22776,6 @@ limitations under the License. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## iri-string - 0.7.12 @@ -22431,7 +22985,6 @@ limitations under the License. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## is_terminal_polyfill - 1.70.2 @@ -22641,7 +23194,6 @@ limitations under the License. See the License for the specific language governing permissions and limitations under the License. - ``` ## itertools - 0.14.0 @@ -22850,92 +23402,10 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - -``` - -## itoa - 1.0.18 -**Repository URL**: https://github.com/dtolnay/itoa -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - - (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - ``` -## jobserver - 0.1.35 -**Repository URL**: https://github.com/rust-lang/jobserver-rs +## itertools - 0.15.0 +**Repository URL**: https://github.com/rust-itertools/itertools **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -23140,201 +23610,72 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## js-sys - 0.3.95 -**Repository URL**: https://github.com/wasm-bindgen/wasm-bindgen/tree/master/crates/js-sys +## itoa - 1.0.18 +**Repository URL**: https://github.com/dtolnay/itoa **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] @@ -23342,237 +23683,79 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 +http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - -``` - -## jsonschema - 0.46.8 -**Repository URL**: https://github.com/Stranger6667/jsonschema -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) 2020-2026 Dmitry Dygalo - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ``` -## lazy_static - 1.5.0 -**Repository URL**: https://github.com/rust-lang-nursery/lazy-static.rs +## jni - 0.22.4 +**Repository URL**: https://github.com/jni-rs/jni-rs **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] @@ -23580,209 +23763,79 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 +http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## leb128fmt - 0.1.0 -**Repository URL**: https://github.com/bluk/leb128fmt -**License Type(s)**: MIT OR Apache-2.0 -### License: https://spdx.org/licenses/ -### License File: LICENSE-APACHE +## jni-macros - 0.22.4 +**Repository URL**: https://github.com/jni-rs/jni-rs +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html ``` - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] @@ -23790,7 +23843,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 +http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, @@ -23799,35 +23852,217 @@ See the License for the specific language governing permissions and limitations under the License. ``` -### License File: LICENSE-MIT +## jni-sys - 0.4.1 +**Repository URL**: https://github.com/jni-rs/jni-sys +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html ``` -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. ``` -## libc - 0.2.185 -**Repository URL**: https://github.com/rust-lang/libc +## jni-sys-macros - 0.4.1 +**Repository URL**: https://github.com/jni-rs/jni-sys **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -23904,31 +24139,10 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - -``` - -## libloading - 0.8.9 -**Repository URL**: https://github.com/nagisa/rust_libloading/ -**License Type(s)**: ISC -### License: https://spdx.org/licenses/ISC.html -``` -Copyright © 2015, Simonas Kazlauskas - -Permission to use, copy, modify, and/or distribute this software for any purpose with or without -fee is hereby granted, provided that the above copyright notice and this permission notice appear -in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS -SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, -NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - ``` -## linux-raw-sys - 0.12.1 -**Repository URL**: https://github.com/sunfishcode/linux-raw-sys +## jobserver - 0.1.35 +**Repository URL**: https://github.com/rust-lang/jobserver-rs **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -24133,65 +24347,10 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - -``` - -## litemap - 0.8.2 -**Repository URL**: https://github.com/unicode-org/icu4x -**License Type(s)**: Unicode-3.0 -### License: https://spdx.org/licenses/Unicode-3.0.html -``` -UNICODE LICENSE V3 - -COPYRIGHT AND PERMISSION NOTICE - -Copyright © 2020-2024 Unicode, Inc. - -NOTICE TO USER: Carefully read the following legal agreement. BY -DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR -SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE -TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT -DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of data files and any associated documentation (the "Data Files") or -software and any associated documentation (the "Software") to deal in the -Data Files or Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, and/or sell -copies of the Data Files or Software, and to permit persons to whom the -Data Files or Software are furnished to do so, provided that either (a) -this copyright and permission notice appear with all copies of the Data -Files or Software, or (b) this copyright and permission notice appear in -associated Documentation. - -THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF -THIRD PARTY RIGHTS. - -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE -BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, -OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA -FILES OR SOFTWARE. - -Except as contained in this notice, the name of a copyright holder shall -not be used in advertising or otherwise to promote the sale, use or other -dealings in these Data Files or Software without prior written -authorization of the copyright holder. - -SPDX-License-Identifier: Unicode-3.0 - -— - -Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. -ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. - ``` -## lock_api - 0.4.14 -**Repository URL**: https://github.com/Amanieu/parking_lot +## js-sys - 0.3.95 +**Repository URL**: https://github.com/wasm-bindgen/wasm-bindgen/tree/master/crates/js-sys **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -24396,17 +24555,44 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## log - 0.4.29 -**Repository URL**: https://github.com/rust-lang/log -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html +## jsonschema - 0.46.8 +**Repository URL**: https://github.com/Stranger6667/jsonschema +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +MIT License + +Copyright (c) 2020-2026 Dmitry Dygalo + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +## lazy_static - 1.5.0 +**Repository URL**: https://github.com/rust-lang-nursery/lazy-static.rs +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION @@ -24605,321 +24791,10 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - -``` - -## lru-slab - 0.1.2 -**Repository URL**: https://github.com/Ralith/lru-slab -**License Type(s)**: MIT OR Apache-2.0 OR Zlib -### License: https://spdx.org/licenses/ -### License File: LICENSE-APACHE -``` - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -``` - -### License File: LICENSE-MIT -``` -Copyright (c) 2024 The lru-slab Developers - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -``` - -### License File: LICENSE-ZLIB ``` -Copyright (c) 2024 The lru-slab Developers - -This software is provided 'as-is', without any express or implied warranty. In -no event will the authors be held liable for any damages arising from the use of -this software. - -Permission is granted to anyone to use this software for any purpose, including -commercial applications, and to alter it and redistribute it freely, subject to -the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim - that you wrote the original software. If you use this software in a product, an - acknowledgment in the product documentation would be appreciated but is not - required. - -2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - -3. This notice may not be removed or altered from any source distribution. -``` - -## matchit - 0.8.4 -**Repository URL**: https://github.com/ibraheemdev/matchit -**License Type(s)**: BSD-3-Clause -### License: https://spdx.org/licenses/BSD-3-Clause.html -``` -BSD 3-Clause License - -Copyright (c) 2013, Julien Schmidt -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -``` - -## matchit - 0.8.4 -**Repository URL**: https://github.com/ibraheemdev/matchit -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License -Copyright (c) 2022 Ibraheem Ahmed - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -``` - -## md-5 - 0.10.6 -**Repository URL**: https://github.com/RustCrypto/hashes +## leb128fmt - 0.1.0 +**Repository URL**: https://github.com/bluk/leb128fmt **License Type(s)**: MIT OR Apache-2.0 ### License: https://spdx.org/licenses/ ### License File: LICENSE-APACHE @@ -25118,7 +24993,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, @@ -25129,10 +25004,6 @@ limitations under the License. ### License File: LICENSE-MIT ``` -Copyright (c) 2006-2009 Graydon Hoare -Copyright (c) 2009-2013 Mozilla Foundation -Copyright (c) 2016 Artyom Pavlov - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the @@ -25158,64 +25029,107 @@ IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ``` -## memchr - 2.8.0 -**Repository URL**: https://github.com/BurntSushi/memchr -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html +## libc - 0.2.185 +**Repository URL**: https://github.com/rust-lang/libc +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html ``` -The MIT License (MIT) +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ -Copyright (c) 2015 Andrew Gallant +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +1. Definitions. -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. -``` +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. -## micromap - 0.3.0 -**Repository URL**: https://github.com/yegor256/micromap -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -Copyright (c) 2023-2026 Yegor Bugayenko +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. ``` -## mime - 0.3.17 -**Repository URL**: https://github.com/hyperium/mime +## libloading - 0.8.9 +**Repository URL**: https://github.com/nagisa/rust_libloading/ +**License Type(s)**: ISC +### License: https://spdx.org/licenses/ISC.html +``` +Copyright © 2015, Simonas Kazlauskas + +Permission to use, copy, modify, and/or distribute this software for any purpose with or without +fee is hereby granted, provided that the above copyright notice and this permission notice appear +in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS +SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. +``` + +## linux-raw-sys - 0.12.1 +**Repository URL**: https://github.com/sunfishcode/linux-raw-sys **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -25420,38 +25334,63 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## mio - 1.2.0 -**Repository URL**: https://github.com/tokio-rs/mio -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html +## litemap - 0.8.2 +**Repository URL**: https://github.com/unicode-org/icu4x +**License Type(s)**: Unicode-3.0 +### License: https://spdx.org/licenses/Unicode-3.0.html ``` -Copyright (c) 2014 Carl Lerche and other MIO contributors +UNICODE LICENSE V3 -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +COPYRIGHT AND PERMISSION NOTICE -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +Copyright © 2020-2024 Unicode, Inc. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +NOTICE TO USER: Carefully read the following legal agreement. BY +DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR +SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE +TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT +DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of data files and any associated documentation (the "Data Files") or +software and any associated documentation (the "Software") to deal in the +Data Files or Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, and/or sell +copies of the Data Files or Software, and to permit persons to whom the +Data Files or Software are furnished to do so, provided that either (a) +this copyright and permission notice appear with all copies of the Data +Files or Software, or (b) this copyright and permission notice appear in +associated Documentation. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF +THIRD PARTY RIGHTS. + +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE +BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA +FILES OR SOFTWARE. + +Except as contained in this notice, the name of a copyright holder shall +not be used in advertising or otherwise to promote the sale, use or other +dealings in these Data Files or Software without prior written +authorization of the copyright holder. + +SPDX-License-Identifier: Unicode-3.0 + +— +Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. +ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. ``` -## multimap - 0.10.1 -**Repository URL**: https://github.com/havarnov/multimap +## lock_api - 0.4.14 +**Repository URL**: https://github.com/Amanieu/parking_lot **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -25656,169 +25595,10 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - -``` - -## napi - 2.16.17 -**Repository URL**: https://github.com/napi-rs/napi-rs -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -associated documentation files (the "Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO -EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. - -``` - -## napi-build - 2.3.1 -**Repository URL**: https://github.com/napi-rs/napi-rs -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -associated documentation files (the "Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO -EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. - -``` - -## napi-derive - 2.16.13 -**Repository URL**: https://github.com/napi-rs/napi-rs -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -associated documentation files (the "Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO -EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. - -``` - -## napi-derive-backend - 1.0.75 -**Repository URL**: https://github.com/napi-rs/napi-rs -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html ``` -MIT License - -Copyright (c) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -associated documentation files (the "Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO -EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. - -``` - -## napi-sys - 2.4.0 -**Repository URL**: https://github.com/napi-rs/napi-rs -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -associated documentation files (the "Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO -EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. - -``` - -## nom - 8.0.0 -**Repository URL**: https://github.com/rust-bakery/nom -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -Copyright (c) 2014-2019 Geoffroy Couprie - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -``` - -## num - 0.4.3 -**Repository URL**: https://github.com/rust-num/num +## log - 0.4.29 +**Repository URL**: https://github.com/rust-lang/log **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -26023,303 +25803,321 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## num-bigint - 0.4.6 -**Repository URL**: https://github.com/rust-num/num-bigint -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html +## lru-slab - 0.1.2 +**Repository URL**: https://github.com/Ralith/lru-slab +**License Type(s)**: MIT OR Apache-2.0 OR Zlib +### License: https://spdx.org/licenses/ +### License File: LICENSE-APACHE ``` - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. + 1. Definitions. - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -END OF TERMS AND CONDITIONS + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -APPENDIX: How to apply the Apache License to your work. + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -``` - -## num-cmp - 0.1.0 -**Repository URL**: https://github.com/lifthrasiir/num-cmp -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + END OF TERMS AND CONDITIONS -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + APPENDIX: How to apply the Apache License to your work. -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + Copyright [yyyy] [name of copyright owner] -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + http://www.apache.org/licenses/LICENSE-2.0 -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +``` -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. +### License File: LICENSE-MIT +``` +Copyright (c) 2024 The lru-slab Developers -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` - (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and +### License File: LICENSE-ZLIB +``` +Copyright (c) 2024 The lru-slab Developers - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and +This software is provided 'as-is', without any express or implied warranty. In +no event will the authors be held liable for any damages arising from the use of +this software. - (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and +Permission is granted to anyone to use this software for any purpose, including +commercial applications, and to alter it and redistribute it freely, subject to +the following restrictions: - (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. +1. The origin of this software must not be misrepresented; you must not claim + that you wrote the original software. If you use this software in a product, an + acknowledgment in the product documentation would be appreciated but is not + required. - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. +3. This notice may not be removed or altered from any source distribution. +``` -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. +## matchit - 0.8.4 +**Repository URL**: https://github.com/ibraheemdev/matchit +**License Type(s)**: BSD-3-Clause +### License: https://spdx.org/licenses/BSD-3-Clause.html +``` +BSD 3-Clause License -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. +Copyright (c) 2013, Julien Schmidt +All rights reserved. -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. -END OF TERMS AND CONDITIONS +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. -APPENDIX: How to apply the Apache License to your work. +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +``` -Copyright [yyyy] [name of copyright owner] +## matchit - 0.8.4 +**Repository URL**: https://github.com/ibraheemdev/matchit +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at +Copyright (c) 2022 Ibraheem Ahmed -http://www.apache.org/licenses/LICENSE-2.0 +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ``` -## num-complex - 0.4.6 -**Repository URL**: https://github.com/rust-num/num-complex -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html +## md-5 - 0.11.0 +**Repository URL**: https://github.com/RustCrypto/hashes +**License Type(s)**: MIT OR Apache-2.0 +### License: https://spdx.org/licenses/ +### License File: LICENSE-APACHE ``` Apache License Version 2.0, January 2004 @@ -26515,99 +26313,103 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## num-conv - 0.2.2 -**Repository URL**: https://github.com/jhpratt/num-conv -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html +### License File: LICENSE-MIT ``` -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - - (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. +Copyright (c) 2016-2026 The RustCrypto Project Developers +Copyright (c) 2016 Artyom Pavlov +Copyright (c) 2009-2013 Mozilla Foundation +Copyright (c) 2006-2009 Graydon Hoare -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. +## memchr - 2.8.0 +**Repository URL**: https://github.com/BurntSushi/memchr +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +The MIT License (MIT) -END OF TERMS AND CONDITIONS +Copyright (c) 2015 Andrew Gallant -APPENDIX: How to apply the Apache License to your work. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -Copyright [yyyy] [name of copyright owner] +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +``` -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at +## micromap - 0.3.0 +**Repository URL**: https://github.com/yegor256/micromap +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +Copyright (c) 2023-2026 Yegor Bugayenko -http://www.apache.org/licenses/LICENSE-2.0 +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ``` -## num-integer - 0.1.46 -**Repository URL**: https://github.com/rust-num/num-integer +## mime - 0.3.17 +**Repository URL**: https://github.com/hyperium/mime **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -26812,11 +26614,36 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +``` +## mio - 1.2.0 +**Repository URL**: https://github.com/tokio-rs/mio +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` +Copyright (c) 2014 Carl Lerche and other MIO contributors -## num-iter - 0.1.45 -**Repository URL**: https://github.com/rust-num/num-iter +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +``` + +## multimap - 0.10.1 +**Repository URL**: https://github.com/havarnov/multimap **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -27021,11 +26848,162 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +``` +## napi - 2.16.17 +**Repository URL**: https://github.com/napi-rs/napi-rs +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` +MIT License -## num-rational - 0.4.2 -**Repository URL**: https://github.com/rust-num/num-rational +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +``` + +## napi-build - 2.3.1 +**Repository URL**: https://github.com/napi-rs/napi-rs +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +``` + +## napi-derive - 2.16.13 +**Repository URL**: https://github.com/napi-rs/napi-rs +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +``` + +## napi-derive-backend - 1.0.75 +**Repository URL**: https://github.com/napi-rs/napi-rs +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +``` + +## napi-sys - 2.4.0 +**Repository URL**: https://github.com/napi-rs/napi-rs +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +``` + +## nom - 8.0.0 +**Repository URL**: https://github.com/rust-bakery/nom +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +Copyright (c) 2014-2019 Geoffroy Couprie + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` + +## num - 0.4.3 +**Repository URL**: https://github.com/rust-num/num **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -27230,11 +27208,10 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## num-traits - 0.2.19 -**Repository URL**: https://github.com/rust-num/num-traits +## num-bigint - 0.4.6 +**Repository URL**: https://github.com/rust-num/num-bigint **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -27439,223 +27416,90 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## object_store - 0.13.2 -**Repository URL**: https://github.com/apache/arrow-rs-object-store +## num-cmp - 0.1.0 +**Repository URL**: https://github.com/lifthrasiir/num-cmp **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +1. Definitions. - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - END OF TERMS AND CONDITIONS +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - APPENDIX: How to apply the Apache License to your work. +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - Copyright [yyyy] [name of copyright owner] +END OF TERMS AND CONDITIONS - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +APPENDIX: How to apply the Apache License to your work. - http://www.apache.org/licenses/LICENSE-2.0 +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +Copyright [yyyy] [name of copyright owner] +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. ``` -## once_cell - 1.21.4 -**Repository URL**: https://github.com/matklad/once_cell +## num-complex - 0.4.6 +**Repository URL**: https://github.com/rust-num/num-complex **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -27860,221 +27704,10 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - -``` - -## once_cell_polyfill - 1.70.2 -**Repository URL**: https://github.com/polyfill-rs/once_cell_polyfill -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - ``` -## openinference-semantic-conventions - 0.1.1 -**Repository URL**: https://github.com/cagyirey/openinference-rs +## num-conv - 0.2.2 +**Repository URL**: https://github.com/jhpratt/num-conv **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -28151,11 +27784,10 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## openssl-probe - 0.2.1 -**Repository URL**: https://github.com/rustls/openssl-probe +## num-integer - 0.1.46 +**Repository URL**: https://github.com/rust-num/num-integer **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -28360,73 +27992,200 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## opentelemetry - 0.31.0 -**Repository URL**: https://github.com/open-telemetry/opentelemetry-rust/tree/main/opentelemetry +## num-iter - 0.1.45 +**Repository URL**: https://github.com/rust-num/num-iter **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: - (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and - (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and - (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. Copyright [yyyy] [name of copyright owner] @@ -28434,504 +28193,118 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at -http://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## opentelemetry-http - 0.31.0 -**Repository URL**: https://github.com/open-telemetry/opentelemetry-rust/tree/main/opentelemetry-http +## num-rational - 0.4.2 +**Repository URL**: https://github.com/rust-num/num-rational **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. - (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: - (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and - (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -``` - -## opentelemetry-otlp - 0.31.1 -**Repository URL**: https://github.com/open-telemetry/opentelemetry-rust/tree/main/opentelemetry-otlp -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - - (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -``` - -## opentelemetry-proto - 0.31.0 -**Repository URL**: https://github.com/open-telemetry/opentelemetry-rust/tree/main/opentelemetry-proto -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - - (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -``` - -## opentelemetry_sdk - 0.31.0 -**Repository URL**: https://github.com/open-telemetry/opentelemetry-rust/tree/main/opentelemetry-sdk -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - - (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -``` - -## ordered-float - 2.10.1 -**Repository URL**: https://github.com/reem/rust-ordered-float -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -Copyright (c) 2015 Jonathan Reem - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - -``` - -## outref - 0.5.2 -**Repository URL**: https://github.com/Nugine/outref -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) 2022 Nugine - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` - -## parking - 2.2.1 -**Repository URL**: https://github.com/smol-rs/parking -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and @@ -29035,11 +28408,10 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## parking_lot - 0.12.5 -**Repository URL**: https://github.com/Amanieu/parking_lot +## num-traits - 0.2.19 +**Repository URL**: https://github.com/rust-num/num-traits **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -29244,60 +28616,270 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## parking_lot_core - 0.9.12 -**Repository URL**: https://github.com/Amanieu/parking_lot +## object_store - 0.14.1 +**Repository URL**: https://github.com/apache/arrow-rs-object-store **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -1. Definitions. + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. + 1. Definitions. - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +``` + +## once_cell - 1.21.4 +**Repository URL**: https://github.com/matklad/once_cell +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions @@ -29453,40 +29035,219 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## pem - 3.0.6 -**Repository URL**: https://github.com/jcreekmore/pem-rs.git -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html +## once_cell_polyfill - 1.70.2 +**Repository URL**: https://github.com/polyfill-rs/once_cell_polyfill +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html ``` -The MIT License (MIT) + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -Copyright (c) 2016 Jonathan Creekmore + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + 1. Definitions. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. ``` -## percent-encoding - 2.3.2 -**Repository URL**: https://github.com/servo/rust-url/ +## openssl-probe - 0.2.1 +**Repository URL**: https://github.com/rustls/openssl-probe **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -29691,201 +29452,72 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## petgraph - 0.8.3 -**Repository URL**: https://github.com/petgraph/petgraph +## opentelemetry - 0.32.0 +**Repository URL**: https://github.com/open-telemetry/opentelemetry-rust/tree/main/opentelemetry **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] @@ -29893,18 +29525,97 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 +http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +``` + +## opentelemetry-http - 0.32.0 +**Repository URL**: https://github.com/open-telemetry/opentelemetry-rust/tree/main/opentelemetry-http +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. ``` -## pin-project - 1.1.11 -**Repository URL**: https://github.com/taiki-e/pin-project +## opentelemetry-otlp - 0.32.0 +**Repository URL**: https://github.com/open-telemetry/opentelemetry-rust/tree/main/opentelemetry-otlp **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -29981,11 +29692,218 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +``` +## opentelemetry-proto - 0.32.0 +**Repository URL**: https://github.com/open-telemetry/opentelemetry-rust/tree/main/opentelemetry-proto +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html ``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -## pin-project-internal - 1.1.11 -**Repository URL**: https://github.com/taiki-e/pin-project + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +``` + +## opentelemetry-semantic-conventions - 0.32.1 +**Repository URL**: https://github.com/open-telemetry/opentelemetry-rust/tree/main/opentelemetry-semantic-conventions **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -30062,11 +29980,10 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## pin-project-lite - 0.2.17 -**Repository URL**: https://github.com/taiki-e/pin-project-lite +## opentelemetry_sdk - 0.32.1 +**Repository URL**: https://github.com/open-telemetry/opentelemetry-rust/tree/main/opentelemetry-sdk **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -30143,11 +30060,70 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +``` + +## ordered-float - 2.10.1 +**Repository URL**: https://github.com/reem/rust-ordered-float +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +Copyright (c) 2015 Jonathan Reem + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. ``` -## pkg-config - 0.3.33 -**Repository URL**: https://github.com/rust-lang/pkg-config-rs +## outref - 0.5.2 +**Repository URL**: https://github.com/Nugine/outref +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License + +Copyright (c) 2022 Nugine + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +## parking - 2.2.1 +**Repository URL**: https://github.com/smol-rs/parking **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -30352,73 +30328,200 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## portable-atomic - 1.13.1 -**Repository URL**: https://github.com/taiki-e/portable-atomic +## parking_lot - 0.12.5 +**Repository URL**: https://github.com/Amanieu/parking_lot **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. - (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and - (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and - (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. Copyright [yyyy] [name of copyright owner] @@ -30426,282 +30529,17 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at -http://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - -``` - -## potential_utf - 0.1.5 -**Repository URL**: https://github.com/unicode-org/icu4x -**License Type(s)**: Unicode-3.0 -### License: https://spdx.org/licenses/Unicode-3.0.html -``` -UNICODE LICENSE V3 - -COPYRIGHT AND PERMISSION NOTICE - -Copyright © 2020-2024 Unicode, Inc. - -NOTICE TO USER: Carefully read the following legal agreement. BY -DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR -SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE -TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT -DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of data files and any associated documentation (the "Data Files") or -software and any associated documentation (the "Software") to deal in the -Data Files or Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, and/or sell -copies of the Data Files or Software, and to permit persons to whom the -Data Files or Software are furnished to do so, provided that either (a) -this copyright and permission notice appear with all copies of the Data -Files or Software, or (b) this copyright and permission notice appear in -associated Documentation. - -THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF -THIRD PARTY RIGHTS. - -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE -BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, -OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, -WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, -ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA -FILES OR SOFTWARE. - -Except as contained in this notice, the name of a copyright holder shall -not be used in advertising or otherwise to promote the sale, use or other -dealings in these Data Files or Software without prior written -authorization of the copyright holder. - -SPDX-License-Identifier: Unicode-3.0 - -— - -Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. -ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. - -``` - -## powerfmt - 0.2.0 -**Repository URL**: https://github.com/jhpratt/powerfmt -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2023 Jacob Pratt et al. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - ``` -## ppv-lite86 - 0.2.21 -**Repository URL**: https://github.com/cryptocorrosion/cryptocorrosion +## parking_lot_core - 0.9.12 +**Repository URL**: https://github.com/Amanieu/parking_lot **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -30893,235 +30731,100 @@ APPENDIX: How to apply the Apache License to your work. same "printed page" as the copyright notice for easier identification within third-party archives. -Copyright 2019 The CryptoCorrosion Contributors +Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +``` +## pem - 3.0.6 +**Repository URL**: https://github.com/jcreekmore/pem-rs.git +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` +The MIT License (MIT) -## prettyplease - 0.2.37 -**Repository URL**: https://github.com/dtolnay/prettyplease +Copyright (c) 2016 Jonathan Creekmore + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +## percent-encoding - 2.3.2 +**Repository URL**: https://github.com/servo/rust-url/ **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - - (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -``` - -## proc-macro2 - 1.0.106 -**Repository URL**: https://github.com/dtolnay/proc-macro2 -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - - (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -``` - -## prost - 0.14.3 -**Repository URL**: https://github.com/tokio-rs/prost -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions @@ -31277,11 +30980,10 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## prost-build - 0.14.3 -**Repository URL**: https://github.com/tokio-rs/prost +## petgraph - 0.8.3 +**Repository URL**: https://github.com/petgraph/petgraph **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -31486,11 +31188,250 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +``` +## pin-project - 1.1.11 +**Repository URL**: https://github.com/taiki-e/pin-project +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html ``` +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ -## prost-derive - 0.14.3 -**Repository URL**: https://github.com/tokio-rs/prost +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +## pin-project-internal - 1.1.11 +**Repository URL**: https://github.com/taiki-e/pin-project +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +## pin-project-lite - 0.2.17 +**Repository URL**: https://github.com/taiki-e/pin-project-lite +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +## pkg-config - 0.3.33 +**Repository URL**: https://github.com/rust-lang/pkg-config-rs **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -31695,201 +31636,72 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## prost-types - 0.14.3 -**Repository URL**: https://github.com/tokio-rs/prost +## portable-atomic - 1.13.1 +**Repository URL**: https://github.com/taiki-e/portable-atomic **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] @@ -31897,284 +31709,74 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 +http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - -``` - -## protoc-bin-vendored - 3.2.0 -**Repository URL**: https://github.com/stepancheg/rust-protoc-bin-vendored/ -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -associated documentation files (the "Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO -EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. - -``` - -## protoc-bin-vendored-linux-aarch_64 - 3.2.0 -**Repository URL**: https://github.com/stepancheg/rust-protoc-bin-vendored/ -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -associated documentation files (the "Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO -EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. - -``` - -## protoc-bin-vendored-linux-ppcle_64 - 3.2.0 -**Repository URL**: https://github.com/stepancheg/rust-protoc-bin-vendored/ -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -associated documentation files (the "Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO -EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. - -``` - -## protoc-bin-vendored-linux-s390_64 - 3.2.0 -**Repository URL**: https://github.com/stepancheg/rust-protoc-bin-vendored/ -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -associated documentation files (the "Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO -EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. - -``` - -## protoc-bin-vendored-linux-x86_32 - 3.2.0 -**Repository URL**: https://github.com/stepancheg/rust-protoc-bin-vendored/ -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -associated documentation files (the "Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO -EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. - -``` - -## protoc-bin-vendored-linux-x86_64 - 3.2.0 -**Repository URL**: https://github.com/stepancheg/rust-protoc-bin-vendored/ -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -associated documentation files (the "Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO -EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. - -``` - -## protoc-bin-vendored-macos-aarch_64 - 3.2.0 -**Repository URL**: https://github.com/stepancheg/rust-protoc-bin-vendored/ -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -associated documentation files (the "Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO -EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. - -``` - -## protoc-bin-vendored-macos-x86_64 - 3.2.0 -**Repository URL**: https://github.com/stepancheg/rust-protoc-bin-vendored/ -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -MIT License - -Copyright (c) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -associated documentation files (the "Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO -EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` -## protoc-bin-vendored-win32 - 3.2.0 -**Repository URL**: https://github.com/stepancheg/rust-protoc-bin-vendored/ -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html +## potential_utf - 0.1.5 +**Repository URL**: https://github.com/unicode-org/icu4x +**License Type(s)**: Unicode-3.0 +### License: https://spdx.org/licenses/Unicode-3.0.html ``` -MIT License - -Copyright (c) +UNICODE LICENSE V3 -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -associated documentation files (the "Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the -following conditions: +COPYRIGHT AND PERMISSION NOTICE -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. +Copyright © 2020-2024 Unicode, Inc. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO -EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. +NOTICE TO USER: Carefully read the following legal agreement. BY +DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING DATA FILES, AND/OR +SOFTWARE, YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE +TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT +DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE. -``` +Permission is hereby granted, free of charge, to any person obtaining a +copy of data files and any associated documentation (the "Data Files") or +software and any associated documentation (the "Software") to deal in the +Data Files or Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, and/or sell +copies of the Data Files or Software, and to permit persons to whom the +Data Files or Software are furnished to do so, provided that either (a) +this copyright and permission notice appear with all copies of the Data +Files or Software, or (b) this copyright and permission notice appear in +associated Documentation. -## pulldown-cmark - 0.13.4 -**Repository URL**: https://github.com/raphlinus/pulldown-cmark -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -The MIT License +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF +THIRD PARTY RIGHTS. -Copyright 2015 Google Inc. All rights reserved. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE +BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA +FILES OR SOFTWARE. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +Except as contained in this notice, the name of a copyright holder shall +not be used in advertising or otherwise to promote the sale, use or other +dealings in these Data Files or Software without prior written +authorization of the copyright holder. -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +SPDX-License-Identifier: Unicode-3.0 -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +— +Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. +ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. ``` -## pulldown-cmark-to-cmark - 22.0.0 -**Repository URL**: https://github.com/Byron/pulldown-cmark-to-cmark +## powerfmt - 0.2.0 +**Repository URL**: https://github.com/jhpratt/powerfmt **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` + Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -32363,7 +31965,7 @@ THE SOFTWARE. same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2018 "Sebastian Thiel ", "Dylan Owen ", "Alessandro Ogier ", "Zixian Cai <2891235+caizixian@users.noreply.github.com>" + Copyright 2023 Jacob Pratt et al. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -32376,289 +31978,218 @@ THE SOFTWARE. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## pyo3 - 0.29.0 -**Repository URL**: https://github.com/pyo3/pyo3 +## ppv-lite86 - 0.2.21 +**Repository URL**: https://github.com/cryptocorrosion/cryptocorrosion **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. - (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and - (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and - (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -Copyright [yyyy] [name of copyright owner] +Copyright 2019 The CryptoCorrosion Contributors Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at -http://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - -``` - -## pyo3-async-runtimes - 0.29.0 -**Repository URL**: https://github.com/PyO3/pyo3-async-runtimes -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` - Copyright (c) 2017-present PyO3 Project and Contributors. https://github.com/PyO3 - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - ``` -## pyo3-build-config - 0.29.0 -**Repository URL**: https://github.com/pyo3/pyo3 +## prettyplease - 0.2.37 +**Repository URL**: https://github.com/dtolnay/prettyplease **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -32735,11 +32266,10 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## pyo3-ffi - 0.29.0 -**Repository URL**: https://github.com/pyo3/pyo3 +## proc-macro2 - 1.0.106 +**Repository URL**: https://github.com/dtolnay/proc-macro2 **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -32816,73 +32346,200 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## pyo3-macros - 0.29.0 -**Repository URL**: https://github.com/pyo3/pyo3 +## prost - 0.14.3 +**Repository URL**: https://github.com/tokio-rs/prost **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: - (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and - (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and - (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. Copyright [yyyy] [name of copyright owner] @@ -32890,40 +32547,1640 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at -http://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## pyo3-macros-backend - 0.29.0 -**Repository URL**: https://github.com/pyo3/pyo3 +## prost-build - 0.14.3 +**Repository URL**: https://github.com/tokio-rs/prost **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +## prost-derive - 0.14.3 +**Repository URL**: https://github.com/tokio-rs/prost +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +## prost-types - 0.14.3 +**Repository URL**: https://github.com/tokio-rs/prost +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +## protoc-bin-vendored - 3.2.0 +**Repository URL**: https://github.com/stepancheg/rust-protoc-bin-vendored/ +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +``` + +## protoc-bin-vendored-linux-aarch_64 - 3.2.0 +**Repository URL**: https://github.com/stepancheg/rust-protoc-bin-vendored/ +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +``` + +## protoc-bin-vendored-linux-ppcle_64 - 3.2.0 +**Repository URL**: https://github.com/stepancheg/rust-protoc-bin-vendored/ +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +``` + +## protoc-bin-vendored-linux-s390_64 - 3.2.0 +**Repository URL**: https://github.com/stepancheg/rust-protoc-bin-vendored/ +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +``` + +## protoc-bin-vendored-linux-x86_32 - 3.2.0 +**Repository URL**: https://github.com/stepancheg/rust-protoc-bin-vendored/ +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +``` + +## protoc-bin-vendored-linux-x86_64 - 3.2.0 +**Repository URL**: https://github.com/stepancheg/rust-protoc-bin-vendored/ +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +``` + +## protoc-bin-vendored-macos-aarch_64 - 3.2.0 +**Repository URL**: https://github.com/stepancheg/rust-protoc-bin-vendored/ +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +``` + +## protoc-bin-vendored-macos-x86_64 - 3.2.0 +**Repository URL**: https://github.com/stepancheg/rust-protoc-bin-vendored/ +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +``` + +## protoc-bin-vendored-win32 - 3.2.0 +**Repository URL**: https://github.com/stepancheg/rust-protoc-bin-vendored/ +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. +``` + +## pulldown-cmark - 0.13.4 +**Repository URL**: https://github.com/raphlinus/pulldown-cmark +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +The MIT License + +Copyright 2015 Google Inc. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +``` + +## pulldown-cmark-to-cmark - 22.0.0 +**Repository URL**: https://github.com/Byron/pulldown-cmark-to-cmark +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2018 "Sebastian Thiel ", "Dylan Owen ", "Alessandro Ogier ", "Zixian Cai <2891235+caizixian@users.noreply.github.com>" + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +``` + +## pyo3 - 0.29.0 +**Repository URL**: https://github.com/pyo3/pyo3 +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +## pyo3-async-runtimes - 0.29.0 +**Repository URL**: https://github.com/PyO3/pyo3-async-runtimes +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` + Copyright (c) 2017-present PyO3 Project and Contributors. https://github.com/PyO3 + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. +``` + +## pyo3-build-config - 0.29.0 +**Repository URL**: https://github.com/pyo3/pyo3 +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +## pyo3-ffi - 0.29.0 +**Repository URL**: https://github.com/pyo3/pyo3 +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +## pyo3-macros - 0.29.0 +**Repository URL**: https://github.com/pyo3/pyo3 +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +## pyo3-macros-backend - 0.29.0 +**Repository URL**: https://github.com/pyo3/pyo3 +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). @@ -32978,7 +34235,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## pythonize - 0.29.0 @@ -33005,38 +34261,36 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` -## quick-xml - 0.39.4 +## quick-xml - 0.41.0 **Repository URL**: https://github.com/tafia/quick-xml **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -The MIT License (MIT) - -Copyright (c) 2016 Johann Tuffe - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +The MIT License (MIT) + +Copyright (c) 2016 Johann Tuffe + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ``` ## quinn - 0.11.11 @@ -33578,129 +34832,529 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI modifications, and in Source or Object form, provided that You meet the following conditions: - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +``` + +### License File: LICENSE-MIT +``` +Copyright (c) 2018 The quinn Developers + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` + +## quote - 1.0.45 +**Repository URL**: https://github.com/dtolnay/quote +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +## r-efi - 5.3.0 +**Repository URL**: https://github.com/r-efi/r-efi +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +## r-efi - 6.0.0 +**Repository URL**: https://github.com/r-efi/r-efi +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +## rand - 0.10.1 +**Repository URL**: https://github.com/rust-random/rand +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +## rand - 0.9.3 +**Repository URL**: https://github.com/rust-random/rand +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - END OF TERMS AND CONDITIONS +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - APPENDIX: How to apply the Apache License to your work. +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - Copyright [yyyy] [name of copyright owner] +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - http://www.apache.org/licenses/LICENSE-2.0 +END OF TERMS AND CONDITIONS - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -``` +APPENDIX: How to apply the Apache License to your work. -### License File: LICENSE-MIT -``` -Copyright (c) 2018 The quinn Developers +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Copyright [yyyy] [name of copyright owner] -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. ``` -## quote - 1.0.45 -**Repository URL**: https://github.com/dtolnay/quote +## rand_chacha - 0.9.0 +**Repository URL**: https://github.com/rust-random/rand **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -33770,18 +35424,405 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at -http://www.apache.org/licenses/LICENSE-2.0 +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +## rand_core - 0.10.1 +**Repository URL**: https://github.com/rust-random/rand_core +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. +``` + +## rand_core - 0.9.5 +**Repository URL**: https://github.com/rust-random/rand +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. +APPENDIX: How to apply the Apache License to your work. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. ``` -## r-efi - 5.3.0 -**Repository URL**: https://github.com/r-efi/r-efi +## rcgen - 0.13.2 +**Repository URL**: https://github.com/rustls/rcgen **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -33858,11 +35899,79 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +``` +## redis - 1.2.0 +**Repository URL**: https://github.com/redis-rs/redis-rs +**License Type(s)**: BSD-3-Clause +### License: https://spdx.org/licenses/BSD-3-Clause.html ``` +Copyright (c) 2022 by redis-rs contributors -## r-efi - 6.0.0 -**Repository URL**: https://github.com/r-efi/r-efi +Redis cluster code in parts copyright (c) 2018 by Atsushi Koge. + +Some rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * The names of the contributors may not be used to endorse or + promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +``` + +## redox_syscall - 0.5.18 +**Repository URL**: https://gitlab.redox-os.org/redox-os/syscall +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +Copyright (c) 2017 Redox OS Developers + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` + +## ref-cast - 1.0.25 +**Repository URL**: https://github.com/dtolnay/ref-cast **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -33939,11 +36048,10 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## rand - 0.10.1 -**Repository URL**: https://github.com/rust-random/rand +## ref-cast-impl - 1.0.25 +**Repository URL**: https://github.com/dtolnay/ref-cast **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -34020,73 +36128,228 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +``` +## referencing - 0.46.8 +**Repository URL**: https://github.com/Stranger6667/jsonschema +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html ``` +MIT License -## rand - 0.9.3 -**Repository URL**: https://github.com/rust-random/rand +Copyright (c) 2020-2026 Dmitry Dygalo + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +## regex - 1.12.3 +**Repository URL**: https://github.com/rust-lang/regex **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: - (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and - (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and - (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. Copyright [yyyy] [name of copyright owner] @@ -34094,80 +36357,207 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at -http://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## rand_chacha - 0.9.0 -**Repository URL**: https://github.com/rust-random/rand +## regex-automata - 0.4.14 +**Repository URL**: https://github.com/rust-lang/regex **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: - (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and - (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and - (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. Copyright [yyyy] [name of copyright owner] @@ -34175,24 +36565,23 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at -http://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## rand_core - 0.10.1 -**Repository URL**: https://github.com/rust-random/rand_core +## regex-syntax - 0.8.10 +**Repository URL**: https://github.com/rust-lang/regex **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` Apache License Version 2.0, January 2004 - https://www.apache.org/licenses/ + http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION @@ -34378,16 +36767,29 @@ APPENDIX: How to apply the Apache License to your work. same "printed page" as the copyright notice for easier identification within third-party archives. +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. ``` -## rand_core - 0.9.5 -**Repository URL**: https://github.com/rust-random/rand +## reqwest - 0.12.28 +**Repository URL**: https://github.com/seanmonstar/reqwest **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` Apache License Version 2.0, January 2004 - https://www.apache.org/licenses/ + http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION @@ -34573,353 +36975,23 @@ APPENDIX: How to apply the Apache License to your work. same "printed page" as the copyright notice for easier identification within third-party archives. -``` - -## rcgen - 0.13.2 -**Repository URL**: https://github.com/rustls/rcgen -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - - (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -``` - -## redis - 1.2.0 -**Repository URL**: https://github.com/redis-rs/redis-rs -**License Type(s)**: BSD-3-Clause -### License: https://spdx.org/licenses/BSD-3-Clause.html -``` -Copyright (c) 2022 by redis-rs contributors - -Redis cluster code in parts copyright (c) 2018 by Atsushi Koge. - -Some rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - - * The names of the contributors may not be used to endorse or - promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -``` - -## redox_syscall - 0.5.18 -**Repository URL**: https://gitlab.redox-os.org/redox-os/syscall -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html -``` -Copyright (c) 2017 Redox OS Developers - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -``` - -## ref-cast - 1.0.25 -**Repository URL**: https://github.com/dtolnay/ref-cast -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - - (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -``` - -## ref-cast-impl - 1.0.25 -**Repository URL**: https://github.com/dtolnay/ref-cast -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - - (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] +Copyright 2016 Sean McArthur Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at -http://www.apache.org/licenses/LICENSE-2.0 + http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - -``` - -## referencing - 0.46.8 -**Repository URL**: https://github.com/Stranger6667/jsonschema -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html ``` -MIT License - -Copyright (c) 2020-2026 Dmitry Dygalo - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -``` - -## regex - 1.12.3 -**Repository URL**: https://github.com/rust-lang/regex +## reqwest - 0.13.4 +**Repository URL**: https://github.com/seanmonstar/reqwest **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -35111,7 +37183,7 @@ APPENDIX: How to apply the Apache License to your work. same "printed page" as the copyright notice for easier identification within third-party archives. -Copyright [yyyy] [name of copyright owner] +Copyright 2016 Sean McArthur Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -35124,11 +37196,10 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## regex-automata - 0.4.14 -**Repository URL**: https://github.com/rust-lang/regex +## ring - 0.17.14 +**Repository URL**: https://github.com/briansmith/ring **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -35333,13 +37404,33 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +``` + +## ring - 0.17.14 +**Repository URL**: https://github.com/briansmith/ring +**License Type(s)**: ISC +### License: https://spdx.org/licenses/ISC.html +``` +Copyright 2015-2025 Brian Smith. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ``` -## regex-syntax - 0.8.10 -**Repository URL**: https://github.com/rust-lang/regex -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html +## rustc-hash - 2.1.2 +**Repository URL**: https://github.com/rust-lang/rustc-hash +**License Type(s)**: Apache-2.0 OR MIT +### License: https://spdx.org/licenses/ +### License File: LICENSE-APACHE ``` Apache License Version 2.0, January 2004 @@ -35517,36 +37608,37 @@ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS +``` -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 +### License File: LICENSE-MIT +``` +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. ``` -## reqwest - 0.12.28 -**Repository URL**: https://github.com/seanmonstar/reqwest +## rustc_version - 0.4.1 +**Repository URL**: https://github.com/djc/rustc-version-rs **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -35738,7 +37830,7 @@ APPENDIX: How to apply the Apache License to your work. same "printed page" as the copyright notice for easier identification within third-party archives. -Copyright 2016 Sean McArthur +Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -35751,11 +37843,10 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## ring - 0.17.14 -**Repository URL**: https://github.com/briansmith/ring +## rustix - 1.1.4 +**Repository URL**: https://github.com/bytecodealliance/rustix **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -35960,243 +38051,10 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - -``` - -## ring - 0.17.14 -**Repository URL**: https://github.com/briansmith/ring -**License Type(s)**: ISC -### License: https://spdx.org/licenses/ISC.html -``` -Copyright 2015-2025 Brian Smith. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -``` - -## rustc-hash - 2.1.2 -**Repository URL**: https://github.com/rust-lang/rustc-hash -**License Type(s)**: Apache-2.0 OR MIT -### License: https://spdx.org/licenses/ -### License File: LICENSE-APACHE -``` - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS ``` -### License File: LICENSE-MIT -``` -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -``` - -## rustc_version - 0.4.1 -**Repository URL**: https://github.com/djc/rustc-version-rs +## rustls - 0.23.40 +**Repository URL**: https://github.com/rustls/rustls **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -36401,11 +38259,10 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## rustix - 1.1.4 -**Repository URL**: https://github.com/bytecodealliance/rustix +## rustls-native-certs - 0.8.3 +**Repository URL**: https://github.com/rustls/rustls-native-certs **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -36610,11 +38467,10 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## rustls - 0.23.40 -**Repository URL**: https://github.com/rustls/rustls +## rustls-pki-types - 1.14.1 +**Repository URL**: https://github.com/rustls/pki-types **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -36806,7 +38662,7 @@ APPENDIX: How to apply the Apache License to your work. same "printed page" as the copyright notice for easier identification within third-party archives. -Copyright [yyyy] [name of copyright owner] +Copyright 2023 Dirkjan Ochtman Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -36819,425 +38675,294 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` -## rustls-native-certs - 0.8.3 -**Repository URL**: https://github.com/rustls/rustls-native-certs +## rustls-platform-verifier - 0.7.0 +**Repository URL**: https://github.com/rustls/rustls-platform-verifier **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. + 1. Definitions. - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. -END OF TERMS AND CONDITIONS + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. -APPENDIX: How to apply the Apache License to your work. + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. + END OF TERMS AND CONDITIONS -Copyright [yyyy] [name of copyright owner] + APPENDIX: How to apply the Apache License to your work. -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. - http://www.apache.org/licenses/LICENSE-2.0 + Copyright [yyyy] [name of copyright owner] -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. ``` -## rustls-pki-types - 1.14.1 -**Repository URL**: https://github.com/rustls/pki-types +## rustls-platform-verifier-android - 0.1.1 +**Repository URL**: https://github.com/rustls/rustls-platform-verifier **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. -Copyright 2023 Dirkjan Ochtman +Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 +http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## rustls-webpki - 0.103.13 @@ -37264,7 +38989,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. The files under third-party/chromium are licensed as described in third-party/chromium/LICENSE. - ``` ## rustversion - 1.0.22 @@ -37345,7 +39069,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## ryu - 1.0.23 @@ -37426,7 +39149,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## ryu-js - 1.0.2 @@ -37507,7 +39229,34 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +``` + +## same-file - 1.0.6 +**Repository URL**: https://github.com/BurntSushi/same-file +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +The MIT License (MIT) + +Copyright (c) 2017 Andrew Gallant + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ``` ## schannel - 0.1.29 @@ -37522,7 +39271,6 @@ Permission is hereby granted, free of charge, to any person obtaining a copy of The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## schemars - 0.8.22 @@ -37551,7 +39299,6 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## schemars_derive - 0.8.22 @@ -37580,7 +39327,6 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## scopeguard - 1.2.0 @@ -37789,7 +39535,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## security-framework - 3.7.0 @@ -37998,218 +39743,216 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +``` +## security-framework-sys - 2.17.0 +**Repository URL**: https://github.com/kornelski/rust-security-framework +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. ``` -## security-framework-sys - 2.17.0 -**Repository URL**: https://github.com/kornelski/rust-security-framework -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -``` - ## semver - 1.0.28 **Repository URL**: https://github.com/dtolnay/semver **License Type(s)**: Apache-2.0 @@ -38288,7 +40031,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## serde - 1.0.228 @@ -38369,7 +40111,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## serde_buf - 0.1.2 @@ -38684,7 +40425,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## serde_derive - 1.0.228 @@ -38765,90 +40505,88 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +``` +## serde_derive_internals - 0.29.1 +**Repository URL**: https://github.com/serde-rs/serde +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. ``` -## serde_derive_internals - 0.29.1 -**Repository URL**: https://github.com/serde-rs/serde -**License Type(s)**: Apache-2.0 -### License: https://spdx.org/licenses/Apache-2.0.html -``` -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - - (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -``` - ## serde_fmt - 1.1.0 **Repository URL**: https://github.com/KodrAus/serde_fmt.git **License Type(s)**: Apache-2.0 OR MIT @@ -39161,7 +40899,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## serde_json_canonicalizer - 0.3.2 @@ -39169,28 +40906,27 @@ limitations under the License. **License Type(s)**: MIT ### License: https://spdx.org/licenses/MIT.html ``` -MIT License - -Copyright (c) 2023 Attila Mravik - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +MIT License +Copyright (c) 2023 Attila Mravik + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ``` ## serde_path_to_error - 0.1.20 @@ -39271,7 +41007,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## serde_spanned - 1.1.1 @@ -39481,7 +41216,6 @@ limitations under the License. See the License for the specific language governing permissions and limitations under the License. - ``` ## serde_urlencoded - 0.7.1 @@ -39562,7 +41296,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## serde_yaml - 0.9.34+deprecated @@ -39643,7 +41376,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## sha1 - 0.10.6 @@ -39852,7 +41584,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## sha1_smol - 1.0.1 @@ -39860,7 +41591,7 @@ limitations under the License. **License Type(s)**: BSD-3-Clause ### License: https://spdx.org/licenses/BSD-3-Clause.html ``` -Copyright (c) . +Copyright (c) . Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -39871,7 +41602,6 @@ Redistribution and use in source and binary forms, with or without modification, 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ``` ## sha2 - 0.11.0 @@ -40080,7 +41810,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## shell-words - 1.1.1 @@ -40289,7 +42018,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## shlex - 1.3.0 @@ -40370,7 +42098,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## signal-hook-registry - 1.4.8 @@ -40579,44 +42306,10 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - -``` - -## slab - 0.4.12 -**Repository URL**: https://github.com/tokio-rs/slab -**License Type(s)**: MIT -### License: https://spdx.org/licenses/MIT.html ``` -Copyright (c) 2019 Carl Lerche - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - -``` - -## smallvec - 1.15.1 -**Repository URL**: https://github.com/servo/rust-smallvec +## simd_cesu8 - 1.2.0 +**Repository URL**: https://github.com/seancroach/simd_cesu8 **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -40821,11 +42514,122 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +``` +## simdutf8 - 0.1.5 +**Repository URL**: https://github.com/rusticstuff/simdutf8 +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html ``` +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ -## socket2 - 0.6.3 -**Repository URL**: https://github.com/rust-lang/socket2 +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +## slab - 0.4.12 +**Repository URL**: https://github.com/tokio-rs/slab +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +Copyright (c) 2019 Carl Lerche + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +``` + +## smallvec - 1.15.1 +**Repository URL**: https://github.com/servo/rust-smallvec **License Type(s)**: Apache-2.0 ### License: https://spdx.org/licenses/Apache-2.0.html ``` @@ -41030,7 +42834,214 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +``` +## socket2 - 0.6.3 +**Repository URL**: https://github.com/rust-lang/socket2 +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. ``` ## spdlog-internal - 0.2.1 @@ -41111,7 +43122,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## spdlog-macros - 0.3.1 @@ -41192,7 +43202,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## spdlog-rs - 0.5.3 @@ -41401,7 +43410,34 @@ Apache License WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +``` + +## spin - 0.10.1 +**Repository URL**: https://github.com/mvdnes/spin-rs.git +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +The MIT License (MIT) + +Copyright (c) 2014 Mathijs van de Nes + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ``` ## stable_deref_trait - 1.2.1 @@ -41610,7 +43646,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## strsim - 0.11.1 @@ -41641,7 +43676,6 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## strum - 0.27.2 @@ -41670,7 +43704,6 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## strum_macros - 0.27.2 @@ -41699,7 +43732,6 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## subtle - 2.6.1 @@ -41735,8 +43767,7 @@ TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` ## sval - 2.20.0 @@ -43600,7 +45631,6 @@ Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## switchyard-translation - 0.1.0 @@ -43812,7 +45842,6 @@ Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## syn - 2.0.117 @@ -43893,7 +45922,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## sync_wrapper - 1.0.2 @@ -43974,7 +46002,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## synstructure - 0.13.2 @@ -43989,7 +46016,6 @@ Permission is hereby granted, free of charge, to any person obtaining a copy of The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## target-lexicon - 0.13.5 @@ -44217,7 +46243,6 @@ prospectively choose to deem waived or otherwise exclude such Section(s) of the License, but only in their entirety and only with respect to the Combined Software. - ``` ## tdigest - 0.2.3 @@ -44298,7 +46323,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## tempfile - 3.27.0 @@ -44507,7 +46531,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## thiserror - 1.0.69 @@ -44588,7 +46611,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## thiserror - 2.0.18 @@ -44669,7 +46691,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## thiserror-impl - 1.0.69 @@ -44750,7 +46771,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## thiserror-impl - 2.0.18 @@ -44831,7 +46851,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## time - 0.3.53 @@ -44912,7 +46931,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## time-core - 0.1.9 @@ -44993,7 +47011,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## tinystr - 0.8.3 @@ -45047,7 +47064,6 @@ SPDX-License-Identifier: Unicode-3.0 Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. - ``` ## tinyvec - 1.11.0 @@ -45569,7 +47585,6 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## tokio-macros - 2.7.0 @@ -45599,7 +47614,6 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## tokio-rustls - 0.26.4 @@ -45808,7 +47822,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## tokio-stream - 0.1.18 @@ -45837,7 +47850,6 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## tokio-tungstenite - 0.27.0 @@ -45865,7 +47877,6 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## tokio-util - 0.7.18 @@ -45894,7 +47905,6 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## toml - 0.9.12+spec-1.1.0 @@ -46104,7 +48114,6 @@ SOFTWARE. See the License for the specific language governing permissions and limitations under the License. - ``` ## toml_datetime - 0.7.5+spec-1.1.0 @@ -46314,7 +48323,6 @@ SOFTWARE. See the License for the specific language governing permissions and limitations under the License. - ``` ## toml_edit - 0.23.10+spec-1.0.0 @@ -46524,7 +48532,6 @@ SOFTWARE. See the License for the specific language governing permissions and limitations under the License. - ``` ## toml_parser - 1.1.2+spec-1.1.0 @@ -46734,7 +48741,6 @@ SOFTWARE. See the License for the specific language governing permissions and limitations under the License. - ``` ## toml_writer - 1.1.1+spec-1.1.0 @@ -46944,7 +48950,6 @@ SOFTWARE. See the License for the specific language governing permissions and limitations under the License. - ``` ## tonic - 0.14.5 @@ -46971,7 +48976,6 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## tonic-build - 0.14.6 @@ -46998,7 +49002,6 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## tonic-prost - 0.14.5 @@ -47024,7 +49027,6 @@ LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE A EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## tonic-prost-build - 0.14.6 @@ -47050,7 +49052,32 @@ LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE A EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` +## tonic-types - 0.14.5 +**Repository URL**: https://github.com/hyperium/tonic +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +Copyright (c) 2025 Lucio Franco + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ``` ## tower - 0.5.3 @@ -47083,7 +49110,6 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## tower-http - 0.6.8 @@ -47116,7 +49142,6 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## tower-layer - 0.3.3 @@ -47149,7 +49174,6 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## tower-service - 0.3.3 @@ -47182,7 +49206,6 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## tracing - 0.1.44 @@ -47215,7 +49238,6 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## tracing-attributes - 0.1.31 @@ -47248,7 +49270,6 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## tracing-core - 0.1.36 @@ -47281,7 +49302,6 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## try-lock - 0.2.5 @@ -47310,7 +49330,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## tungstenite - 0.27.0 @@ -47519,7 +49538,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## typed-builder - 0.23.2 @@ -47728,7 +49746,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## typed-builder-macro - 0.23.2 @@ -47937,7 +49954,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## typeid - 1.0.3 @@ -48565,7 +50581,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## unicode-general-category - 1.1.0 @@ -48774,7 +50789,6 @@ limitations under the License. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## unicode-ident - 1.0.24 @@ -48855,7 +50869,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## unicode-ident - 1.0.24 @@ -48902,7 +50915,6 @@ Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in these Data Files or Software without prior written authorization of the copyright holder. - ``` ## unicode-segmentation - 1.13.2 @@ -49111,7 +51123,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## unicode-width - 0.2.2 @@ -49320,7 +51331,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## unicode-xid - 0.2.6 @@ -49589,7 +51599,6 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## untrusted - 0.9.0 @@ -49610,7 +51619,6 @@ DEALINGS IN THE SOFTWARE. // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - ``` ## url - 2.5.8 @@ -49819,7 +51827,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## utf-8 - 0.7.6 @@ -49900,7 +51907,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## utf8_iter - 1.0.4 @@ -50110,7 +52116,6 @@ limitations under the License. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## utf8parse - 0.2.2 @@ -50191,7 +52196,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## uuid - 1.18.1 @@ -50400,7 +52404,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## uuid-simd - 0.8.0 @@ -50426,7 +52429,6 @@ LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE A EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## value-bag - 1.13.0 @@ -50635,7 +52637,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## value-bag-serde1 - 1.13.0 @@ -51312,7 +53313,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## vsimd - 0.8.0 @@ -51338,7 +53338,34 @@ LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE A EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` +## walkdir - 2.5.0 +**Repository URL**: https://github.com/BurntSushi/walkdir +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +The MIT License (MIT) + +Copyright (c) 2015 Andrew Gallant + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ``` ## want - 0.3.1 @@ -51366,7 +53393,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## wasi - 0.11.1+wasi-snapshot-preview1 @@ -51575,7 +53601,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## wasip2 - 1.0.2+wasi-0.2.9 @@ -51656,7 +53681,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## wasip3 - 0.4.0+wasi-0.3.0-rc-2026-01-06 @@ -51737,7 +53761,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## wasm-bindgen - 0.2.118 @@ -51946,7 +53969,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## wasm-bindgen-futures - 0.4.68 @@ -52155,7 +54177,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## wasm-bindgen-macro - 0.2.118 @@ -52364,7 +54385,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## wasm-bindgen-macro-support - 0.2.118 @@ -52573,7 +54593,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## wasm-bindgen-shared - 0.2.118 @@ -52782,7 +54801,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## wasm-encoder - 0.244.0 @@ -52881,7 +54899,86 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +``` +## wasm-streams - 0.5.0 +**Repository URL**: https://github.com/MattiasBuelens/wasm-streams/ +**License Type(s)**: Apache-2.0 +### License: https://spdx.org/licenses/Apache-2.0.html +``` +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. ``` ## wasmparser - 0.244.0 @@ -53099,7 +55196,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## web-time - 1.1.0 @@ -53308,7 +55404,74 @@ limitations under the License. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +``` + +## webpki-root-certs - 1.0.9 +**Repository URL**: https://github.com/rustls/webpki-roots +**License Type(s)**: CDLA-Permissive-2.0 +### License: https://spdx.org/licenses/CDLA-Permissive-2.0.html +``` +# Community Data License Agreement - Permissive - Version 2.0 + +This is the Community Data License Agreement - Permissive, Version +2.0 (the "agreement"). Data Provider(s) and Data Recipient(s) agree +as follows: + +## 1. Provision of the Data + +1.1. A Data Recipient may use, modify, and share the Data made +available by Data Provider(s) under this agreement if that Data +Recipient follows the terms of this agreement. + +1.2. This agreement does not impose any restriction on a Data +Recipient's use, modification, or sharing of any portions of the +Data that are in the public domain or that may be used, modified, +or shared under any other legal exception or limitation. + +## 2. Conditions for Sharing Data + +2.1. A Data Recipient may share Data, with or without modifications, so +long as the Data Recipient makes available the text of this agreement +with the shared Data. + +## 3. No Restrictions on Results + +3.1. This agreement does not impose any restriction or obligations +with respect to the use, modification, or sharing of Results. + +## 4. No Warranty; Limitation of Liability + +4.1. All Data Recipients receive the Data subject to the following +terms: + +THE DATA IS PROVIDED ON AN "AS IS" BASIS, WITHOUT REPRESENTATIONS, +WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED +INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, +NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + +NO DATA PROVIDER SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING +WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE DATA OR RESULTS, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +## 5. Definitions + +5.1. "Data" means the material received by a Data Recipient under +this agreement. + +5.2. "Data Provider" means any person who is the source of Data +provided under this agreement and in reliance on a Data Recipient's +agreement to its terms. +5.3. "Data Recipient" means any person who receives Data directly +or indirectly from a Data Provider and agrees to the terms of this +agreement. + +5.4. "Results" means any outcome obtained by computational analysis +of Data, including for example machine learning models and models' +insights. ``` ## winapi - 0.3.9 @@ -53517,7 +55680,6 @@ limitations under the License. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## winapi-i686-pc-windows-gnu - 0.4.0 @@ -53598,7 +55760,34 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +``` + +## winapi-util - 0.1.11 +**Repository URL**: https://github.com/BurntSushi/winapi-util +**License Type(s)**: MIT +### License: https://spdx.org/licenses/MIT.html +``` +The MIT License (MIT) + +Copyright (c) 2017 Andrew Gallant + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ``` ## winapi-x86_64-pc-windows-gnu - 0.4.0 @@ -53679,7 +55868,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## windows-core - 0.62.2 @@ -53888,7 +56076,6 @@ limitations under the License. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## windows-implement - 0.60.2 @@ -54097,7 +56284,6 @@ limitations under the License. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## windows-interface - 0.59.3 @@ -54306,7 +56492,6 @@ limitations under the License. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## windows-link - 0.2.1 @@ -54515,7 +56700,6 @@ limitations under the License. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## windows-result - 0.4.1 @@ -54724,7 +56908,6 @@ limitations under the License. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## windows-strings - 0.5.1 @@ -54933,7 +57116,6 @@ limitations under the License. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## windows-sys - 0.52.0 @@ -55142,7 +57324,6 @@ limitations under the License. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## windows-sys - 0.59.0 @@ -55351,7 +57532,6 @@ limitations under the License. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## windows-sys - 0.61.2 @@ -55560,7 +57740,6 @@ limitations under the License. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## windows-targets - 0.52.6 @@ -55769,7 +57948,6 @@ limitations under the License. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## windows_aarch64_gnullvm - 0.52.6 @@ -55978,7 +58156,6 @@ limitations under the License. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## windows_aarch64_msvc - 0.52.6 @@ -56187,7 +58364,6 @@ limitations under the License. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## windows_i686_gnu - 0.52.6 @@ -56396,7 +58572,6 @@ limitations under the License. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## windows_i686_gnullvm - 0.52.6 @@ -56605,7 +58780,6 @@ limitations under the License. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## windows_i686_msvc - 0.52.6 @@ -56814,7 +58988,6 @@ limitations under the License. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## windows_x86_64_gnu - 0.52.6 @@ -57023,7 +59196,6 @@ limitations under the License. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## windows_x86_64_gnullvm - 0.52.6 @@ -57232,7 +59404,6 @@ limitations under the License. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## windows_x86_64_msvc - 0.52.6 @@ -57441,7 +59612,6 @@ limitations under the License. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## winnow - 0.7.15 @@ -57467,7 +59637,6 @@ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## winnow - 1.0.1 @@ -57493,7 +59662,6 @@ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## wit-bindgen - 0.51.0 @@ -57702,7 +59870,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## wit-bindgen-core - 0.51.0 @@ -59154,7 +61321,6 @@ SPDX-License-Identifier: Unicode-3.0 Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. - ``` ## xxhash-rust - 0.8.15 @@ -59185,7 +61351,6 @@ SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## yasna - 0.5.2 @@ -59266,7 +61431,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## yoke - 0.8.2 @@ -59320,7 +61484,6 @@ SPDX-License-Identifier: Unicode-3.0 Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. - ``` ## yoke-derive - 0.8.2 @@ -59374,7 +61537,6 @@ SPDX-License-Identifier: Unicode-3.0 Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. - ``` ## zerocopy - 0.8.48 @@ -59584,7 +61746,6 @@ ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation a See the License for the specific language governing permissions and limitations under the License. - ``` ## zerocopy-derive - 0.8.48 @@ -59906,7 +62067,6 @@ SPDX-License-Identifier: Unicode-3.0 Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. - ``` ## zerofrom-derive - 0.1.7 @@ -59960,7 +62120,6 @@ SPDX-License-Identifier: Unicode-3.0 Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. - ``` ## zeroize - 1.8.2 @@ -60170,7 +62329,6 @@ ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation a WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## zerotrie - 0.2.4 @@ -60224,7 +62382,6 @@ SPDX-License-Identifier: Unicode-3.0 Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. - ``` ## zerovec - 0.11.6 @@ -60278,7 +62435,6 @@ SPDX-License-Identifier: Unicode-3.0 Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. - ``` ## zerovec-derive - 0.11.3 @@ -60332,7 +62488,6 @@ SPDX-License-Identifier: Unicode-3.0 Portions of ICU4X may have been adapted from ICU4C and/or ICU4J. ICU 1.8.1 to ICU 57.1 © 1995-2016 International Business Machines Corporation and others. - ``` ## zmij - 1.0.21 @@ -60363,7 +62518,6 @@ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## zstd - 0.13.3 @@ -60379,7 +62533,6 @@ Permission is hereby granted, free of charge, to any person obtaining a copy of The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ``` ## zstd-safe - 7.2.4 @@ -60460,7 +62613,6 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` ## zstd-sys - 2.0.16+zstd.1.5.7 @@ -60541,5 +62693,4 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - ``` diff --git a/Cargo.lock b/Cargo.lock index 2b8f07df3..74cedc04a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -176,6 +176,29 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "aws-lc-rs" +version = "1.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00bdb5da18dac48ca2cc7cd4a98e533e8635a58e2361d13a1a4ee3888e0d72f1" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.43.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43103168cc76fe62678a375e722fc9cb3a0146159ac5828bc4f0dfd755c2224c" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", + "pkg-config", +] + [[package]] name = "axum" version = "0.8.9" @@ -446,6 +469,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" +[[package]] +name = "cmake" +version = "0.1.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" +dependencies = [ + "cc", +] + [[package]] name = "colorchoice" version = "1.0.5" @@ -549,6 +581,16 @@ dependencies = [ "libc", ] +[[package]] +name = "crc-fast" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e75b2483e97a5a7da73ac68a05b629f9c53cff58d8ed1c77866079e18b00dba5" +dependencies = [ + "digest 0.10.7", + "spin", +] + [[package]] name = "crossbeam" version = "0.8.4" @@ -690,6 +732,12 @@ dependencies = [ "syn", ] +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + [[package]] name = "dyn-clone" version = "1.0.20" @@ -871,6 +919,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + [[package]] name = "futures" version = "0.3.32" @@ -1371,12 +1425,70 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" +[[package]] +name = "jni" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +dependencies = [ + "cfg-if", + "combine", + "jni-macros", + "jni-sys", + "log", + "simd_cesu8", + "thiserror 2.0.18", + "walkdir", + "windows-link", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "simd_cesu8", + "syn", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn", +] + [[package]] name = "jobserver" version = "0.1.35" @@ -1495,12 +1607,12 @@ checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "md-5" -version = "0.10.6" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +checksum = "69b6441f590336821bb897fb28fc622898ccceb1d6cea3fde5ea86b090c4de98" dependencies = [ "cfg-if", - "digest 0.10.7", + "digest 0.11.2", ] [[package]] @@ -1613,11 +1725,11 @@ dependencies = [ "nemo-relay-types", "nemo-relay-worker-proto", "object_store", - "openinference-semantic-conventions", "opentelemetry", "opentelemetry-otlp", + "opentelemetry-semantic-conventions", "opentelemetry_sdk", - "reqwest", + "reqwest 0.12.28", "schemars", "semver", "serde", @@ -1690,7 +1802,7 @@ dependencies = [ "percent-encoding", "rcgen", "regex", - "reqwest", + "reqwest 0.12.28", "ring", "rustls", "semver", @@ -1803,7 +1915,7 @@ dependencies = [ "axum", "futures-util", "nemo-relay", - "reqwest", + "reqwest 0.12.28", "schemars", "serde", "serde_json", @@ -1952,14 +2064,16 @@ dependencies = [ [[package]] name = "object_store" -version = "0.13.2" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622acbc9100d3c10e2ee15804b0caa40e55c933d5aa53814cd520805b7958a49" +checksum = "d354792e39fa5f0009e47623cf8b15b099bf9a652fa55c6f817fe28ac84fea50" dependencies = [ "async-trait", + "aws-lc-rs", "base64", "bytes", "chrono", + "crc-fast", "form_urlencoded", "futures-channel", "futures-core", @@ -1968,14 +2082,14 @@ dependencies = [ "http-body-util", "humantime", "hyper", - "itertools", + "itertools 0.15.0", "md-5", "parking_lot", "percent-encoding", "quick-xml", "rand 0.10.1", - "reqwest", - "ring", + "reqwest 0.13.4", + "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", @@ -1999,15 +2113,6 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" -[[package]] -name = "openinference-semantic-conventions" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eea63d12c54e611c8b28e031ac1d6d8778c7f399dc1f661da9260a543676a07d" -dependencies = [ - "opentelemetry", -] - [[package]] name = "openssl-probe" version = "0.2.1" @@ -2016,36 +2121,35 @@ checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] name = "opentelemetry" -version = "0.31.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b84bcd6ae87133e903af7ef497404dda70c60d0ea14895fc8a5e6722754fc2a0" +checksum = "b0142c63252a9e054e68a4c61a5778f7b14f576274d593f8ce883d191a099682" dependencies = [ "futures-core", "futures-sink", "js-sys", "pin-project-lite", "thiserror 2.0.18", - "tracing", ] [[package]] name = "opentelemetry-http" -version = "0.31.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a6d09a73194e6b66df7c8f1b680f156d916a1a942abf2de06823dd02b7855d" +checksum = "5683015d09e2df236ef005b17f6f196f0d5f6313c4fa43a7b6a53b52776e4331" dependencies = [ "async-trait", "bytes", "http", "opentelemetry", - "reqwest", + "reqwest 0.13.4", ] [[package]] name = "opentelemetry-otlp" -version = "0.31.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f69cd6acbb9af919df949cd1ec9e5e7fdc2ef15d234b6b795aaa525cc02f71f" +checksum = "9966929966d17620d7c316c643ba62631826e10021409357772d5eea84f62c35" dependencies = [ "http", "opentelemetry", @@ -2053,17 +2157,18 @@ dependencies = [ "opentelemetry-proto", "opentelemetry_sdk", "prost", - "reqwest", + "reqwest 0.13.4", "thiserror 2.0.18", "tokio", "tonic", + "tonic-types", ] [[package]] name = "opentelemetry-proto" -version = "0.31.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7175df06de5eaee9909d4805a3d07e28bb752c34cab57fa9cff549da596b30f" +checksum = "56d658ba1faf63f7b9c492cfbe6e0ec365440a16132d3270c1065f7b33f1b638" dependencies = [ "opentelemetry", "opentelemetry_sdk", @@ -2072,21 +2177,27 @@ dependencies = [ "tonic-prost", ] +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c913ac17a6c451661ee255f4625d143e51647ae78ebd969b75e41c4442f4fe47" + [[package]] name = "opentelemetry_sdk" -version = "0.31.0" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ae4f5991976fd48df6d843de219ca6d31b01daaab2dad5af2badeded372bd" +checksum = "9b59f80e1ac4d5ff7a2db8fb6c80badb7f0f3f858211fba08dd9aaec750894f9" dependencies = [ "futures-channel", "futures-executor", "futures-util", "opentelemetry", "percent-encoding", + "portable-atomic", "rand 0.9.3", "thiserror 2.0.18", "tokio", - "tokio-stream", ] [[package]] @@ -2259,7 +2370,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7" dependencies = [ "heck", - "itertools", + "itertools 0.14.0", "log", "multimap", "petgraph", @@ -2280,7 +2391,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" dependencies = [ "anyhow", - "itertools", + "itertools 0.14.0", "proc-macro2", "quote", "syn", @@ -2462,9 +2573,9 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.39.4" +version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdcc8dd4e2f670d309a5f0e83fe36dfdc05af317008fea29144da1a2ac858e5e" +checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1" dependencies = [ "memchr", "serde", @@ -2496,6 +2607,7 @@ version = "0.11.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fcb935c5bec503c2f0e306bdd3e58bb9029dcb14fa8d9ac76e3a5256ac0763e" dependencies = [ + "aws-lc-rs", "bytes", "getrandom 0.3.4", "lru-slab", @@ -2717,7 +2829,6 @@ dependencies = [ "base64", "bytes", "encoding_rs", - "futures-channel", "futures-core", "futures-util", "h2", @@ -2749,7 +2860,47 @@ dependencies = [ "url", "wasm-bindgen", "wasm-bindgen-futures", - "wasm-streams", + "wasm-streams 0.4.2", + "web-sys", +] + +[[package]] +name = "reqwest" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "rustls-platform-verifier", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams 0.5.0", "web-sys", ] @@ -2801,6 +2952,8 @@ version = "0.23.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" dependencies = [ + "aws-lc-rs", + "log", "once_cell", "ring", "rustls-pki-types", @@ -2831,12 +2984,40 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls-platform-verifier" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0" +dependencies = [ + "core-foundation", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + [[package]] name = "rustls-webpki" version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ + "aws-lc-rs", "ring", "rustls-pki-types", "untrusted", @@ -2860,6 +3041,15 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd29631678d6fb0903b69223673e122c32e9ae559d0960a38d574695ebc0ea15" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "schannel" version = "0.1.29" @@ -3106,6 +3296,22 @@ dependencies = [ "libc", ] +[[package]] +name = "simd_cesu8" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520" +dependencies = [ + "rustc_version", + "simdutf8", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + [[package]] name = "slab" version = "0.4.12" @@ -3172,6 +3378,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "spin" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "023a211cb3138dbc438680b32560ad89f699977624c9f8dbb95a47d5b4c07dd3" + [[package]] name = "stable_deref_trait" version = "1.2.1" @@ -3605,9 +3817,11 @@ dependencies = [ "hyper-util", "percent-encoding", "pin-project", + "rustls-native-certs", "socket2", "sync_wrapper", "tokio", + "tokio-rustls", "tokio-stream", "tower", "tower-layer", @@ -3654,6 +3868,17 @@ dependencies = [ "tonic-build", ] +[[package]] +name = "tonic-types" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a875a902255423d34c1f20838ab374126db8eb41625b7947a1d54113b0b7399" +dependencies = [ + "prost", + "prost-types", + "tonic", +] + [[package]] name = "tower" version = "0.5.3" @@ -3941,6 +4166,16 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.1" @@ -4064,6 +4299,19 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "wasmparser" version = "0.244.0" @@ -4096,6 +4344,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-root-certs" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b96554aa2acc8ccdb7e1c9a58a7a68dd5d13bccc69cd124cb09406db612a1c9b" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "winapi" version = "0.3.9" @@ -4112,6 +4369,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" diff --git a/Cargo.toml b/Cargo.toml index c77e6e40c..c62ce5393 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,8 +38,9 @@ nemo-relay-switchyard = { version = "0.7.0", path = "crates/switchyard" } switchyard-translation = "0.1.0" nemo-relay-ffi = { version = "0.7.0", path = "crates/ffi" } nemo-relay-cli = { version = "0.7.0", path = "crates/cli" } -opentelemetry = { version = "0.31", default-features = false } -opentelemetry_sdk = { version = "0.31", default-features = false } +opentelemetry = { version = "0.32", default-features = false } +opentelemetry-semantic-conventions = { version = "0.32.1", default-features = false, features = ["semconv_experimental"] } +opentelemetry_sdk = { version = "0.32.1", default-features = false } uuid = "=1.18.1" [workspace.lints.rust] diff --git a/README.md b/README.md index 237fec0bb..eb3547a4e 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ evaluation products, see [the Ecosystem guide](https://docs.nvidia.com/nemo/rela | Instrument app-owned LLM or tool calls | [Quick Start Application](https://docs.nvidia.com/nemo/relay/getting-started/quick-start) | | Use LangChain, LangGraph, Deep Agents, or OpenClaw | [Supported Integrations](https://docs.nvidia.com/nemo/relay/supported-integrations/about) | | Build a framework or provider integration | [Integrate into Frameworks](https://docs.nvidia.com/nemo/relay/integrate-into-frameworks/about) | -| Export ATOF, ATIF, OpenTelemetry, or OpenInference | [Observability Plugin](https://docs.nvidia.com/nemo/relay/configure-plugins/observability/about) | +| Export ATOF, ATIF, or typed OpenTelemetry projections | [Observability Plugin](https://docs.nvidia.com/nemo/relay/configure-plugins/observability/about) | | Package reusable middleware or exporters | [Build Plugins](https://docs.nvidia.com/nemo/relay/build-plugins/about) | | Develop or test this repository from source | [CONTRIBUTING.md](CONTRIBUTING.md) | @@ -196,8 +196,8 @@ and agent-specific diagnostics. > [!TIP] > Start by trusting the raw Agent Trajectory Observability Format (ATOF) JSONL. > It shows the lifecycle events Relay actually captured before anything is -> translated into Agent Trajectory Interchange Format (ATIF), OpenTelemetry, or -> OpenInference output. +> translated into Agent Trajectory Interchange Format (ATIF) or typed +> OpenTelemetry output, including the OpenInference projection. ## Quick Start Applications @@ -247,8 +247,8 @@ Relay gives those systems: route, retry, or replace execution. - **Plugins** so reusable observability, guardrail, adaptive, and exporter behavior can be turned on from configuration. -- **Events and subscribers** so raw ATOF, normalized ATIF, OpenTelemetry, and - OpenInference output all come from the same runtime stream. +- **Events and subscribers** so raw ATOF, normalized ATIF, and typed + OpenTelemetry projections all come from the same runtime stream. Relay does not replace frameworks, model provider, application logic, observability backend, or guardrail authoring system. It gives those systems a diff --git a/about.toml b/about.toml index 3a8135a2e..1825c5ab3 100644 --- a/about.toml +++ b/about.toml @@ -9,6 +9,7 @@ accepted = [ "Apache-2.0", "BSD-3-Clause", "BSL-1.0", + "CDLA-Permissive-2.0", "ISC", "MIT", "MIT-0", diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index c80ff9b07..e04210891 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -26,7 +26,7 @@ atof-streaming = ["nemo-relay/atof-streaming"] switchyard = ["dep:nemo-relay-switchyard"] [dependencies] -nemo-relay = { workspace = true, features = ["guardrails-remote", "object-store", "otel", "openinference", "worker-grpc"] } +nemo-relay = { workspace = true, features = ["guardrails-remote", "object-store", "worker-grpc"] } nemo-relay-adaptive = { workspace = true, features = ["redis-backend"] } nemo-relay-pii-redaction.workspace = true nemo-relay-switchyard = { workspace = true, optional = true, features = ["schema"] } diff --git a/crates/cli/README.md b/crates/cli/README.md index 443d3003d..3d0ea60d3 100644 --- a/crates/cli/README.md +++ b/crates/cli/README.md @@ -34,7 +34,7 @@ The CLI is designed for these tasks: - **Configure transparent runs interactively**: Use the setup wizard to write project or user configuration for supported agents. - **Export local sessions**: Write ATIF trajectory files, ATOF event JSONL - streams, or OpenInference spans from one shared config model. + streams, or typed OpenTelemetry spans from one shared config model. - **Diagnose setup readiness**: Check config layers, `plugins.toml` discovery, agent binaries, persistent coding-agent integrations, hook status, observability outputs, and shell completions with `nemo-relay doctor`. diff --git a/crates/cli/src/diagnostics/mod.rs b/crates/cli/src/diagnostics/mod.rs index 0a3e1560d..18b45161f 100644 --- a/crates/cli/src/diagnostics/mod.rs +++ b/crates/cli/src/diagnostics/mod.rs @@ -566,11 +566,7 @@ async fn collect_observability_component_checks(checks: &mut Vec, config: if let Some(check) = observability_file_exporter_check(config, "atif") { checks.push(check); } - for section in ["opentelemetry", "openinference"] { - if let Some(check) = observability_http_exporter_check(config, section).await { - checks.push(check); - } - } + checks.extend(observability_http_exporter_checks(config).await); if section_enabled(config, "atof") && !atof_stream_sinks(config).is_empty() { if atof_streaming_supported() { checks.extend(observability_atof_stream_checks(config).await); @@ -642,23 +638,46 @@ fn observability_file_exporter_check(config: &Value, section: &str) -> Option Option { - if !section_enabled(config, section) { - return None; +async fn observability_http_exporter_checks(config: &Value) -> Vec { + if !section_enabled(config, "opentelemetry") { + return Vec::new(); } - let label = if section == "opentelemetry" { - "OpenTelemetry endpoint" - } else { - "OpenInference endpoint" + let Some(endpoints) = config + .get("opentelemetry") + .and_then(|section| section.get("endpoints")) + .and_then(Value::as_array) + else { + return Vec::new(); }; - Some(match section_endpoint(config, section) { - Some(endpoint) => probe_http_named(label, &endpoint).await, - None => Check { - name: label, - status: Status::Info, - details: "enabled; using exporter default endpoint".into(), - }, - }) + let mut checks = Vec::with_capacity(endpoints.len()); + for (index, endpoint) in endpoints.iter().enumerate() { + let endpoint_type = endpoint + .get("type") + .and_then(Value::as_str) + .unwrap_or("unknown"); + let label = "OpenTelemetry endpoint"; + let transport = endpoint + .get("transport") + .and_then(Value::as_str) + .unwrap_or("http_binary"); + checks.push(match endpoint.get("endpoint").and_then(Value::as_str) { + Some(url) => { + let mut check = if transport == "grpc" { + probe_tcp_named(label, url).await + } else { + probe_http_named(label, url).await + }; + check.details = format!("endpoints[{index}] ({endpoint_type}): {}", check.details); + check + } + None => Check { + name: label, + status: Status::Fail, + details: format!("endpoints[{index}] ({endpoint_type}): endpoint is required"), + }, + }); + } + checks } fn observability_component_config(plugin_value: &Value) -> Option<&Value> { @@ -775,14 +794,6 @@ fn section_output_directory(config: &Value, section: &str) -> Option { .map(PathBuf::from) } -fn section_endpoint(config: &Value, section: &str) -> Option { - config - .get(section) - .and_then(|section| section.get("endpoint")) - .and_then(Value::as_str) - .map(str::to_string) -} - fn atof_stream_sinks(config: &Value) -> Vec<(usize, &Value)> { config .get("atof") diff --git a/crates/cli/src/diagnostics/probes.rs b/crates/cli/src/diagnostics/probes.rs index cbfe5df6a..52149779e 100644 --- a/crates/cli/src/diagnostics/probes.rs +++ b/crates/cli/src/diagnostics/probes.rs @@ -72,3 +72,104 @@ pub(super) async fn probe_http_named(name: &'static str, url: &str) -> Check { }, } } + +pub(super) async fn probe_tcp_named(name: &'static str, endpoint: &str) -> Check { + let parsed = match reqwest::Url::parse(endpoint) { + Ok(parsed) => parsed, + Err(error) => { + return Check { + name, + status: Status::Fail, + details: format!("{endpoint}: invalid gRPC endpoint: {error}"), + }; + } + }; + let Some(host) = parsed.host_str() else { + return Check { + name, + status: Status::Fail, + details: format!("{endpoint}: gRPC endpoint has no host"), + }; + }; + let port = grpc_endpoint_port(&parsed); + match tokio::time::timeout( + NETWORK_TIMEOUT, + tokio::net::TcpStream::connect((host, port)), + ) + .await + { + Ok(Ok(_)) => Check { + name, + status: Status::Pass, + details: format!("{endpoint} (gRPC TCP connection succeeded)"), + }, + Ok(Err(error)) => Check { + name, + status: Status::Fail, + details: format!("{endpoint}: gRPC TCP connection failed: {error}"), + }, + Err(_) => Check { + name, + status: Status::Fail, + details: format!("{endpoint}: gRPC TCP connection timed out"), + }, + } +} + +fn grpc_endpoint_port(endpoint: &reqwest::Url) -> u16 { + endpoint.port().unwrap_or_else(|| { + if endpoint.scheme() == "https" { + 443 + } else { + 4317 + } + }) +} + +#[cfg(test)] +mod tcp_tests { + use super::*; + + #[tokio::test] + async fn grpc_probe_uses_tcp_connectivity() { + let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap(); + let endpoint = format!("http://{}", listener.local_addr().unwrap()); + let check = probe_tcp_named("OpenTelemetry endpoint", &endpoint).await; + assert_eq!(check.status, Status::Pass); + assert!(check.details.contains("gRPC TCP connection succeeded")); + } + + #[tokio::test] + async fn grpc_probe_reports_invalid_hostless_and_refused_endpoints() { + let invalid = probe_tcp_named("OpenTelemetry endpoint", "not a url").await; + assert_eq!(invalid.status, Status::Fail); + assert!(invalid.details.contains("invalid gRPC endpoint")); + + let hostless = probe_tcp_named("OpenTelemetry endpoint", "file:///tmp/collector").await; + assert_eq!(hostless.status, Status::Fail); + assert!(hostless.details.contains("has no host")); + + let listener = std::net::TcpListener::bind("127.0.0.1:0").unwrap(); + let endpoint = format!("http://{}", listener.local_addr().unwrap()); + drop(listener); + let refused = probe_tcp_named("OpenTelemetry endpoint", &endpoint).await; + assert_eq!(refused.status, Status::Fail); + assert!(refused.details.contains("connection failed")); + } + + #[test] + fn grpc_probe_uses_tls_and_otlp_default_ports() { + assert_eq!( + grpc_endpoint_port(&reqwest::Url::parse("https://collector.example.com").unwrap()), + 443 + ); + assert_eq!( + grpc_endpoint_port(&reqwest::Url::parse("http://collector.example.com").unwrap()), + 4317 + ); + assert_eq!( + grpc_endpoint_port(&reqwest::Url::parse("https://collector.example.com:8443").unwrap()), + 8443 + ); + } +} diff --git a/crates/cli/src/error.rs b/crates/cli/src/error.rs index 4e6e50e4a..73c01370d 100644 --- a/crates/cli/src/error.rs +++ b/crates/cli/src/error.rs @@ -65,8 +65,6 @@ pub(crate) enum CliError { }, #[error("NeMo Relay runtime error: {0}")] Flow(#[from] nemo_relay::error::FlowError), - #[error("openinference error: {0}")] - OpenInference(#[from] nemo_relay::observability::openinference::OpenInferenceError), } impl CliError { @@ -87,7 +85,6 @@ impl CliError { Self::PluginLifecycle { .. } => "plugin_lifecycle", Self::Flow(FlowError::GuardrailRejected(_)) => "guardrail_rejected", Self::Flow(_) => "runtime", - Self::OpenInference(_) => "openinference", } } @@ -141,8 +138,7 @@ impl IntoResponse for CliError { | Self::Install(_) | Self::Config(_) | Self::Launch(_) - | Self::Flow(_) - | Self::OpenInference(_), + | Self::Flow(_), ) => StatusCode::INTERNAL_SERVER_ERROR, (false, _) => StatusCode::INTERNAL_SERVER_ERROR, }; diff --git a/crates/cli/src/gateway/tls.rs b/crates/cli/src/gateway/tls.rs index 850fad57a..3b791593e 100644 --- a/crates/cli/src/gateway/tls.rs +++ b/crates/cli/src/gateway/tls.rs @@ -56,6 +56,7 @@ impl RelayTlsIdentity { } pub(crate) fn server_config(&self) -> Result, String> { + ensure_crypto_provider(); let certificate = CertificateDer::from(self.record.certificate_der.clone()); let key = PrivateKeyDer::Pkcs8(PrivatePkcs8KeyDer::from( self.record.private_key_der.clone(), @@ -68,6 +69,7 @@ impl RelayTlsIdentity { } pub(crate) fn client_config(&self) -> Result, String> { + ensure_crypto_provider(); let mut roots = rustls::RootCertStore::empty(); roots .add(CertificateDer::from(self.record.certificate_der.clone())) @@ -80,6 +82,10 @@ impl RelayTlsIdentity { } } +fn ensure_crypto_provider() { + let _ = rustls::crypto::ring::default_provider().install_default(); +} + fn identity_path() -> Result { Ok(crate::bootstrap::state::state_dir()?.join(IDENTITY_FILE)) } diff --git a/crates/cli/src/process/launcher.rs b/crates/cli/src/process/launcher.rs index 4b8f497a7..328964506 100644 --- a/crates/cli/src/process/launcher.rs +++ b/crates/cli/src/process/launcher.rs @@ -5,6 +5,7 @@ use std::path::{Path, PathBuf}; use std::process::ExitCode; use std::time::Duration; +use nemo_relay::observability::OpenTelemetryType; use nemo_relay::observability::plugin_component::{ AtifStorageConfig, AtofSinkSectionConfig, OBSERVABILITY_PLUGIN_KIND, ObservabilityConfig, }; @@ -693,30 +694,17 @@ fn observability_exporter_destinations(config: &ObservabilityConfig) -> Vec "full", + OpenTelemetryType::GenAi => "gen_ai", + OpenTelemetryType::OpenInference => "openinference", + }; + destinations.push(format!( + "OpenTelemetry {endpoint_type} {}", + sanitized_url(&endpoint.endpoint) + )); + } } destinations } diff --git a/crates/cli/tests/cli_tests.rs b/crates/cli/tests/cli_tests.rs index 0fa1e1dd3..35152d5d2 100644 --- a/crates/cli/tests/cli_tests.rs +++ b/crates/cli/tests/cli_tests.rs @@ -896,6 +896,7 @@ fn fake_bootstrap_proof(key: &[u8], fingerprint: &str, nonce: &str) -> String { } fn write_test_tls_identity(bootstrap_dir: &Path) -> Arc { + let _ = rustls::crypto::ring::default_provider().install_default(); let certified = rcgen::generate_simple_self_signed(vec!["localhost".into()]).unwrap(); std::fs::create_dir_all(bootstrap_dir).unwrap(); std::fs::write( @@ -1916,10 +1917,18 @@ fn cli_plugins_validate_rejects_malformed_python_entrypoints_by_path_and_id() { #[test] fn cli_plugins_list_json_emits_empty_versioned_success_output() { let temp = tempfile::tempdir().unwrap(); + let config_path = temp.path().join("config.toml"); + std::fs::write(&config_path, "").unwrap(); let output = Command::new(gateway_bin()) .env("XDG_CONFIG_HOME", temp.path().join("xdg")) .env("HOME", temp.path()) - .args(["plugins", "list", "--json"]) + .args([ + "--config", + config_path.to_str().unwrap(), + "plugins", + "list", + "--json", + ]) .output() .unwrap(); @@ -3242,7 +3251,7 @@ kind = "observability" enabled = true [components.config] -version = 2 +version = 3 [components.config.atof] enabled = true diff --git a/crates/cli/tests/coverage/agents/launcher_tests.rs b/crates/cli/tests/coverage/agents/launcher_tests.rs index 7da2e6689..79704707b 100644 --- a/crates/cli/tests/coverage/agents/launcher_tests.rs +++ b/crates/cli/tests/coverage/agents/launcher_tests.rs @@ -488,7 +488,7 @@ fn exporter_destinations_describe_observability_outputs() { "kind": OBSERVABILITY_PLUGIN_KIND, "enabled": true, "config": { - "version": 2, + "version": 3, "atof": { "enabled": true, "sinks": [ @@ -510,10 +510,16 @@ fn exporter_destinations_describe_observability_outputs() { }, "opentelemetry": { "enabled": true, - "endpoint": "http://127.0.0.1:4318/v1/traces" - }, - "openinference": { - "enabled": true + "endpoints": [ + { + "type": "full", + "endpoint": "http://127.0.0.1:4318/v1/traces" + }, + { + "type": "openinference", + "endpoint": "http://127.0.0.1:4318/v1/traces" + } + ] } } }] @@ -543,12 +549,12 @@ fn exporter_destinations_describe_observability_outputs() { assert!( destinations .iter() - .any(|line| line == "OpenTelemetry http://127.0.0.1:4318/v1/traces") + .any(|line| line == "OpenTelemetry full http://127.0.0.1:4318/v1/traces") ); assert!( destinations .iter() - .any(|line| line == "OpenInference OTLP endpoint from environment/default") + .any(|line| line == "OpenTelemetry openinference http://127.0.0.1:4318/v1/traces") ); } diff --git a/crates/cli/tests/coverage/shared/doctor_tests.rs b/crates/cli/tests/coverage/shared/doctor_tests.rs index f5a2b12f1..0801bf227 100644 --- a/crates/cli/tests/coverage/shared/doctor_tests.rs +++ b/crates/cli/tests/coverage/shared/doctor_tests.rs @@ -917,11 +917,14 @@ fn observability_component_helpers_cover_disabled_and_default_paths() { "kind": OBSERVABILITY_PLUGIN_KIND, "enabled": true, "config": { - "version": 1, + "version": 3, "atof": { "enabled": true }, - "openinference": { + "opentelemetry": { "enabled": true, - "endpoint": "http://127.0.0.1:1" + "endpoints": [{ + "type": "openinference", + "endpoint": "http://127.0.0.1:1" + }] } } }] @@ -930,8 +933,8 @@ fn observability_component_helpers_cover_disabled_and_default_paths() { assert!(section_enabled(config, "atof")); assert_eq!(section_output_directory(config, "atof"), None); assert_eq!( - section_endpoint(config, "openinference").as_deref(), - Some("http://127.0.0.1:1") + config["opentelemetry"]["endpoints"][0]["endpoint"], + "http://127.0.0.1:1" ); assert!( observability_component_config(&serde_json::json!({ @@ -945,6 +948,74 @@ fn observability_component_helpers_cover_disabled_and_default_paths() { assert!(default_dir.details.contains("runtime default")); } +#[tokio::test] +async fn opentelemetry_doctor_uses_tcp_probe_for_grpc_endpoints() { + let listener = TcpListener::bind("127.0.0.1:0").unwrap(); + let endpoint = format!("http://{}", listener.local_addr().unwrap()); + let accept = std::thread::spawn(move || { + let _ = accept_bounded(&listener); + }); + let config = serde_json::json!({ + "opentelemetry": { + "enabled": true, + "endpoints": [{ + "type": "gen_ai", + "transport": "grpc", + "endpoint": endpoint + }] + } + }); + + let checks = observability_http_exporter_checks(&config).await; + + assert_eq!(checks.len(), 1); + assert_eq!(checks[0].status, Status::Pass); + assert!(checks[0].details.contains("gRPC TCP connection succeeded")); + assert!(checks[0].details.contains("endpoints[0] (gen_ai)")); + accept.join().unwrap(); +} + +#[tokio::test] +async fn opentelemetry_doctor_covers_http_missing_and_malformed_endpoints() { + assert!( + observability_http_exporter_checks(&serde_json::json!({ + "opentelemetry": {"enabled": true, "endpoints": "not-a-list"} + })) + .await + .is_empty() + ); + + let missing = observability_http_exporter_checks(&serde_json::json!({ + "opentelemetry": { + "enabled": true, + "endpoints": [{"type": "openinference"}] + } + })) + .await; + assert_eq!(missing.len(), 1); + assert_eq!(missing[0].status, Status::Fail); + assert!(missing[0].details.contains("endpoint is required")); + + let listener = TcpListener::bind("127.0.0.1:0").unwrap(); + let endpoint = format!("http://{}", listener.local_addr().unwrap()); + let accept = std::thread::spawn(move || { + let mut stream = accept_bounded(&listener); + stream + .write_all(b"HTTP/1.1 204 No Content\r\nContent-Length: 0\r\n\r\n") + .unwrap(); + }); + let checks = observability_http_exporter_checks(&serde_json::json!({ + "opentelemetry": { + "enabled": true, + "endpoints": [{"type": "full", "endpoint": endpoint}] + } + })) + .await; + assert_eq!(checks[0].status, Status::Pass); + assert!(checks[0].details.contains("endpoints[0] (full)")); + accept.join().unwrap(); +} + #[test] fn atof_file_checks_preserve_configured_sink_indices() { let config = serde_json::json!({ @@ -1130,7 +1201,7 @@ async fn collect_observability_probes_atof_streaming_endpoint() { "kind": "observability", "enabled": true, "config": { - "version": 2, + "version": 3, "atof": { "enabled": true, "sinks": [{ @@ -1215,7 +1286,7 @@ async fn collect_observability_rejects_websocket_endpoint_http_scheme() { "kind": "observability", "enabled": true, "config": { - "version": 2, + "version": 3, "atof": { "enabled": true, "sinks": [{ diff --git a/crates/cli/tests/coverage/shared/error_tests.rs b/crates/cli/tests/coverage/shared/error_tests.rs index 7b81f28ab..732a370f1 100644 --- a/crates/cli/tests/coverage/shared/error_tests.rs +++ b/crates/cli/tests/coverage/shared/error_tests.rs @@ -4,7 +4,6 @@ use std::collections::BTreeMap; use nemo_relay::error::{FlowError, UpstreamFailure, UpstreamFailureClass}; -use nemo_relay::observability::openinference::OpenInferenceError; use super::*; @@ -70,10 +69,6 @@ fn log_kinds_cover_every_operational_error_class() { CliError::Flow(FlowError::Internal("runtime".into())), "runtime", ), - ( - CliError::OpenInference(OpenInferenceError::Provider("export".into())), - "openinference", - ), ]; for (error, expected) in errors { diff --git a/crates/cli/tests/coverage/shared/plugins_tests.rs b/crates/cli/tests/coverage/shared/plugins_tests.rs index b40e38d05..d14a1aef1 100644 --- a/crates/cli/tests/coverage/shared/plugins_tests.rs +++ b/crates/cli/tests/coverage/shared/plugins_tests.rs @@ -177,7 +177,7 @@ fn typed_editor_model_contains_observability_sections() { let schema = ObservabilityConfig::editor_schema(); let atof = schema.field("atof").unwrap().schema().unwrap(); let atif = schema.field("atif").unwrap().schema().unwrap(); - let openinference = schema.field("openinference").unwrap().schema().unwrap(); + let opentelemetry = schema.field("opentelemetry").unwrap().schema().unwrap(); let sinks = atof.field("sinks").expect("ATOF sinks field"); assert_eq!(sinks.kind, EditorFieldKind::List); assert_eq!( @@ -192,19 +192,29 @@ fn typed_editor_model_contains_observability_sections() { .iter() .any(|field| field.name == "filename_template") ); + let otel_endpoints = opentelemetry.field("endpoints").unwrap(); + assert_eq!(otel_endpoints.kind, EditorFieldKind::List); + let endpoint = otel_endpoints.list_item.unwrap(); + assert_eq!(endpoint.kind, EditorFieldKind::Section); + let endpoint_schema = endpoint.schema.unwrap()(); assert!( - openinference + endpoint_schema + .fields + .iter() + .any(|field| field.name == "type") + ); + assert!( + endpoint_schema .fields .iter() .any(|field| field.name == "endpoint") ); - let attribute_mappings = openinference.field("attribute_mappings").unwrap(); - assert_eq!(attribute_mappings.kind, EditorFieldKind::List); - let mapping = attribute_mappings.list_item.unwrap(); - assert_eq!(mapping.kind, EditorFieldKind::Section); - let mapping_schema = mapping.schema.unwrap()(); - assert_eq!(mapping_schema.fields[0].name, "key"); - assert_eq!(mapping_schema.fields[1].name, "alias"); + assert!( + endpoint_schema + .fields + .iter() + .any(|field| field.name == "header_env") + ); } #[test] @@ -834,7 +844,7 @@ fn editor_save_preserves_unknown_observability_fields() { kind: OBSERVABILITY_PLUGIN_KIND.to_string(), enabled: true, config: json!({ - "version": 2, + "version": 3, "future_top_level": "preserve", "atof": { "enabled": true, @@ -2037,7 +2047,7 @@ fn validate_config_reports_plugin_diagnostics() { kind: OBSERVABILITY_PLUGIN_KIND.to_string(), enabled: true, config: json!({ - "version": 2, + "version": 3, "atof": { "enabled": true, "sinks": [{ diff --git a/crates/cli/tests/coverage/shared/server_tests.rs b/crates/cli/tests/coverage/shared/server_tests.rs index c624182d8..e6c4b52cf 100644 --- a/crates/cli/tests/coverage/shared/server_tests.rs +++ b/crates/cli/tests/coverage/shared/server_tests.rs @@ -192,10 +192,13 @@ fn startup_status_reports_bound_gateway_and_exporters() { "kind": "observability", "enabled": true, "config": { - "version": 1, + "version": 3, "opentelemetry": { "enabled": true, - "endpoint": "http://127.0.0.1:4318/v1/traces" + "endpoints": [{ + "type": "full", + "endpoint": "http://127.0.0.1:4318/v1/traces" + }] } } }] @@ -207,7 +210,7 @@ fn startup_status_reports_bound_gateway_and_exporters() { assert!(output.contains("NeMo Relay")); assert!(output.contains("Gateway http://127.0.0.1:4567")); - assert!(output.contains("OpenTelemetry http://127.0.0.1:4318/v1/traces")); + assert!(output.contains("OpenTelemetry full http://127.0.0.1:4318/v1/traces")); } #[tokio::test] @@ -926,7 +929,7 @@ async fn serve_listener_activates_plugin_config_and_clears_on_shutdown() { "kind": "observability", "enabled": true, "config": { - "version": 2, + "version": 3, "atof": { "enabled": true, "sinks": [{ @@ -1035,7 +1038,7 @@ async fn serve_listener_observability_plugin_records_non_hermes_hooks() { "kind": "observability", "enabled": true, "config": { - "version": 2, + "version": 3, "atof": { "enabled": true, "sinks": [{ @@ -1124,7 +1127,7 @@ async fn serve_listener_hermes_api_hooks_write_atof_category_profile_and_fidelit "kind": "observability", "enabled": true, "config": { - "version": 2, + "version": 3, "atof": { "enabled": true, "sinks": [{ @@ -1327,7 +1330,7 @@ async fn serve_listener_hermes_api_request_error_writes_lossy_atof_error_event() "kind": "observability", "enabled": true, "config": { - "version": 2, + "version": 3, "atof": { "enabled": true, "sinks": [{ @@ -1476,7 +1479,7 @@ async fn serve_listener_hermes_post_tool_call_writes_atof_tool_events() { "kind": "observability", "enabled": true, "config": { - "version": 2, + "version": 3, "atof": { "enabled": true, "sinks": [{ @@ -1703,7 +1706,7 @@ async fn serve_listener_routed_gateway_wire_formats_write_atof_category_profile_ "kind": "observability", "enabled": true, "config": { - "version": 2, + "version": 3, "atof": { "enabled": true, "sinks": [{ @@ -1890,7 +1893,7 @@ async fn serve_listener_records_codex_stop_atof_contract() { "kind": "observability", "enabled": true, "config": { - "version": 2, + "version": 3, "atof": { "enabled": true, "sinks": [{ @@ -2189,7 +2192,7 @@ async fn serve_listener_rejects_invalid_plugin_config() { "kind": "observability", "enabled": true, "config": { - "version": 2, + "version": 3, "atof": { "enabled": true, "sinks": [{ diff --git a/crates/cli/tests/coverage/shared/session_tests.rs b/crates/cli/tests/coverage/shared/session_tests.rs index 4bb94ab37..4223e2da8 100644 --- a/crates/cli/tests/coverage/shared/session_tests.rs +++ b/crates/cli/tests/coverage/shared/session_tests.rs @@ -5,8 +5,9 @@ use axum::http::HeaderMap; use nemo_relay::api::event::{Event, ScopeCategory}; use nemo_relay::api::runtime::EventSubscriberFn; use nemo_relay::api::subscriber::{deregister_subscriber, flush_subscribers, register_subscriber}; +use nemo_relay::observability::OpenTelemetryType; use nemo_relay::observability::atof::{AtofExporter, AtofExporterConfig, AtofExporterMode}; -use nemo_relay::observability::openinference::OpenInferenceSubscriber; +use nemo_relay::observability::otel::OpenTelemetrySubscriber; use nemo_relay::plugin::{PluginConfig, clear_plugin_configuration, initialize_plugins_exact}; use opentelemetry::KeyValue; use opentelemetry_sdk::trace::InMemorySpanExporterBuilder; @@ -105,7 +106,7 @@ async fn install_test_atif_plugin(output_directory: &Path) { "kind": "observability", "enabled": true, "config": { - "version": 2, + "version": 3, "atif": { "enabled": true, "output_directory": output_directory, @@ -189,14 +190,18 @@ fn make_atof_test_exporter(output_directory: &Path, filename: &str) -> AtofExpor fn make_openinference_test_subscriber( scope: &str, ) -> ( - OpenInferenceSubscriber, + OpenTelemetrySubscriber, opentelemetry_sdk::trace::InMemorySpanExporter, ) { let exporter = InMemorySpanExporterBuilder::new().build(); let provider = opentelemetry_sdk::trace::SdkTracerProvider::builder() .with_simple_exporter(exporter.clone()) .build(); - let subscriber = OpenInferenceSubscriber::from_tracer_provider(provider, scope.to_string()); + let subscriber = OpenTelemetrySubscriber::from_tracer_provider_with_type( + provider, + scope.to_string(), + OpenTelemetryType::OpenInference, + ); (subscriber, exporter) } diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml index 1e091e2d8..5578e9393 100644 --- a/crates/core/Cargo.toml +++ b/crates/core/Cargo.toml @@ -15,14 +15,11 @@ workspace = true [features] default = [ - "otel", - "openinference", "guardrails-remote", "object-store", ] atof-streaming = [ "dep:futures-util", - "dep:reqwest", "dep:tokio-tungstenite", "tokio/io-util", "tokio/net", @@ -30,35 +27,16 @@ atof-streaming = [ "tokio/time", ] schema = ["dep:schemars", "nemo-relay-types/schema"] -guardrails-remote = [ - "dep:reqwest", -] +guardrails-remote = [] object-store = [ "dep:object_store", - "dep:reqwest", "tokio/net", "tokio/time", ] -otel = [ - "dep:opentelemetry", - "dep:opentelemetry-otlp", - "dep:opentelemetry_sdk", - "dep:reqwest", - "dep:tonic", -] -openinference = [ - "dep:openinference-semantic-conventions", - "dep:opentelemetry", - "dep:opentelemetry-otlp", - "dep:opentelemetry_sdk", - "dep:reqwest", - "dep:tonic", -] worker-grpc = [ "dep:nemo-relay-worker-proto", "dep:hyper-util", "dep:tower", - "dep:tonic", "tokio-stream/net", "tonic/codegen", "tonic/router", @@ -82,20 +60,20 @@ chrono = { version = "0.4", features = ["serde"] } bitflags = { version = "2", features = ["serde"] } thiserror = "2" strum = { version = "0.27", features = ["derive"] } -tokio = { version = "1", default-features = false, features = ["rt", "macros", "sync", "time"] } +tokio = { version = "1", default-features = false, features = ["rt", "rt-multi-thread", "macros", "sync", "time"] } tokio-stream = { version = "0.1", default-features = false, features = ["sync"] } typed-builder = "0.23.2" futures-util = { version = "0.3", optional = true } -opentelemetry = { workspace = true, features = ["trace"], optional = true } -opentelemetry_sdk = { workspace = true, features = ["trace"], optional = true } -openinference-semantic-conventions = { version = "0.1.1", optional = true } +opentelemetry = { workspace = true, features = ["trace"] } +opentelemetry-semantic-conventions.workspace = true +opentelemetry_sdk = { workspace = true, features = ["trace"] } libloading = "0.8" semver = "1" sha2 = "0.11" -opentelemetry-otlp = { version = "0.31.1", default-features = false, features = ["trace", "http-proto", "reqwest-blocking-client", "grpc-tonic"], optional = true } -reqwest = { version = "0.12", default-features = false, features = ["charset", "http2", "rustls-tls-native-roots", "stream"], optional = true } -tonic = { version = "0.14.1", default-features = false, optional = true } -object_store = { version = "0.13", default-features = false, features = ["aws"], optional = true } +opentelemetry-otlp = { version = "0.32", default-features = false, features = ["trace", "http-proto", "reqwest-blocking-client", "reqwest-rustls", "grpc-tonic", "tls-ring", "tls-roots"] } +reqwest = { version = "0.12", default-features = false, features = ["charset", "http2", "rustls-tls-native-roots", "stream"] } +tonic = { version = "0.14.1", default-features = false } +object_store = { version = "0.14.1", default-features = false, features = ["aws"], optional = true } tokio-tungstenite = { version = "0.27", default-features = false, features = ["connect", "rustls-tls-native-roots"], optional = true } tower = { version = "0.5", features = ["util"], optional = true } hyper-util = { version = "0.1", features = ["tokio"], optional = true } @@ -108,7 +86,7 @@ tokio = { version = "1", features = ["rt", "macros", "sync", "test-util", "rt-mu futures = "0.3" opentelemetry_sdk = { workspace = true, features = ["trace", "testing"] } serde_json = "1" -object_store = { version = "0.13", default-features = false, features = ["aws"] } +object_store = { version = "0.14.1", default-features = false, features = ["aws"] } tempfile = "3" [[test]] diff --git a/crates/core/README.md b/crates/core/README.md index 83ce2286e..574ae31ab 100644 --- a/crates/core/README.md +++ b/crates/core/README.md @@ -32,7 +32,7 @@ Node.js bindings mirror the semantics exposed by this crate. sanitize observability payloads, rewrite requests, or wrap execution. - **Emit one lifecycle stream**: Subscribers can consume canonical runtime events in-process or export them to Agent Trajectory Interchange Format - (ATIF), OpenTelemetry, and OpenInference. + (ATIF) or typed OpenTelemetry projections. - **Integrate without changing orchestration**: Wrap framework and provider callbacks while leaving scheduling, retries, memory, and result handling in the owning application. @@ -47,7 +47,7 @@ Node.js bindings mirror the semantics exposed by this crate. one shared plugin system. - **Built-in observability plugin**: Configure first-party Agent Trajectory Observability Format (ATOF), Agent Trajectory Interchange Format (ATIF), - OpenTelemetry, and OpenInference exporters from the core crate. + and typed OpenTelemetry exporters from the core crate. - **Codec and typed helpers**: Normalize provider requests and responses for framework integrations. - **Binding source of truth**: Use the runtime semantics mirrored by the diff --git a/crates/core/src/lib.rs b/crates/core/src/lib.rs index 18c9f5df1..12444ee56 100644 --- a/crates/core/src/lib.rs +++ b/crates/core/src/lib.rs @@ -38,7 +38,7 @@ //! - [`observability`] — Built-in observability backends including //! [`atif::AtifExporter`](observability::atif::AtifExporter), //! [`otel::OpenTelemetrySubscriber`](observability::otel::OpenTelemetrySubscriber), -//! and [`openinference::OpenInferenceSubscriber`](observability::openinference::OpenInferenceSubscriber). +//! with full, GenAI, or OpenInference projection. //! - [`stream`] — [`stream::LlmStreamWrapper`] — a stream adapter that applies per-chunk //! intercepts and aggregates streaming LLM responses. //! diff --git a/crates/core/src/observability/manual.rs b/crates/core/src/observability/manual.rs index 289dd3ea3..605f278a3 100644 --- a/crates/core/src/observability/manual.rs +++ b/crates/core/src/observability/manual.rs @@ -12,9 +12,7 @@ use crate::json::Json; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub(crate) enum ManualCostPolicy { - #[cfg(feature = "otel")] AnyCurrency, - #[cfg(feature = "openinference")] UsdOnly, AtifUsdOnly, } @@ -155,9 +153,7 @@ fn cost_from_manual_usage( impl ManualCostPolicy { fn accepts_currency(self, currency: Option<&str>, cost: &Map) -> bool { match self { - #[cfg(feature = "otel")] Self::AnyCurrency => true, - #[cfg(feature = "openinference")] Self::UsdOnly => currency .map(|currency| currency.eq_ignore_ascii_case("USD")) .unwrap_or(true), diff --git a/crates/core/src/observability/mod.rs b/crates/core/src/observability/mod.rs index 9f1ecb7d2..92755d5df 100644 --- a/crates/core/src/observability/mod.rs +++ b/crates/core/src/observability/mod.rs @@ -12,16 +12,17 @@ use serde::{Deserialize, Serialize}; /// additional attribute to emit with the same typed value. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[cfg_attr(feature = "schema", derive(schemars::JsonSchema))] -pub struct OtlpAttributeMapping { +pub(crate) struct OtlpAttributeMapping { /// Fully-qualified projected attribute to copy. - pub key: String, + pub(crate) key: String, /// Additional attribute name receiving the copied value. - pub alias: String, + pub(crate) alias: String, } impl OtlpAttributeMapping { /// Creates an attribute mapping. - pub fn new(key: impl Into, alias: impl Into) -> Self { + #[cfg(test)] + pub(crate) fn new(key: impl Into, alias: impl Into) -> Self { Self { key: key.into(), alias: alias.into(), @@ -40,10 +41,9 @@ pub(crate) fn test_mutex() -> &'static Mutex<()> { pub mod atif; pub mod atof; pub(crate) mod manual; -#[cfg(feature = "openinference")] -pub mod openinference; -#[cfg(feature = "otel")] +pub(crate) mod openinference; pub mod otel; +mod otel_genai; pub mod plugin_component; /// Export representation for point-in-time mark events. @@ -54,7 +54,7 @@ pub mod plugin_component; #[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)] #[cfg_attr(feature = "schema", derive(schemars::JsonSchema))] #[serde(rename_all = "snake_case")] -pub enum MarkProjection { +pub(crate) enum MarkProjection { /// Use each exporter’s native handling for marks. #[default] Inherit, @@ -66,25 +66,37 @@ pub enum MarkProjection { Tool, } +/// Semantic projection emitted by an OpenTelemetry exporter. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)] +#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))] +#[serde(rename_all = "snake_case")] +pub enum OpenTelemetryType { + /// Relay's complete lifecycle projection, including `nemo_relay.*` attributes. + #[default] + Full, + /// OpenTelemetry GenAI semantic conventions. + GenAi, + /// OpenInference semantic conventions. + #[serde(rename = "openinference")] + OpenInference, +} + /// Default mark names excluded from tool projection because they are emitted /// at high volume and are better represented as exporter-native events. pub(crate) fn default_mark_exclude_names() -> Vec { vec!["llm.chunk".to_string()] } -#[cfg(any(feature = "otel", feature = "openinference"))] pub(crate) fn relay_trace_id(uuid: uuid::Uuid) -> opentelemetry::trace::TraceId { opentelemetry::trace::TraceId::from_bytes(*uuid.as_bytes()) } -#[cfg(any(feature = "otel", feature = "openinference"))] pub(crate) fn relay_span_id(uuid: uuid::Uuid) -> opentelemetry::trace::SpanId { let mut bytes = [0; 8]; bytes.copy_from_slice(&uuid.as_bytes()[8..]); opentelemetry::trace::SpanId::from_bytes(bytes) } -#[cfg(any(feature = "otel", feature = "openinference"))] pub(crate) fn push_common_optimization_attributes( attributes: &mut Vec, summary: &crate::codec::optimization::LlmOptimizationSummary, @@ -96,7 +108,6 @@ pub(crate) fn push_common_optimization_attributes( push_optimization_pricing_provenance(attributes, summary); } -#[cfg(any(feature = "otel", feature = "openinference"))] fn push_optimization_models_and_tokens( attributes: &mut Vec, summary: &crate::codec::optimization::LlmOptimizationSummary, @@ -127,7 +138,6 @@ fn push_optimization_models_and_tokens( } } -#[cfg(any(feature = "otel", feature = "openinference"))] fn push_optimization_cost( attributes: &mut Vec, label: &str, @@ -160,7 +170,6 @@ fn push_optimization_cost( } } -#[cfg(any(feature = "otel", feature = "openinference"))] fn push_optimization_savings_and_status( attributes: &mut Vec, summary: &crate::codec::optimization::LlmOptimizationSummary, @@ -193,7 +202,6 @@ fn push_optimization_savings_and_status( )); } -#[cfg(any(feature = "otel", feature = "openinference"))] fn push_optimization_pricing_provenance( attributes: &mut Vec, summary: &crate::codec::optimization::LlmOptimizationSummary, @@ -233,7 +241,8 @@ fn push_optimization_pricing_provenance( } /// Validates OTLP attribute mappings shared by exporter configuration surfaces. -pub fn validate_attribute_mappings( +#[cfg(test)] +pub(crate) fn validate_attribute_mappings( mappings: &[OtlpAttributeMapping], ) -> std::result::Result<(), String> { let mut aliases = std::collections::HashSet::new(); @@ -254,7 +263,6 @@ pub fn validate_attribute_mappings( Ok(()) } -#[cfg(any(feature = "otel", feature = "openinference"))] /// Projects only top-level JSON fields as OTLP attributes. /// /// Nested objects and arrays remain JSON strings so arbitrary payloads do not @@ -279,7 +287,6 @@ pub(crate) fn push_top_level_json_attributes( /// Adds canonical session-correlation attributes from event metadata and the /// active scope-stack instance. -#[cfg(any(feature = "otel", feature = "openinference"))] pub(crate) fn push_session_identity_attributes( attributes: &mut Vec, event: &crate::api::event::Event, @@ -316,7 +323,6 @@ pub(crate) fn push_session_identity_attributes( } } -#[cfg(any(feature = "otel", feature = "openinference"))] /// Serializes a value and projects its top-level JSON fields as OTLP attributes. pub(crate) fn push_serialized_top_level_attributes( attributes: &mut Vec, @@ -331,7 +337,6 @@ pub(crate) fn push_serialized_top_level_attributes( } } -#[cfg(any(feature = "otel", feature = "openinference"))] fn push_top_level_json_value( attributes: &mut Vec, key: &str, @@ -366,7 +371,6 @@ fn push_top_level_json_value( } } -#[cfg(any(feature = "otel", feature = "openinference"))] pub(crate) fn apply_attribute_mappings( attributes: &mut Vec, mappings: &[OtlpAttributeMapping], @@ -380,7 +384,6 @@ pub(crate) fn apply_attribute_mappings( /// retain both mapped source keys and aliases that were already present at /// start. The span itself owns all other start attributes and does not need a /// second copy in the active-span state. -#[cfg(any(feature = "otel", feature = "openinference"))] pub(crate) fn attribute_mapping_inputs( attributes: &[opentelemetry::KeyValue], mappings: &[OtlpAttributeMapping], @@ -400,7 +403,6 @@ pub(crate) fn attribute_mapping_inputs( /// /// Callers that project a span across multiple lifecycle events must pass every /// real span attribute so projected fields always take precedence over aliases. -#[cfg(any(feature = "otel", feature = "openinference"))] pub(crate) fn attribute_mapping_aliases( projected_attributes: &[opentelemetry::KeyValue], mappings: &[OtlpAttributeMapping], @@ -431,7 +433,6 @@ pub(crate) fn attribute_mapping_aliases( /// /// Agent hook adapters may preserve the canonical event name in metadata while /// using a generic mark name, so both representations are matched. -#[cfg(any(feature = "otel", feature = "openinference"))] pub(crate) fn mark_name_is_excluded( event: &crate::api::event::Event, excluded_names: &[String], @@ -451,7 +452,6 @@ pub(crate) fn mark_name_is_excluded( /// /// Exclusions only affect tool projection; all other modes retain their /// configured exporter-native behavior. -#[cfg(any(feature = "otel", feature = "openinference"))] pub(crate) fn effective_mark_projection( event: &crate::api::event::Event, projection: MarkProjection, @@ -464,11 +464,10 @@ pub(crate) fn effective_mark_projection( } } -#[cfg(all(test, feature = "otel", feature = "openinference"))] +#[cfg(test)] #[path = "../../tests/unit/observability/exporter_parity_tests.rs"] mod exporter_parity_tests; -#[cfg(any(feature = "otel", feature = "openinference"))] pub(crate) fn estimate_cost_for_response_or_requested_model( event: &crate::api::event::Event, response_model: Option<&str>, @@ -543,7 +542,6 @@ pub(crate) fn model_name_for_llm_event(event: &crate::api::event::Event) -> Opti .or(manual_request_model) } -#[cfg(any(feature = "otel", feature = "openinference"))] pub(crate) fn set_span_status_from_event_metadata(span: &mut S, event: &crate::api::event::Event) where S: opentelemetry::trace::Span, @@ -581,11 +579,11 @@ where span.set_status(status); } -#[cfg(all(test, any(feature = "otel", feature = "openinference")))] +#[cfg(test)] #[path = "../../tests/unit/observability/attribute_projection_tests.rs"] mod attribute_projection_tests; -#[cfg(all(test, any(feature = "otel", feature = "openinference")))] +#[cfg(test)] mod tests { use super::{relay_span_id, relay_trace_id}; use uuid::Uuid; diff --git a/crates/core/src/observability/openinference.rs b/crates/core/src/observability/openinference.rs index 362015853..de0b32b8b 100644 --- a/crates/core/src/observability/openinference.rs +++ b/crates/core/src/observability/openinference.rs @@ -3,837 +3,31 @@ //! OpenInference subscriber support for NeMo Relay. //! -//! This crate adapts NeMo Relay lifecycle events into OpenInference trace spans: -//! -//! - scope/tool/LLM `Start` events open spans -//! - matching `End` events close spans -//! - `Mark` events become span events by default, with an optional OpenInference tool projection -//! - orphan marks fall back to zero-duration spans so they still reach OTLP -//! -//! The public API is intentionally small: -//! -//! - [`OpenInferenceConfig`] configures the OTLP exporter and OpenInference metadata -//! - [`OpenInferenceSubscriber`] exposes a NeMo Relay [`EventSubscriberFn`] and -//! convenience `register` / `deregister` / `force_flush` / `shutdown` methods - -use std::collections::{HashMap, VecDeque}; -use std::sync::{Arc, Mutex}; -use std::time::{Duration, SystemTime, UNIX_EPOCH}; +//! Projection functions used by the unified OpenTelemetry subscriber. use super::{ - MarkProjection, OtlpAttributeMapping, apply_attribute_mappings, attribute_mapping_aliases, - attribute_mapping_inputs, default_mark_exclude_names, effective_mark_projection, estimate_cost_for_response_or_model, estimate_cost_for_response_or_requested_model, manual, merge_usage, model_name_for_llm_event, push_serialized_top_level_attributes, - push_session_identity_attributes, push_top_level_json_attributes, relay_span_id, - relay_trace_id, validate_attribute_mappings, + push_top_level_json_attributes, }; -use crate::api::event::{Event, EventNormalizationExt, ScopeCategory}; -use crate::api::runtime::EventSubscriberFn; +use crate::api::event::{Event, EventNormalizationExt}; use crate::api::scope::ScopeType; -use crate::api::subscriber::{deregister_subscriber, flush_subscribers, register_subscriber}; use crate::codec::request::{ AnnotatedLlmRequest, ContentPart, Message, MessageContent, ToolDefinition, }; use crate::codec::response::{AnnotatedLlmResponse, FinishReason, ResponseToolCall, Usage}; -use crate::error::FlowError; use crate::json::Json; +#[cfg(test)] use chrono::{DateTime, Utc}; -use openinference_semantic_conventions::SpanKind as OpenInferenceSpanKind; -use openinference_semantic_conventions::attributes as oi; -use opentelemetry::trace::{ - Span as _, SpanContext, SpanKind, TraceContextExt, Tracer, TracerProvider as _, -}; -use opentelemetry::{Context, KeyValue}; -use opentelemetry_otlp::{Protocol, SpanExporter, WithExportConfig, WithHttpConfig}; -use opentelemetry_sdk::Resource; -use opentelemetry_sdk::trace::{SdkTracer, SdkTracerProvider, Span}; +use opentelemetry::KeyValue; +#[cfg(test)] +use opentelemetry::trace::SpanContext; +use opentelemetry::trace::SpanKind; use serde::Serialize; -use uuid::Uuid; - -const COMPLETED_SPAN_CONTEXT_LIMIT: usize = 4096; - -use opentelemetry_otlp::WithTonicConfig; -use tokio::runtime::Handle; -use tonic::metadata::{MetadataKey, MetadataMap, MetadataValue}; - -/// Result type for the OpenInference subscriber crate. -pub type Result = std::result::Result; - -/// Errors produced while configuring or operating the OpenInference subscriber. -#[derive(Debug, thiserror::Error)] -pub enum OpenInferenceError { - /// The tonic gRPC exporter requires an active Tokio runtime. - #[error("the OTLP gRPC exporter requires an active Tokio runtime")] - MissingTokioRuntime, - /// Failed to parse a configured gRPC metadata header. - #[error("invalid OTLP gRPC header {key:?}: {message}")] - InvalidGrpcHeader { - /// Header name that failed to parse. - key: String, - /// Parser failure message. - message: String, - }, - /// Failed to build the OTLP exporter. - #[error("failed to build the OTLP exporter: {0}")] - ExporterBuild(String), - /// The underlying tracer provider returned an error. - #[error("OpenInference tracer provider error: {0}")] - Provider(String), - /// Attribute mapping configuration was invalid. - #[error("invalid attribute mappings: {0}")] - InvalidAttributeMappings(String), - /// Registration errors from the core runtime. - #[error(transparent)] - Core(#[from] FlowError), -} - -/// Supported OTLP trace transports. -#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] -pub enum OtlpTransport { - /// OTLP/HTTP protobuf, typically `http://host:4318/v1/traces`. - #[default] - HttpBinary, - /// OTLP/gRPC, typically `http://host:4317`. - Grpc, -} - -/// Configuration for the OpenInference subscriber. -#[derive(Debug, Clone)] -pub struct OpenInferenceConfig { - endpoint: Option, - headers: HashMap, - resource_attributes: HashMap, - service_name: String, - service_namespace: Option, - service_version: Option, - instrumentation_scope: String, - mark_projection: MarkProjection, - mark_exclude_names: Vec, - attribute_mappings: Vec, - timeout: Duration, - transport: OtlpTransport, -} - -impl Default for OpenInferenceConfig { - fn default() -> Self { - Self { - endpoint: None, - headers: HashMap::new(), - resource_attributes: HashMap::new(), - service_name: "nemo-relay".to_string(), - service_namespace: None, - service_version: None, - instrumentation_scope: "nemo-relay-openinference".to_string(), - mark_projection: MarkProjection::default(), - mark_exclude_names: default_mark_exclude_names(), - attribute_mappings: Vec::new(), - timeout: Duration::from_secs(3), - transport: OtlpTransport::HttpBinary, - } - } -} - -impl OpenInferenceConfig { - /// Creates a config with sensible defaults. - pub fn new() -> Self { - Self::default() - } - - /// Selects the OTLP transport. - pub fn with_transport(mut self, transport: OtlpTransport) -> Self { - self.transport = transport; - self - } - - /// Sets the `service.name` resource attribute. - pub fn with_service_name(mut self, service_name: impl Into) -> Self { - self.service_name = service_name.into(); - self - } - - /// Overrides the OTLP endpoint. If unset, exporter defaults and OTEL_* env vars apply. - pub fn with_endpoint(mut self, endpoint: impl Into) -> Self { - self.endpoint = Some(endpoint.into()); - self - } - - /// Adds a header/metadata entry for the exporter. - pub fn with_header(mut self, key: impl Into, value: impl Into) -> Self { - self.headers.insert(key.into(), value.into()); - self - } - - /// Adds a resource attribute as a string key/value pair. - pub fn with_resource_attribute( - mut self, - key: impl Into, - value: impl Into, - ) -> Self { - self.resource_attributes.insert(key.into(), value.into()); - self - } - - /// Sets the OTLP request timeout. - pub fn with_timeout(mut self, timeout: Duration) -> Self { - self.timeout = timeout; - self - } - - /// Sets the service namespace resource attribute. - pub fn with_service_namespace(mut self, namespace: impl Into) -> Self { - self.service_namespace = Some(namespace.into()); - self - } - - /// Sets the service version resource attribute. - pub fn with_service_version(mut self, version: impl Into) -> Self { - self.service_version = Some(version.into()); - self - } - - /// Sets the instrumentation scope name used for emitted spans. - pub fn with_instrumentation_scope(mut self, scope: impl Into) -> Self { - self.instrumentation_scope = scope.into(); - self - } - - /// Selects how point-in-time marks are represented in exported traces. - pub fn with_mark_projection(mut self, mark_projection: MarkProjection) -> Self { - self.mark_projection = mark_projection; - self - } - - /// Excludes named marks from tool projection while preserving their native - /// event representation. The default excludes high-volume `llm.chunk` - /// marks. - pub fn with_mark_exclude_names(mut self, names: I) -> Self - where - I: IntoIterator, - S: Into, - { - self.mark_exclude_names = names.into_iter().map(Into::into).collect(); - self - } - - /// Adds a typed attribute copy after event payload projection. - pub fn with_attribute_mapping( - mut self, - key: impl Into, - alias: impl Into, - ) -> Self { - self.attribute_mappings - .push(OtlpAttributeMapping::new(key, alias)); - self - } - - /// Replaces the configured typed attribute copies. - pub fn with_attribute_mappings(mut self, mappings: I) -> Self - where - I: IntoIterator, - { - self.attribute_mappings = mappings.into_iter().collect(); - self - } -} - -/// OpenInference-backed NeMo Relay subscriber. -#[derive(Clone)] -pub struct OpenInferenceSubscriber { - inner: Arc, -} - -/// Options for constructing an OpenInference subscriber from an existing tracer provider. -#[derive(Debug, Clone)] -pub struct OpenInferenceSubscriberOptions { - /// How mark events are projected into the trace. - pub mark_projection: MarkProjection, - /// Mark names excluded from tool projection. - pub mark_exclude_names: Vec, - /// Typed OTLP attributes copied to alias keys. - pub attribute_mappings: Vec, -} - -impl Default for OpenInferenceSubscriberOptions { - fn default() -> Self { - Self { - mark_projection: MarkProjection::default(), - mark_exclude_names: default_mark_exclude_names(), - attribute_mappings: Vec::new(), - } - } -} - -struct Inner { - processor: Arc>, - subscriber: EventSubscriberFn, -} - -impl OpenInferenceSubscriber { - /// Builds a subscriber backed by a new OTLP tracer provider. - pub fn new(config: OpenInferenceConfig) -> Result { - if config.transport == OtlpTransport::Grpc && tokio::runtime::Handle::try_current().is_err() - { - return Err(OpenInferenceError::MissingTokioRuntime); - } - validate_attribute_mappings(&config.attribute_mappings) - .map_err(OpenInferenceError::InvalidAttributeMappings)?; - - let provider = build_tracer_provider(&config)?; - Ok(Self::from_tracer_provider_with_scope( - provider, - config.instrumentation_scope, - config.mark_projection, - config.mark_exclude_names, - config.attribute_mappings, - )) - } - - /// Builds a subscriber from an already-configured tracer provider. - pub fn from_tracer_provider( - provider: SdkTracerProvider, - instrumentation_scope: impl Into, - ) -> Self { - Self::from_tracer_provider_with_scope( - provider, - instrumentation_scope.into(), - MarkProjection::default(), - default_mark_exclude_names(), - Vec::new(), - ) - } - - /// Builds a subscriber from a tracer provider with an explicit mark projection. - pub fn from_tracer_provider_with_mark_projection( - provider: SdkTracerProvider, - instrumentation_scope: impl Into, - mark_projection: MarkProjection, - ) -> Self { - Self::from_tracer_provider_with_scope( - provider, - instrumentation_scope.into(), - mark_projection, - default_mark_exclude_names(), - Vec::new(), - ) - } - - /// Builds a subscriber with explicit mark projection and exclusion names. - pub fn from_tracer_provider_with_mark_projection_and_exclusions( - provider: SdkTracerProvider, - instrumentation_scope: impl Into, - mark_projection: MarkProjection, - mark_exclude_names: I, - ) -> Self - where - I: IntoIterator, - S: Into, - { - Self::from_tracer_provider_with_scope( - provider, - instrumentation_scope.into(), - mark_projection, - mark_exclude_names.into_iter().map(Into::into).collect(), - Vec::new(), - ) - } - - /// Builds a subscriber from a tracer provider with typed attribute copies. - pub fn from_tracer_provider_with_attribute_mappings( - provider: SdkTracerProvider, - instrumentation_scope: impl Into, - attribute_mappings: I, - ) -> Result - where - I: IntoIterator, - { - let attribute_mappings = attribute_mappings.into_iter().collect::>(); - Self::from_tracer_provider_with_options( - provider, - instrumentation_scope, - OpenInferenceSubscriberOptions { - attribute_mappings, - ..Default::default() - }, - ) - } - - /// Builds a subscriber from a tracer provider with composable projection options. - pub fn from_tracer_provider_with_options( - provider: SdkTracerProvider, - instrumentation_scope: impl Into, - options: OpenInferenceSubscriberOptions, - ) -> Result { - validate_attribute_mappings(&options.attribute_mappings) - .map_err(OpenInferenceError::InvalidAttributeMappings)?; - Ok(Self::from_tracer_provider_with_scope( - provider, - instrumentation_scope.into(), - options.mark_projection, - options.mark_exclude_names, - options.attribute_mappings, - )) - } - - fn from_tracer_provider_with_scope( - provider: SdkTracerProvider, - instrumentation_scope: String, - mark_projection: MarkProjection, - mark_exclude_names: Vec, - attribute_mappings: Vec, - ) -> Self { - let processor = Arc::new(Mutex::new( - OpenInferenceEventProcessor::new_with_mark_projection_and_exclusions_and_mappings( - provider, - instrumentation_scope, - mark_projection, - mark_exclude_names, - attribute_mappings, - ), - )); - let processor_for_callback = Arc::clone(&processor); - let subscriber: EventSubscriberFn = Arc::new(move |event: &Event| { - let Ok(mut guard) = processor_for_callback.lock() else { - // Observability should not take down the host process if the - // subscriber state was previously poisoned. - return; - }; - guard.process(event); - }); - - Self { - inner: Arc::new(Inner { - processor, - subscriber, - }), - } - } - - /// Returns the raw NeMo Relay subscriber callback for custom registration flows. - pub fn subscriber(&self) -> EventSubscriberFn { - Arc::clone(&self.inner.subscriber) - } - - /// Registers this subscriber globally with the NeMo Relay runtime. - pub fn register(&self, name: &str) -> Result<()> { - register_subscriber(name, self.subscriber())?; - log::info!( - target: "nemo_relay.observability", - event = "exporter_registered", - exporter = "openinference", - subscriber = name; - "OpenInference exporter registered" - ); - Ok(()) - } - - /// Deregisters a previously-registered global subscriber by name. - pub fn deregister(&self, name: &str) -> Result { - let removed = deregister_subscriber(name)?; - if removed { - log::info!( - target: "nemo_relay.observability", - event = "subscriber_deregistered", - subscriber = name; - "Observability subscriber deregistered" - ); - } - Ok(removed) - } - - /// Flushes finished spans through the underlying tracer provider. - pub fn force_flush(&self) -> Result<()> { - flush_subscribers()?; - let guard = self.inner.processor.lock().map_err(|_| { - OpenInferenceError::Provider("the subscriber state lock was poisoned".to_string()) - })?; - guard.force_flush() - } - - /// Shuts down the underlying tracer provider. - /// - /// Call `deregister(...)` first if the subscriber is still registered with NeMo Relay. - pub fn shutdown(&self) -> Result<()> { - flush_subscribers()?; - let guard = self.inner.processor.lock().map_err(|_| { - OpenInferenceError::Provider("the subscriber state lock was poisoned".to_string()) - })?; - let result = guard.shutdown(); - if result.is_ok() { - log::info!( - target: "nemo_relay.observability", - event = "exporter_shutdown", - exporter = "openinference"; - "OpenInference exporter shut down" - ); - } - result - } -} - -fn build_tracer_provider(config: &OpenInferenceConfig) -> Result { - let exporter = match config.transport { - OtlpTransport::HttpBinary => { - let mut builder = SpanExporter::builder() - .with_http() - .with_protocol(Protocol::HttpBinary) - .with_timeout(config.timeout); - if let Some(endpoint) = &config.endpoint { - builder = builder.with_endpoint(endpoint.clone()); - } - if !config.headers.is_empty() { - builder = builder.with_headers(config.headers.clone()); - } - builder - .build() - .map_err(|e| OpenInferenceError::ExporterBuild(e.to_string()))? - } - OtlpTransport::Grpc => { - let mut builder = SpanExporter::builder() - .with_tonic() - .with_protocol(Protocol::Grpc) - .with_timeout(config.timeout); - if let Some(endpoint) = &config.endpoint { - builder = builder.with_endpoint(endpoint.clone()); - } - if !config.headers.is_empty() { - builder = builder.with_metadata(build_grpc_metadata(&config.headers)?); - } - builder - .build() - .map_err(|e| OpenInferenceError::ExporterBuild(e.to_string()))? - } - }; - - let mut resource_attributes = vec![KeyValue::new("service.name", config.service_name.clone())]; - if let Some(service_namespace) = &config.service_namespace { - resource_attributes.push(KeyValue::new( - "service.namespace", - service_namespace.clone(), - )); - } - if let Some(service_version) = &config.service_version { - resource_attributes.push(KeyValue::new("service.version", service_version.clone())); - } - for (key, value) in &config.resource_attributes { - resource_attributes.push(KeyValue::new(key.clone(), value.clone())); - } - - // Disable per-span attribute caps. OpenInference emits many flat - // `llm.input_messages.*` attributes on long conversations; the OTel SDK - // default (128) silently drops attributes added last in the span's - // lifecycle, notably `llm.token_count.*` emitted at span end. - let builder = SdkTracerProvider::builder() - .with_resource( - Resource::builder_empty() - .with_attributes(resource_attributes) - .build(), - ) - .with_max_attributes_per_span(u32::MAX) - .with_max_attributes_per_event(u32::MAX); - - if Handle::try_current().is_ok() { - Ok(builder.with_batch_exporter(exporter).build()) - } else { - Ok(builder.with_simple_exporter(exporter).build()) - } -} - -fn build_grpc_metadata(headers: &HashMap) -> Result { - let mut metadata = MetadataMap::new(); - for (key, value) in headers { - let metadata_key = MetadataKey::from_bytes(key.as_bytes()).map_err(|e| { - OpenInferenceError::InvalidGrpcHeader { - key: key.clone(), - message: e.to_string(), - } - })?; - let metadata_value = MetadataValue::try_from(value.as_str()).map_err(|e| { - OpenInferenceError::InvalidGrpcHeader { - key: key.clone(), - message: e.to_string(), - } - })?; - metadata.insert(metadata_key, metadata_value); - } - Ok(metadata) -} - -struct ActiveSpan { - span: Span, - span_context: SpanContext, - start_model_name: Option, - projected_attributes: Vec, -} - -struct OpenInferenceEventProcessor { - active_spans: HashMap, - completed_span_contexts: HashMap, - completed_span_order: VecDeque, - provider: SdkTracerProvider, - tracer: SdkTracer, - mark_projection: MarkProjection, - mark_exclude_names: Vec, - attribute_mappings: Vec, -} - -impl OpenInferenceEventProcessor { - #[cfg(test)] - fn new(provider: SdkTracerProvider, instrumentation_scope: String) -> Self { - Self::new_with_mark_projection(provider, instrumentation_scope, MarkProjection::default()) - } - - #[cfg(test)] - fn new_with_mark_projection( - provider: SdkTracerProvider, - instrumentation_scope: String, - mark_projection: MarkProjection, - ) -> Self { - Self::new_with_mark_projection_and_exclusions( - provider, - instrumentation_scope, - mark_projection, - default_mark_exclude_names(), - ) - } - - #[cfg(test)] - fn new_with_mark_projection_and_exclusions( - provider: SdkTracerProvider, - instrumentation_scope: String, - mark_projection: MarkProjection, - mark_exclude_names: Vec, - ) -> Self { - Self::new_with_mark_projection_and_exclusions_and_mappings( - provider, - instrumentation_scope, - mark_projection, - mark_exclude_names, - Vec::new(), - ) - } - - fn new_with_mark_projection_and_exclusions_and_mappings( - provider: SdkTracerProvider, - instrumentation_scope: String, - mark_projection: MarkProjection, - mark_exclude_names: Vec, - attribute_mappings: Vec, - ) -> Self { - let tracer = provider.tracer(instrumentation_scope); - Self { - active_spans: HashMap::new(), - completed_span_contexts: HashMap::new(), - completed_span_order: VecDeque::new(), - provider, - tracer, - mark_projection, - mark_exclude_names, - attribute_mappings, - } - } - - fn process(&mut self, event: &Event) { - match event.scope_category() { - Some(ScopeCategory::Start) => self.process_start(event), - Some(ScopeCategory::End) => self.process_end(event), - None => self.process_mark(event), - } - } - - fn force_flush(&self) -> Result<()> { - self.provider - .force_flush() - .map_err(|e| OpenInferenceError::Provider(e.to_string())) - } - - fn shutdown(&self) -> Result<()> { - self.provider - .shutdown() - .map_err(|e| OpenInferenceError::Provider(e.to_string())) - } - - fn process_start(&mut self, event: &Event) { - self.remove_completed_span_context(event.uuid()); - let parent_context = self.parent_context(event); - let is_trace_root = !parent_context.span().span_context().is_valid(); - let start_model_name = model_name_for_llm_event(event); - let mut span = self - .tracer - .span_builder(span_name(event)) - .with_kind(span_kind(event)) - .with_start_time(to_system_time(*event.timestamp())) - .with_trace_id(relay_trace_id(event.uuid())) - .with_span_id(relay_span_id(event.uuid())) - .start_with_context(&self.tracer, &parent_context); - let mut attributes = start_attributes(event); - if start_model_name.is_some() { - attributes.retain(|attribute| attribute.key.as_str() != oi::llm::MODEL_NAME.as_str()); - } - if is_trace_root { - push_session_identity_attributes(&mut attributes, event); - } - let projected_attributes = attribute_mapping_inputs(&attributes, &self.attribute_mappings); - span.set_attributes(attributes); - let span_context = local_parent_span_context(span.span_context()); - self.active_spans.insert( - event.uuid(), - ActiveSpan { - span, - span_context, - start_model_name, - projected_attributes, - }, - ); - } - - fn process_end(&mut self, event: &Event) { - let Some(mut active_span) = self.active_spans.remove(&event.uuid()) else { - return; - }; - self.record_completed_span_context(event.uuid(), active_span.span_context.clone()); - super::set_span_status_from_event_metadata(&mut active_span.span, event); - let mut attributes = end_attributes(event); - if let Some(model_name) = model_name_for_llm_event(event).or(active_span.start_model_name) { - attributes.push(KeyValue::new(oi::llm::MODEL_NAME, model_name)); - } - if !self.attribute_mappings.is_empty() { - let mut projected_attributes = active_span.projected_attributes; - projected_attributes.extend(attributes.iter().cloned()); - attributes.extend(attribute_mapping_aliases( - &projected_attributes, - &self.attribute_mappings, - )); - } - active_span.span.set_attributes(attributes); - active_span - .span - .end_with_timestamp(to_system_time(*event.timestamp())); - } - - fn process_mark(&mut self, event: &Event) { - if effective_mark_projection(event, self.mark_projection, &self.mark_exclude_names) - == MarkProjection::Tool - { - self.process_mark_as_tool(event); - return; - } - let mark_name = event.name().to_string(); - let timestamp = to_system_time(*event.timestamp()); - let mut attributes = mark_attributes(event); - if event.name() == "session.start" { - push_session_identity_attributes(&mut attributes, event); - } - - if self.find_parent_span(event).is_some() { - apply_attribute_mappings(&mut attributes, &self.attribute_mappings); - let parent_span = self - .find_parent_span_mut(event) - .expect("parent span was present during mark projection"); - parent_span - .span - .add_event_with_timestamp(mark_name, timestamp, attributes); - return; - } - - let mut span = self - .tracer - .span_builder(format!("mark:{mark_name}")) - .with_kind(SpanKind::Internal) - .with_start_time(timestamp) - .with_trace_id(relay_trace_id(event.uuid())) - .with_span_id(relay_span_id(event.uuid())) - .start_with_context(&self.tracer, &self.parent_context(event)); - attributes.push(KeyValue::new( - oi::OPENINFERENCE_SPAN_KIND, - OpenInferenceSpanKind::Chain, - )); - attributes.push(KeyValue::new("nemo_relay.mark.orphan", true)); - apply_attribute_mappings(&mut attributes, &self.attribute_mappings); - span.set_attributes(attributes); - span.end_with_timestamp(timestamp); - } - - fn process_mark_as_tool(&mut self, event: &Event) { - let timestamp = to_system_time(*event.timestamp()); - let orphan = self.find_parent_span(event).is_none(); - let mut attributes = mark_attributes(event); - if event.name() == "session.start" { - push_session_identity_attributes(&mut attributes, event); - } - attributes.push(KeyValue::new("nemo_relay.mark.projection", "tool")); - attributes.push(KeyValue::new( - oi::OPENINFERENCE_SPAN_KIND, - OpenInferenceSpanKind::Tool, - )); - push_projected_mark_attributes(&mut attributes, event); - if orphan { - attributes.push(KeyValue::new("nemo_relay.mark.orphan", true)); - } - apply_attribute_mappings(&mut attributes, &self.attribute_mappings); - - let mut span = self - .tracer - .span_builder(format!("mark:{}", event.name())) - .with_kind(SpanKind::Internal) - .with_start_time(timestamp) - .with_trace_id(relay_trace_id(event.uuid())) - .with_span_id(relay_span_id(event.uuid())) - .start_with_context(&self.tracer, &self.parent_context(event)); - span.set_attributes(attributes); - span.end_with_timestamp(timestamp); - } - - fn parent_context(&self, event: &Event) -> Context { - if let Some(active_span) = self.find_parent_span(event) { - return Context::new().with_remote_span_context(active_span.span_context.clone()); - } - event - .parent_uuid() - .and_then(|uuid| self.completed_span_contexts.get(&uuid)) - .map(|span_context| Context::new().with_remote_span_context(span_context.clone())) - .unwrap_or_default() - } - - fn parent_span_uuid(&self, event: &Event) -> Option { - event - .parent_uuid() - .filter(|uuid| self.active_spans.contains_key(uuid)) - } - - fn find_parent_span(&self, event: &Event) -> Option<&ActiveSpan> { - self.parent_span_uuid(event) - .and_then(|uuid| self.active_spans.get(&uuid)) - } - - fn find_parent_span_mut(&mut self, event: &Event) -> Option<&mut ActiveSpan> { - self.parent_span_uuid(event) - .and_then(|uuid| self.active_spans.get_mut(&uuid)) - } - - fn remove_completed_span_context(&mut self, uuid: Uuid) { - self.completed_span_contexts.remove(&uuid); - self.completed_span_order - .retain(|completed_uuid| *completed_uuid != uuid); - } - - fn record_completed_span_context(&mut self, uuid: Uuid, span_context: SpanContext) { - if self - .completed_span_contexts - .insert(uuid, span_context) - .is_none() - { - self.completed_span_order.push_back(uuid); - } - while self.completed_span_order.len() > COMPLETED_SPAN_CONTEXT_LIMIT { - if let Some(expired) = self.completed_span_order.pop_front() { - self.completed_span_contexts.remove(&expired); - } - } - } -} +#[cfg(test)] +use std::time::{Duration, SystemTime, UNIX_EPOCH}; -fn span_kind(event: &Event) -> SpanKind { +pub(super) fn span_kind(event: &Event) -> SpanKind { match semantic_scope_type(event) { Some(ScopeType::Llm) => SpanKind::Client, Some( @@ -843,7 +37,7 @@ fn span_kind(event: &Event) -> SpanKind { } } -fn span_name(event: &Event) -> String { +pub(super) fn span_name(event: &Event) -> String { event.name().to_string() } @@ -867,7 +61,7 @@ fn scope_type_name(scope_type: Option) -> &'static str { } } -fn start_attributes(event: &Event) -> Vec { +pub(super) fn start_attributes(event: &Event) -> Vec { let mut attributes = common_attributes(event); let is_llm = event .category() @@ -877,7 +71,7 @@ fn start_attributes(event: &Event) -> Vec { // Final span metadata should reflect the completed event, especially for mixed-fidelity // Hermes flows where the request can be exact but the terminal error is lossy. attributes.retain(|attribute| { - attribute.key.as_str() != oi::METADATA.as_str() + attribute.key.as_str() != "metadata" && !attribute.key.as_str().starts_with("openinference.metadata") }); } @@ -894,23 +88,23 @@ fn start_attributes(event: &Event) -> Vec { .category() .is_some_and(|category| category.as_str() == "tool") { - attributes.push(KeyValue::new(oi::tool::NAME, event.name().to_string())); + attributes.push(KeyValue::new("tool.name", event.name().to_string())); attributes.push(KeyValue::new( - oi::tool_call::function::NAME, + "tool_call.function.name", event.name().to_string(), )); } if let Some((input, mime_type)) = openinference_input_value(event) { - attributes.push(KeyValue::new(oi::input::VALUE, input.clone())); - attributes.push(KeyValue::new(oi::input::MIME_TYPE, mime_type)); + attributes.push(KeyValue::new("input.value", input.clone())); + attributes.push(KeyValue::new("input.mime_type", mime_type)); if event .category() .is_some_and(|category| category.as_str() == "tool") { - attributes.push(KeyValue::new(oi::tool::PARAMETERS, input.clone())); - attributes.push(KeyValue::new(oi::tool_call::function::ARGUMENTS, input)); + attributes.push(KeyValue::new("tool.parameters", input.clone())); + attributes.push(KeyValue::new("tool_call.function.arguments", input)); } } if is_llm { @@ -919,7 +113,7 @@ fn start_attributes(event: &Event) -> Vec { attributes } -fn end_attributes(event: &Event) -> Vec { +pub(super) fn end_attributes(event: &Event) -> Vec { let mut attributes = Vec::new(); let is_llm = event .category() @@ -928,13 +122,13 @@ fn end_attributes(event: &Event) -> Vec { push_top_level_json_attributes(&mut attributes, "nemo_relay.end.data", event.data()); if let Some(metadata) = event.metadata().and_then(to_json_string) { - attributes.push(KeyValue::new(oi::METADATA, metadata)); + attributes.push(KeyValue::new("metadata", metadata)); } push_top_level_json_attributes(&mut attributes, "openinference.metadata", event.metadata()); push_top_level_json_attributes(&mut attributes, "nemo_relay.end.output", event.output()); if let Some((output, mime_type)) = openinference_output_value(event) { - attributes.push(KeyValue::new(oi::output::VALUE, output)); - attributes.push(KeyValue::new(oi::output::MIME_TYPE, mime_type)); + attributes.push(KeyValue::new("output.value", output)); + attributes.push(KeyValue::new("output.mime_type", mime_type)); } let fallback_usage = if is_llm { manual::usage_from_manual_llm_output(event.output()) @@ -962,7 +156,7 @@ fn end_attributes(event: &Event) -> Vec { && let Some(cost_total) = cost_total_from_llm_event(event, normalized.as_deref(), fallback_usage.as_ref()) { - attributes.push(KeyValue::new(oi::llm::cost::TOTAL, cost_total)); + attributes.push(KeyValue::new("llm.cost.total", cost_total)); } if is_llm { push_llm_response_attributes(&mut attributes, event, normalized.as_deref()); @@ -975,23 +169,23 @@ fn push_llm_usage_attributes(attributes: &mut Vec, usage: Option<&Usag return; }; if let Some(v) = usage.prompt_tokens { - attributes.push(KeyValue::new(oi::llm::token_count::PROMPT, v as i64)); + attributes.push(KeyValue::new("llm.token_count.prompt", v as i64)); } if let Some(v) = usage.completion_tokens { - attributes.push(KeyValue::new(oi::llm::token_count::COMPLETION, v as i64)); + attributes.push(KeyValue::new("llm.token_count.completion", v as i64)); } if let Some(v) = usage.total_tokens { - attributes.push(KeyValue::new(oi::llm::token_count::TOTAL, v as i64)); + attributes.push(KeyValue::new("llm.token_count.total", v as i64)); } if let Some(v) = usage.cache_read_tokens { attributes.push(KeyValue::new( - oi::llm::token_count::prompt_details::CACHE_READ, + "llm.token_count.prompt_details.cache_read", v as i64, )); } if let Some(v) = usage.cache_write_tokens { attributes.push(KeyValue::new( - oi::llm::token_count::prompt_details::CACHE_WRITE, + "llm.token_count.prompt_details.cache_write", v as i64, )); } @@ -1007,7 +201,7 @@ fn push_llm_request_attributes(attributes: &mut Vec, event: &Event) { // provider-shaped (carry `messages`) and would otherwise be misrouted. if let Some(input) = event.input().and_then(replay_llm_payload) { if let Some(provider) = input.get("provider").and_then(Json::as_str) { - attributes.push(KeyValue::new(oi::llm::PROVIDER, provider.to_string())); + attributes.push(KeyValue::new("llm.provider", provider.to_string())); } push_replay_input_messages(attributes, input); return; @@ -1045,7 +239,7 @@ fn push_annotated_request_attributes( request: &AnnotatedLlmRequest, ) { if let Some(params) = request.params.as_ref().and_then(to_json_string) { - attributes.push(KeyValue::new(oi::llm::INVOCATION_PARAMETERS, params)); + attributes.push(KeyValue::new("llm.invocation_parameters", params)); } let mut next_index = 0usize; if let Some(instructions) = request.instructions.as_ref().and_then(message_content_text) { @@ -1448,7 +642,7 @@ fn cost_total_from_llm_event( .and_then(|cost| cost.total_for_currency("USD")) } -fn mark_attributes(event: &Event) -> Vec { +pub(super) fn mark_attributes(event: &Event) -> Vec { let mut attributes = vec![ KeyValue::new("nemo_relay.mark.uuid", event.uuid().to_string()), KeyValue::new( @@ -1486,22 +680,40 @@ fn mark_attributes(event: &Event) -> Vec { fn push_projected_mark_attributes(attributes: &mut Vec, event: &Event) { let mark_name = event.name().to_string(); - attributes.push(KeyValue::new(oi::tool::NAME, mark_name.clone())); - attributes.push(KeyValue::new(oi::tool_call::function::NAME, mark_name)); + attributes.push(KeyValue::new("tool.name", mark_name.clone())); + attributes.push(KeyValue::new("tool_call.function.name", mark_name)); if let Some(data) = event.data().and_then(to_json_string) { - attributes.push(KeyValue::new(oi::output::VALUE, data)); - attributes.push(KeyValue::new(oi::output::MIME_TYPE, "application/json")); + attributes.push(KeyValue::new("output.value", data)); + attributes.push(KeyValue::new("output.mime_type", "application/json")); } if let Some(metadata) = event.metadata().and_then(to_json_string) { - attributes.push(KeyValue::new(oi::METADATA, metadata)); + attributes.push(KeyValue::new("metadata", metadata)); } } +pub(super) fn remove_start_model_name(attributes: &mut Vec) { + attributes.retain(|attribute| attribute.key.as_str() != "llm.model_name"); +} + +pub(super) fn push_model_name(attributes: &mut Vec, model_name: String) { + attributes.push(KeyValue::new("llm.model_name", model_name)); +} + +pub(super) fn push_orphan_mark_attributes(attributes: &mut Vec) { + attributes.push(KeyValue::new("openinference.span.kind", "CHAIN")); + attributes.push(KeyValue::new("nemo_relay.mark.orphan", true)); +} + +pub(super) fn push_tool_mark_attributes(attributes: &mut Vec, event: &Event) { + attributes.push(KeyValue::new("openinference.span.kind", "TOOL")); + push_projected_mark_attributes(attributes, event); +} + fn common_attributes(event: &Event) -> Vec { let mut attributes = vec![ KeyValue::new( - oi::OPENINFERENCE_SPAN_KIND, + "openinference.span.kind", openinference_span_kind(semantic_scope_type(event)), ), KeyValue::new("nemo_relay.uuid", event.uuid().to_string()), @@ -1519,32 +731,30 @@ fn common_attributes(event: &Event) -> Vec { ]; if let Some(model_name) = model_name_for_llm_event(event) { - attributes.push(KeyValue::new(oi::llm::MODEL_NAME, model_name)); + attributes.push(KeyValue::new("llm.model_name", model_name)); } if let Some(tool_call_id) = event.tool_call_id() { - attributes.push(KeyValue::new(oi::tool_call::ID, tool_call_id.to_string())); + attributes.push(KeyValue::new("tool_call.id", tool_call_id.to_string())); } if let Some(metadata) = event.metadata().and_then(to_json_string) { - attributes.push(KeyValue::new(oi::METADATA, metadata)); + attributes.push(KeyValue::new("metadata", metadata)); } push_top_level_json_attributes(&mut attributes, "openinference.metadata", event.metadata()); attributes } -fn openinference_span_kind(scope_type: Option) -> OpenInferenceSpanKind { +fn openinference_span_kind(scope_type: Option) -> &'static str { match scope_type { - Some(ScopeType::Agent) => OpenInferenceSpanKind::Agent, - Some(ScopeType::Tool) => OpenInferenceSpanKind::Tool, - Some(ScopeType::Llm) => OpenInferenceSpanKind::Llm, - Some(ScopeType::Retriever) => OpenInferenceSpanKind::Retriever, - Some(ScopeType::Embedder) => OpenInferenceSpanKind::Embedding, - Some(ScopeType::Reranker) => OpenInferenceSpanKind::Reranker, - Some(ScopeType::Guardrail) => OpenInferenceSpanKind::Guardrail, - Some(ScopeType::Evaluator) => OpenInferenceSpanKind::Evaluator, - Some(ScopeType::Function | ScopeType::Custom | ScopeType::Unknown) | None => { - OpenInferenceSpanKind::Chain - } + Some(ScopeType::Agent) => "AGENT", + Some(ScopeType::Tool) => "TOOL", + Some(ScopeType::Llm) => "LLM", + Some(ScopeType::Retriever) => "RETRIEVER", + Some(ScopeType::Embedder) => "EMBEDDING", + Some(ScopeType::Reranker) => "RERANKER", + Some(ScopeType::Guardrail) => "GUARDRAIL", + Some(ScopeType::Evaluator) => "EVALUATOR", + Some(ScopeType::Function | ScopeType::Custom | ScopeType::Unknown) | None => "CHAIN", } } @@ -1797,6 +1007,7 @@ fn to_json_string(value: &T) -> Option { serde_json::to_string(value).ok() } +#[cfg(test)] fn local_parent_span_context(span_context: &SpanContext) -> SpanContext { SpanContext::new( span_context.trace_id(), @@ -1807,6 +1018,7 @@ fn local_parent_span_context(span_context: &SpanContext) -> SpanContext { ) } +#[cfg(test)] fn to_system_time(timestamp: DateTime) -> SystemTime { let seconds = timestamp.timestamp(); let nanos = timestamp.timestamp_subsec_nanos(); diff --git a/crates/core/src/observability/otel.rs b/crates/core/src/observability/otel.rs index d9b19a1d7..3614a97a0 100644 --- a/crates/core/src/observability/otel.rs +++ b/crates/core/src/observability/otel.rs @@ -3,12 +3,10 @@ //! OpenTelemetry subscriber support for NeMo Relay. //! -//! This crate adapts NeMo Relay lifecycle events into OpenTelemetry trace spans: -//! -//! - scope/tool/LLM `Start` events open spans -//! - matching `End` events close spans -//! - `Mark` events become span events by default, with an optional visible child-span projection -//! - orphan marks fall back to zero-duration spans so they still reach OTLP +//! This crate adapts NeMo Relay lifecycle events into the selected `full`, +//! `gen_ai`, or `openinference` OpenTelemetry trace projection. Scope start and +//! end events open and close supported spans. Mark behavior is fixed by the +//! selected projection. //! //! The public API is intentionally small: //! @@ -16,17 +14,22 @@ //! - [`OpenTelemetrySubscriber`] exposes a NeMo Relay [`EventSubscriberFn`] and //! convenience `register` / `deregister` / `force_flush` / `shutdown` methods -use std::collections::{HashMap, VecDeque}; +use std::cell::RefCell; +use std::collections::{HashMap, HashSet, VecDeque}; +use std::sync::mpsc; use std::sync::{Arc, Mutex}; +use std::thread; use std::time::{Duration, SystemTime, UNIX_EPOCH}; +#[cfg(test)] +use super::validate_attribute_mappings; use super::{ - MarkProjection, OtlpAttributeMapping, apply_attribute_mappings, attribute_mapping_aliases, - attribute_mapping_inputs, default_mark_exclude_names, effective_mark_projection, - estimate_cost_for_response_or_model, estimate_cost_for_response_or_requested_model, manual, - model_name_for_llm_event, push_serialized_top_level_attributes, - push_session_identity_attributes, push_top_level_json_attributes, relay_span_id, - relay_trace_id, validate_attribute_mappings, + MarkProjection, OpenTelemetryType, OtlpAttributeMapping, apply_attribute_mappings, + attribute_mapping_aliases, attribute_mapping_inputs, default_mark_exclude_names, + effective_mark_projection, estimate_cost_for_response_or_model, + estimate_cost_for_response_or_requested_model, manual, model_name_for_llm_event, + push_serialized_top_level_attributes, push_session_identity_attributes, + push_top_level_json_attributes, }; use crate::api::event::{Event, EventNormalizationExt, ScopeCategory}; use crate::api::runtime::EventSubscriberFn; @@ -36,29 +39,69 @@ use crate::codec::response::CostEstimate; use crate::error::FlowError; use chrono::{DateTime, Utc}; use opentelemetry::trace::{ - Span as _, SpanContext, SpanKind, TraceContextExt, Tracer, TracerProvider as _, + Span as _, SpanContext, SpanId, SpanKind, TraceContextExt, TraceId, Tracer, TracerProvider as _, }; use opentelemetry::{Context, KeyValue}; use opentelemetry_otlp::{Protocol, SpanExporter, WithExportConfig, WithHttpConfig}; use opentelemetry_sdk::Resource; -use opentelemetry_sdk::trace::{SdkTracer, SdkTracerProvider, Span}; +use opentelemetry_sdk::trace::{ + IdGenerator, RandomIdGenerator, SdkTracer, SdkTracerProvider, Span, +}; use uuid::Uuid; const COMPLETED_SPAN_CONTEXT_LIMIT: usize = 4096; use opentelemetry_otlp::WithTonicConfig; -use tokio::runtime::Handle; use tonic::metadata::{MetadataKey, MetadataMap, MetadataValue}; +thread_local! { + static PENDING_RELAY_IDS: RefCell> = const { RefCell::new(None) }; +} + +#[derive(Clone, Debug, Default)] +pub(crate) struct RelayIdGenerator; + +impl IdGenerator for RelayIdGenerator { + fn new_trace_id(&self) -> TraceId { + PENDING_RELAY_IDS + .with(|ids| ids.borrow().map(|(trace_id, _)| trace_id)) + .unwrap_or_else(|| RandomIdGenerator::default().new_trace_id()) + } + + fn new_span_id(&self) -> SpanId { + PENDING_RELAY_IDS + .with(|ids| ids.borrow().map(|(_, span_id)| span_id)) + .unwrap_or_else(|| RandomIdGenerator::default().new_span_id()) + } +} + +fn with_relay_ids(uuid: Uuid, build: impl FnOnce() -> T) -> T { + struct ResetPendingIds; + + impl Drop for ResetPendingIds { + fn drop(&mut self) { + PENDING_RELAY_IDS.with(|ids| { + ids.replace(None); + }); + } + } + + PENDING_RELAY_IDS.with(|ids| { + ids.replace(Some(( + super::relay_trace_id(uuid), + super::relay_span_id(uuid), + ))); + }); + let _reset = ResetPendingIds; + build() +} + /// Result type for the OpenTelemetry subscriber crate. pub type Result = std::result::Result; /// Errors produced while configuring or operating the OpenTelemetry subscriber. #[derive(Debug, thiserror::Error)] pub enum OpenTelemetryError { - /// The tonic gRPC exporter requires an active Tokio runtime. - #[error("the OTLP gRPC exporter requires an active Tokio runtime")] - MissingTokioRuntime, /// Failed to parse a configured gRPC metadata header. #[error("invalid OTLP gRPC header {key:?}: {message}")] InvalidGrpcHeader { @@ -67,6 +110,22 @@ pub enum OpenTelemetryError { /// Parser failure message. message: String, }, + /// A configured OTLP header name or value is invalid. + #[error("invalid OTLP header {key:?}: {message}")] + InvalidHeader { + /// Header name that failed validation. + key: String, + /// Validation failure message. + message: String, + }, + /// Process-global OTLP header variables cannot be isolated per endpoint. + #[error( + "{variable} is not supported because process-global OTLP headers can leak across endpoints; use the endpoint headers or header_env configuration" + )] + GlobalHeaderEnvironmentUnsupported { + /// Environment variable that was set. + variable: &'static str, + }, /// Failed to build the OTLP exporter. #[error("failed to build the OTLP exporter: {0}")] ExporterBuild(String), @@ -74,6 +133,7 @@ pub enum OpenTelemetryError { #[error("OpenTelemetry tracer provider error: {0}")] Provider(String), /// Attribute mapping configuration was invalid. + #[cfg(test)] #[error("invalid attribute mappings: {0}")] InvalidAttributeMappings(String), /// Registration errors from the core runtime. @@ -94,7 +154,8 @@ pub enum OtlpTransport { /// Configuration for the OpenTelemetry subscriber. #[derive(Debug, Clone)] pub struct OpenTelemetryConfig { - endpoint: Option, + otel_type: OpenTelemetryType, + endpoint: String, headers: HashMap, resource_attributes: HashMap, service_name: String, @@ -108,16 +169,17 @@ pub struct OpenTelemetryConfig { transport: OtlpTransport, } -impl Default for OpenTelemetryConfig { - fn default() -> Self { +impl OpenTelemetryConfig { + fn default_values() -> Self { Self { - endpoint: None, + otel_type: OpenTelemetryType::Full, + endpoint: String::new(), headers: HashMap::new(), resource_attributes: HashMap::new(), - service_name: "nemo-relay".to_string(), + service_name: "unknown_service".to_string(), service_namespace: None, service_version: None, - instrumentation_scope: "nemo-relay-otel".to_string(), + instrumentation_scope: "opentelemetry".to_string(), mark_projection: MarkProjection::default(), mark_exclude_names: default_mark_exclude_names(), attribute_mappings: Vec::new(), @@ -125,30 +187,52 @@ impl Default for OpenTelemetryConfig { transport: OtlpTransport::HttpBinary, } } -} -impl OpenTelemetryConfig { + /// Creates a typed OpenTelemetry exporter for a required OTLP endpoint. + pub fn new(otel_type: OpenTelemetryType, endpoint: impl Into) -> Self { + Self { + otel_type, + endpoint: endpoint.into(), + ..Self::default_values() + } + } + /// Creates an HTTP OTLP config for the given service name. - pub fn http_binary(service_name: impl Into) -> Self { + #[cfg(test)] + pub(crate) fn http_binary(service_name: impl Into) -> Self { Self { service_name: service_name.into(), transport: OtlpTransport::HttpBinary, - ..Self::default() + ..Self::default_values() } } /// Creates a gRPC OTLP config for the given service name. - pub fn grpc(service_name: impl Into) -> Self { + #[cfg(test)] + pub(crate) fn grpc(service_name: impl Into) -> Self { Self { service_name: service_name.into(), transport: OtlpTransport::Grpc, - ..Self::default() + ..Self::default_values() } } /// Overrides the OTLP endpoint. If unset, exporter defaults and OTEL_* env vars apply. - pub fn with_endpoint(mut self, endpoint: impl Into) -> Self { - self.endpoint = Some(endpoint.into()); + #[cfg(test)] + pub(crate) fn with_endpoint(mut self, endpoint: impl Into) -> Self { + self.endpoint = endpoint.into(); + self + } + + /// Selects the OTLP transport. + pub fn with_transport(mut self, transport: OtlpTransport) -> Self { + self.transport = transport; + self + } + + /// Sets the `service.name` resource attribute. + pub fn with_service_name(mut self, service_name: impl Into) -> Self { + self.service_name = service_name.into(); self } @@ -158,6 +242,11 @@ impl OpenTelemetryConfig { self } + #[cfg(test)] + pub(crate) fn header(&self, key: &str) -> Option<&str> { + self.headers.get(key).map(String::as_str) + } + /// Adds a resource attribute as a string key/value pair. pub fn with_resource_attribute( mut self, @@ -191,43 +280,12 @@ impl OpenTelemetryConfig { self.instrumentation_scope = scope.into(); self } +} - /// Selects how point-in-time marks are represented in exported traces. - pub fn with_mark_projection(mut self, mark_projection: MarkProjection) -> Self { - self.mark_projection = mark_projection; - self - } - - /// Excludes named marks from tool projection while preserving their native - /// event representation. The default excludes high-volume `llm.chunk` - /// marks. - pub fn with_mark_exclude_names(mut self, names: I) -> Self - where - I: IntoIterator, - S: Into, - { - self.mark_exclude_names = names.into_iter().map(Into::into).collect(); - self - } - - /// Adds a typed attribute copy after event payload projection. - pub fn with_attribute_mapping( - mut self, - key: impl Into, - alias: impl Into, - ) -> Self { - self.attribute_mappings - .push(OtlpAttributeMapping::new(key, alias)); - self - } - - /// Replaces the configured typed attribute copies. - pub fn with_attribute_mappings(mut self, mappings: I) -> Self - where - I: IntoIterator, - { - self.attribute_mappings = mappings.into_iter().collect(); - self +#[cfg(test)] +impl Default for OpenTelemetryConfig { + fn default() -> Self { + Self::default_values() } } @@ -239,15 +297,17 @@ pub struct OpenTelemetrySubscriber { /// Options for constructing an OpenTelemetry subscriber from an existing tracer provider. #[derive(Debug, Clone)] -pub struct OpenTelemetrySubscriberOptions { +#[cfg(test)] +pub(crate) struct OpenTelemetrySubscriberOptions { /// How mark events are projected into the trace. - pub mark_projection: MarkProjection, + pub(crate) mark_projection: MarkProjection, /// Mark names excluded from tool projection. - pub mark_exclude_names: Vec, + pub(crate) mark_exclude_names: Vec, /// Typed OTLP attributes copied to alias keys. - pub attribute_mappings: Vec, + pub(crate) attribute_mappings: Vec, } +#[cfg(test)] impl Default for OpenTelemetrySubscriberOptions { fn default() -> Self { Self { @@ -261,25 +321,42 @@ impl Default for OpenTelemetrySubscriberOptions { struct Inner { processor: Arc>, subscriber: EventSubscriberFn, + _runtime: Option, +} + +struct ExporterRuntime { + stop: Option>, + thread: Option>, +} + +impl Drop for ExporterRuntime { + fn drop(&mut self) { + self.stop.take(); + if let Some(thread) = self.thread.take() { + let _ = thread.join(); + } + } } impl OpenTelemetrySubscriber { /// Builds a subscriber backed by a new OTLP tracer provider. pub fn new(config: OpenTelemetryConfig) -> Result { - if config.transport == OtlpTransport::Grpc && tokio::runtime::Handle::try_current().is_err() - { - return Err(OpenTelemetryError::MissingTokioRuntime); + if config.endpoint.trim().is_empty() { + return Err(OpenTelemetryError::ExporterBuild( + "endpoint must be a nonblank string".to_string(), + )); } - validate_attribute_mappings(&config.attribute_mappings) - .map_err(OpenTelemetryError::InvalidAttributeMappings)?; - - let provider = build_tracer_provider(&config)?; - Ok(Self::from_tracer_provider_with_scope( + reject_global_header_environment()?; + validate_headers(&config.headers)?; + let (provider, runtime) = build_owned_tracer_provider(config.clone())?; + Ok(Self::from_tracer_provider_with_scope_and_type( provider, config.instrumentation_scope, + config.otel_type, config.mark_projection, config.mark_exclude_names, config.attribute_mappings, + Some(runtime), )) } @@ -288,52 +365,34 @@ impl OpenTelemetrySubscriber { provider: SdkTracerProvider, instrumentation_scope: impl Into, ) -> Self { - Self::from_tracer_provider_with_scope( + Self::from_tracer_provider_with_type( provider, - instrumentation_scope.into(), - MarkProjection::default(), - default_mark_exclude_names(), - Vec::new(), + instrumentation_scope, + OpenTelemetryType::Full, ) } - /// Builds a subscriber from a tracer provider with an explicit mark projection. - pub fn from_tracer_provider_with_mark_projection( + /// Builds a typed subscriber from an already-configured tracer provider. + pub fn from_tracer_provider_with_type( provider: SdkTracerProvider, instrumentation_scope: impl Into, - mark_projection: MarkProjection, + otel_type: OpenTelemetryType, ) -> Self { - Self::from_tracer_provider_with_scope( + let instrumentation_scope = instrumentation_scope.into(); + Self::from_tracer_provider_with_scope_and_type( provider, - instrumentation_scope.into(), - mark_projection, + instrumentation_scope, + otel_type, + MarkProjection::default(), default_mark_exclude_names(), Vec::new(), - ) - } - - /// Builds a subscriber with explicit mark projection and exclusion names. - pub fn from_tracer_provider_with_mark_projection_and_exclusions( - provider: SdkTracerProvider, - instrumentation_scope: impl Into, - mark_projection: MarkProjection, - mark_exclude_names: I, - ) -> Self - where - I: IntoIterator, - S: Into, - { - Self::from_tracer_provider_with_scope( - provider, - instrumentation_scope.into(), - mark_projection, - mark_exclude_names.into_iter().map(Into::into).collect(), - Vec::new(), + None, ) } /// Builds a subscriber from a tracer provider with typed attribute copies. - pub fn from_tracer_provider_with_attribute_mappings( + #[cfg(test)] + pub(crate) fn from_tracer_provider_with_attribute_mappings( provider: SdkTracerProvider, instrumentation_scope: impl Into, attribute_mappings: I, @@ -353,33 +412,59 @@ impl OpenTelemetrySubscriber { } /// Builds a subscriber from a tracer provider with composable projection options. - pub fn from_tracer_provider_with_options( + #[cfg(test)] + pub(crate) fn from_tracer_provider_with_options( provider: SdkTracerProvider, instrumentation_scope: impl Into, options: OpenTelemetrySubscriberOptions, ) -> Result { validate_attribute_mappings(&options.attribute_mappings) .map_err(OpenTelemetryError::InvalidAttributeMappings)?; - Ok(Self::from_tracer_provider_with_scope( + Ok(Self::from_tracer_provider_with_scope_and_type( provider, instrumentation_scope.into(), + OpenTelemetryType::Full, options.mark_projection, options.mark_exclude_names, options.attribute_mappings, + None, )) } - fn from_tracer_provider_with_scope( + #[cfg(test)] + pub(crate) fn from_tracer_provider_with_type_and_options( + provider: SdkTracerProvider, + instrumentation_scope: impl Into, + otel_type: OpenTelemetryType, + options: OpenTelemetrySubscriberOptions, + ) -> Result { + validate_attribute_mappings(&options.attribute_mappings) + .map_err(OpenTelemetryError::InvalidAttributeMappings)?; + Ok(Self::from_tracer_provider_with_scope_and_type( + provider, + instrumentation_scope.into(), + otel_type, + options.mark_projection, + options.mark_exclude_names, + options.attribute_mappings, + None, + )) + } + + fn from_tracer_provider_with_scope_and_type( provider: SdkTracerProvider, instrumentation_scope: String, + otel_type: OpenTelemetryType, mark_projection: MarkProjection, mark_exclude_names: Vec, attribute_mappings: Vec, + runtime: Option, ) -> Self { let processor = Arc::new(Mutex::new( OtelEventProcessor::new_with_mark_projection_and_exclusions_and_mappings( provider, instrumentation_scope, + otel_type, mark_projection, mark_exclude_names, attribute_mappings, @@ -399,6 +484,7 @@ impl OpenTelemetrySubscriber { inner: Arc::new(Inner { processor, subscriber, + _runtime: runtime, }), } } @@ -448,7 +534,15 @@ impl OpenTelemetrySubscriber { /// /// Call `deregister(...)` first if the subscriber is still registered with NeMo Relay. pub fn shutdown(&self) -> Result<()> { - flush_subscribers()?; + let barrier_error = flush_subscribers().err().map(OpenTelemetryError::Core); + let provider_result = self.shutdown_provider(); + if let Some(error) = barrier_error { + return Err(error); + } + provider_result + } + + pub(crate) fn shutdown_provider(&self) -> Result<()> { let guard = self.inner.processor.lock().map_err(|_| { OpenTelemetryError::Provider("the subscriber state lock was poisoned".to_string()) })?; @@ -465,6 +559,87 @@ impl OpenTelemetrySubscriber { } } +fn build_owned_tracer_provider( + config: OpenTelemetryConfig, +) -> Result<(SdkTracerProvider, ExporterRuntime)> { + let (result_sender, result_receiver) = mpsc::sync_channel(1); + let (stop_sender, stop_receiver) = mpsc::channel(); + let runtime_thread = thread::Builder::new() + .name("nemo-relay-otlp".to_string()) + .spawn(move || { + let runtime = match tokio::runtime::Builder::new_multi_thread() + .worker_threads(1) + .enable_all() + .build() + { + Ok(runtime) => runtime, + Err(error) => { + let _ = result_sender + .send(Err(OpenTelemetryError::ExporterBuild(error.to_string()))); + return; + } + }; + let provider = { + let _guard = runtime.enter(); + build_tracer_provider(&config) + }; + let keep_runtime_alive = provider.is_ok(); + let _ = result_sender.send(provider); + if keep_runtime_alive { + let _ = stop_receiver.recv(); + } + }) + .map_err(|error| OpenTelemetryError::ExporterBuild(error.to_string()))?; + let provider = result_receiver.recv().map_err(|error| { + OpenTelemetryError::ExporterBuild(format!("exporter runtime stopped unexpectedly: {error}")) + })??; + Ok(( + provider, + ExporterRuntime { + stop: Some(stop_sender), + thread: Some(runtime_thread), + }, + )) +} + +fn reject_global_header_environment() -> Result<()> { + for variable in [ + "OTEL_EXPORTER_OTLP_HEADERS", + "OTEL_EXPORTER_OTLP_TRACES_HEADERS", + ] { + if std::env::var_os(variable).is_some_and(|value| !value.is_empty()) { + return Err(OpenTelemetryError::GlobalHeaderEnvironmentUnsupported { variable }); + } + } + Ok(()) +} + +pub(crate) fn validate_headers(headers: &HashMap) -> Result<()> { + let mut normalized = HashSet::new(); + for (key, value) in headers { + let normalized_key = key.to_ascii_lowercase(); + if !normalized.insert(normalized_key) { + return Err(OpenTelemetryError::InvalidHeader { + key: key.clone(), + message: "header names must be unique ignoring ASCII case".to_string(), + }); + } + reqwest::header::HeaderName::from_bytes(key.as_bytes()).map_err(|error| { + OpenTelemetryError::InvalidHeader { + key: key.clone(), + message: error.to_string(), + } + })?; + reqwest::header::HeaderValue::from_str(value).map_err(|error| { + OpenTelemetryError::InvalidHeader { + key: key.clone(), + message: error.to_string(), + } + })?; + } + Ok(()) +} + fn build_tracer_provider(config: &OpenTelemetryConfig) -> Result { let exporter = match config.transport { OtlpTransport::HttpBinary => { @@ -472,9 +647,7 @@ fn build_tracer_provider(config: &OpenTelemetryConfig) -> Result Result Result) -> Result { @@ -552,19 +720,22 @@ fn build_grpc_metadata(headers: &HashMap) -> Result Ok(metadata) } -struct ActiveSpan { +pub(super) struct ActiveSpan { span: Span, span_context: SpanContext, start_model_name: Option, projected_attributes: Vec, } -struct OtelEventProcessor { - active_spans: HashMap, - completed_span_contexts: HashMap, - completed_span_order: VecDeque, +pub(super) struct OtelEventProcessor { + pub(super) active_spans: HashMap, + pub(super) completed_span_contexts: HashMap, + pub(super) completed_span_order: VecDeque, + suppressed_parent_contexts: HashMap, + suppressed_parent_order: VecDeque, provider: SdkTracerProvider, tracer: SdkTracer, + otel_type: OpenTelemetryType, mark_projection: MarkProjection, mark_exclude_names: Vec, attribute_mappings: Vec, @@ -576,6 +747,54 @@ impl OtelEventProcessor { Self::new_with_mark_projection(provider, instrumentation_scope, MarkProjection::default()) } + #[cfg(test)] + pub(super) fn new_openinference( + provider: SdkTracerProvider, + instrumentation_scope: String, + ) -> Self { + Self::new_with_mark_projection_and_exclusions_and_mappings( + provider, + instrumentation_scope, + OpenTelemetryType::OpenInference, + MarkProjection::default(), + default_mark_exclude_names(), + Vec::new(), + ) + } + + #[cfg(test)] + pub(super) fn new_openinference_with_mark_projection( + provider: SdkTracerProvider, + instrumentation_scope: String, + mark_projection: MarkProjection, + ) -> Self { + Self::new_with_mark_projection_and_exclusions_and_mappings( + provider, + instrumentation_scope, + OpenTelemetryType::OpenInference, + mark_projection, + default_mark_exclude_names(), + Vec::new(), + ) + } + + #[cfg(test)] + pub(super) fn new_openinference_with_mark_projection_and_exclusions( + provider: SdkTracerProvider, + instrumentation_scope: String, + mark_projection: MarkProjection, + mark_exclude_names: Vec, + ) -> Self { + Self::new_with_mark_projection_and_exclusions_and_mappings( + provider, + instrumentation_scope, + OpenTelemetryType::OpenInference, + mark_projection, + mark_exclude_names, + Vec::new(), + ) + } + #[cfg(test)] fn new_with_mark_projection( provider: SdkTracerProvider, @@ -600,6 +819,7 @@ impl OtelEventProcessor { Self::new_with_mark_projection_and_exclusions_and_mappings( provider, instrumentation_scope, + OpenTelemetryType::Full, mark_projection, mark_exclude_names, Vec::new(), @@ -609,6 +829,7 @@ impl OtelEventProcessor { fn new_with_mark_projection_and_exclusions_and_mappings( provider: SdkTracerProvider, instrumentation_scope: String, + otel_type: OpenTelemetryType, mark_projection: MarkProjection, mark_exclude_names: Vec, attribute_mappings: Vec, @@ -618,15 +839,18 @@ impl OtelEventProcessor { active_spans: HashMap::new(), completed_span_contexts: HashMap::new(), completed_span_order: VecDeque::new(), + suppressed_parent_contexts: HashMap::new(), + suppressed_parent_order: VecDeque::new(), provider, tracer, + otel_type, mark_projection, mark_exclude_names, attribute_mappings, } } - fn process(&mut self, event: &Event) { + pub(super) fn process(&mut self, event: &Event) { match event.scope_category() { Some(ScopeCategory::Start) => self.process_start(event), Some(ScopeCategory::End) => self.process_end(event), @@ -634,7 +858,7 @@ impl OtelEventProcessor { } } - fn force_flush(&self) -> Result<()> { + pub(super) fn force_flush(&self) -> Result<()> { self.provider .force_flush() .map_err(|e| OpenTelemetryError::Provider(e.to_string())) @@ -649,21 +873,44 @@ impl OtelEventProcessor { fn process_start(&mut self, event: &Event) { self.remove_completed_span_context(event.uuid()); let parent_context = self.parent_context(event); + if self.otel_type == OpenTelemetryType::GenAi && !super::otel_genai::supports(event) { + let parent_span_context = parent_context.span().span_context().clone(); + if parent_span_context.is_valid() { + self.record_suppressed_parent_context(event.uuid(), parent_span_context); + } + return; + } let is_trace_root = !parent_context.span().span_context().is_valid(); let start_model_name = model_name_for_llm_event(event); - let mut span = self - .tracer - .span_builder(span_name(event)) - .with_kind(span_kind(event)) - .with_start_time(to_system_time(*event.timestamp())) - .with_trace_id(relay_trace_id(event.uuid())) - .with_span_id(relay_span_id(event.uuid())) - .start_with_context(&self.tracer, &parent_context); - let mut attributes = start_attributes(event); - if start_model_name.is_some() { + let span_name = match self.otel_type { + OpenTelemetryType::Full => span_name(event), + OpenTelemetryType::GenAi => super::otel_genai::span_name(event), + OpenTelemetryType::OpenInference => super::openinference::span_name(event), + }; + let span_kind = match self.otel_type { + OpenTelemetryType::Full => span_kind(event), + OpenTelemetryType::GenAi => super::otel_genai::span_kind(event), + OpenTelemetryType::OpenInference => super::openinference::span_kind(event), + }; + let mut span = with_relay_ids(event.uuid(), || { + self.tracer + .span_builder(span_name) + .with_kind(span_kind) + .with_start_time(to_system_time(*event.timestamp())) + .start_with_context(&self.tracer, &parent_context) + }); + let mut attributes = match self.otel_type { + OpenTelemetryType::Full => start_attributes(event), + OpenTelemetryType::GenAi => super::otel_genai::start_attributes(event), + OpenTelemetryType::OpenInference => super::openinference::start_attributes(event), + }; + if self.otel_type == OpenTelemetryType::Full && start_model_name.is_some() { attributes.retain(|attribute| attribute.key.as_str() != "nemo_relay.model_name"); } - if is_trace_root { + if self.otel_type == OpenTelemetryType::OpenInference && start_model_name.is_some() { + super::openinference::remove_start_model_name(&mut attributes); + } + if self.otel_type != OpenTelemetryType::GenAi && is_trace_root { push_session_identity_attributes(&mut attributes, event); } let projected_attributes = attribute_mapping_inputs(&attributes, &self.attribute_mappings); @@ -687,10 +934,23 @@ impl OtelEventProcessor { self.record_completed_span_context(event.uuid(), active_span.span_context.clone()); super::set_span_status_from_event_metadata(&mut active_span.span, event); - let mut attributes = end_attributes(event); - if let Some(model_name) = model_name_for_llm_event(event).or(active_span.start_model_name) { + let mut attributes = match self.otel_type { + OpenTelemetryType::Full => end_attributes(event), + OpenTelemetryType::GenAi => super::otel_genai::end_attributes(event), + OpenTelemetryType::OpenInference => super::openinference::end_attributes(event), + }; + let end_model_name = + model_name_for_llm_event(event).or_else(|| active_span.start_model_name.take()); + if self.otel_type == OpenTelemetryType::Full + && let Some(model_name) = end_model_name.clone() + { attributes.push(KeyValue::new("nemo_relay.model_name", model_name)); } + if self.otel_type == OpenTelemetryType::OpenInference + && let Some(model_name) = end_model_name + { + super::openinference::push_model_name(&mut attributes, model_name); + } if !self.attribute_mappings.is_empty() { let mut projected_attributes = active_span.projected_attributes; projected_attributes.extend(attributes.iter().cloned()); @@ -706,6 +966,9 @@ impl OtelEventProcessor { } fn process_mark(&mut self, event: &Event) { + if self.otel_type == OpenTelemetryType::GenAi { + return; + } if effective_mark_projection(event, self.mark_projection, &self.mark_exclude_names) == MarkProjection::Tool { @@ -714,7 +977,7 @@ impl OtelEventProcessor { } let mark_name = event.name().to_string(); let timestamp = to_system_time(*event.timestamp()); - let mut attributes = mark_attributes(event); + let mut attributes = self.mark_attributes(event); if event.name() == "session.start" { push_session_identity_attributes(&mut attributes, event); } @@ -730,15 +993,18 @@ impl OtelEventProcessor { return; } - let mut span = self - .tracer - .span_builder(format!("mark:{mark_name}")) - .with_kind(SpanKind::Internal) - .with_start_time(timestamp) - .with_trace_id(relay_trace_id(event.uuid())) - .with_span_id(relay_span_id(event.uuid())) - .start_with_context(&self.tracer, &self.parent_context(event)); - attributes.push(KeyValue::new("nemo_relay.mark.orphan", true)); + let mut span = with_relay_ids(event.uuid(), || { + self.tracer + .span_builder(format!("mark:{mark_name}")) + .with_kind(SpanKind::Internal) + .with_start_time(timestamp) + .start_with_context(&self.tracer, &self.parent_context(event)) + }); + if self.otel_type == OpenTelemetryType::OpenInference { + super::openinference::push_orphan_mark_attributes(&mut attributes); + } else { + attributes.push(KeyValue::new("nemo_relay.mark.orphan", true)); + } apply_attribute_mappings(&mut attributes, &self.attribute_mappings); span.set_attributes(attributes); span.end_with_timestamp(timestamp); @@ -747,29 +1013,40 @@ impl OtelEventProcessor { fn process_mark_as_tool(&mut self, event: &Event) { let timestamp = to_system_time(*event.timestamp()); let orphan = self.find_parent_span(event).is_none(); - let mut attributes = mark_attributes(event); + let mut attributes = self.mark_attributes(event); if event.name() == "session.start" { push_session_identity_attributes(&mut attributes, event); } attributes.push(KeyValue::new("nemo_relay.mark.projection", "tool")); - attributes.push(KeyValue::new("nemo_relay.scope_type", "tool")); + if self.otel_type == OpenTelemetryType::OpenInference { + super::openinference::push_tool_mark_attributes(&mut attributes, event); + } else { + attributes.push(KeyValue::new("nemo_relay.scope_type", "tool")); + } if orphan { attributes.push(KeyValue::new("nemo_relay.mark.orphan", true)); } apply_attribute_mappings(&mut attributes, &self.attribute_mappings); - let mut span = self - .tracer - .span_builder(format!("mark:{}", event.name())) - .with_kind(SpanKind::Internal) - .with_start_time(timestamp) - .with_trace_id(relay_trace_id(event.uuid())) - .with_span_id(relay_span_id(event.uuid())) - .start_with_context(&self.tracer, &self.parent_context(event)); + let mut span = with_relay_ids(event.uuid(), || { + self.tracer + .span_builder(format!("mark:{}", event.name())) + .with_kind(SpanKind::Internal) + .with_start_time(timestamp) + .start_with_context(&self.tracer, &self.parent_context(event)) + }); span.set_attributes(attributes); span.end_with_timestamp(timestamp); } + fn mark_attributes(&self, event: &Event) -> Vec { + match self.otel_type { + OpenTelemetryType::Full => mark_attributes(event), + OpenTelemetryType::OpenInference => super::openinference::mark_attributes(event), + OpenTelemetryType::GenAi => Vec::new(), + } + } + fn parent_context(&self, event: &Event) -> Context { if let Some(active_span) = self.find_parent_span(event) { return Context::new().with_remote_span_context(active_span.span_context.clone()); @@ -777,6 +1054,11 @@ impl OtelEventProcessor { event .parent_uuid() .and_then(|uuid| self.completed_span_contexts.get(&uuid)) + .or_else(|| { + event + .parent_uuid() + .and_then(|uuid| self.suppressed_parent_contexts.get(&uuid)) + }) .map(|span_context| Context::new().with_remote_span_context(span_context.clone())) .unwrap_or_default() } @@ -817,6 +1099,21 @@ impl OtelEventProcessor { } } } + + fn record_suppressed_parent_context(&mut self, uuid: Uuid, span_context: SpanContext) { + if self + .suppressed_parent_contexts + .insert(uuid, span_context) + .is_none() + { + self.suppressed_parent_order.push_back(uuid); + } + while self.suppressed_parent_order.len() > COMPLETED_SPAN_CONTEXT_LIMIT { + if let Some(expired) = self.suppressed_parent_order.pop_front() { + self.suppressed_parent_contexts.remove(&expired); + } + } + } } fn span_kind(event: &Event) -> SpanKind { diff --git a/crates/core/src/observability/otel_genai.rs b/crates/core/src/observability/otel_genai.rs new file mode 100644 index 000000000..fde935a1b --- /dev/null +++ b/crates/core/src/observability/otel_genai.rs @@ -0,0 +1,503 @@ +// SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +//! OpenTelemetry GenAI semantic-convention projection. + +use crate::api::event::{Event, EventNormalizationExt}; +use crate::api::scope::ScopeType; +use crate::codec::request::ApiSpecificRequest; +use crate::codec::response::FinishReason; +use crate::json::Json; +use opentelemetry::KeyValue; +use opentelemetry::trace::SpanKind; +use opentelemetry_semantic_conventions::attribute as semconv; +use serde_json::{Map, Value}; + +const OPERATION_CHAT: &str = "chat"; +const OPERATION_EMBEDDINGS: &str = "embeddings"; +const OPERATION_EXECUTE_TOOL: &str = "execute_tool"; +const OPERATION_GENERATE_CONTENT: &str = "generate_content"; +const OPERATION_INVOKE_AGENT: &str = "invoke_agent"; +const OPERATION_RETRIEVAL: &str = "retrieval"; +const OPERATION_TEXT_COMPLETION: &str = "text_completion"; + +// OpenTelemetry Rust 0.32 still predates generated constants for these +// development attributes. Keep the missing keys in one projection-local block +// until the generated crate exposes them. +const GEN_AI_PROVIDER_NAME: &str = "gen_ai.provider.name"; +const GEN_AI_RETRIEVAL_TOP_K: &str = "gen_ai.retrieval.top_k"; +const GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS: &str = "gen_ai.usage.cache_creation.input_tokens"; +const GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS: &str = "gen_ai.usage.cache_read.input_tokens"; + +pub(super) fn supports(event: &Event) -> bool { + matches!( + event.scope_type(), + Some( + ScopeType::Agent + | ScopeType::Llm + | ScopeType::Tool + | ScopeType::Embedder + | ScopeType::Retriever + ) + ) +} + +pub(super) fn span_name(event: &Event) -> String { + let operation = operation_name(event); + let qualifier = match event.scope_type() { + Some(ScopeType::Agent) => Some(agent_name(event)), + Some(ScopeType::Tool) => Some(tool_name(event)), + Some(ScopeType::Retriever) => data_source_id(event), + Some(ScopeType::Llm | ScopeType::Embedder) => request_model(event), + _ => None, + }; + qualifier.filter(|value| !value.is_empty()).map_or_else( + || operation.to_string(), + |value| format!("{operation} {value}"), + ) +} + +pub(super) fn span_kind(event: &Event) -> SpanKind { + match event.scope_type() { + Some(ScopeType::Agent | ScopeType::Tool) => SpanKind::Internal, + _ => SpanKind::Client, + } +} + +pub(super) fn start_attributes(event: &Event) -> Vec { + let mut attributes = Vec::new(); + attributes.push(KeyValue::new( + "gen_ai.operation.name", + operation_name(event), + )); + + match event.scope_type() { + Some(ScopeType::Agent) => { + push_conversation_attribute(&mut attributes, event); + push_agent_attributes(&mut attributes, event); + } + Some(ScopeType::Llm) => { + push_provider_and_server_attributes(&mut attributes, event); + push_conversation_attribute(&mut attributes, event); + push_llm_request_attributes(&mut attributes, event); + } + Some(ScopeType::Tool) => push_tool_attributes(&mut attributes, event), + Some(ScopeType::Retriever) => { + push_provider_and_server_attributes(&mut attributes, event); + push_retrieval_attributes(&mut attributes, event); + } + Some(ScopeType::Embedder) => { + push_provider_and_server_attributes(&mut attributes, event); + push_model_attribute(&mut attributes, event); + } + _ => {} + } + attributes +} + +pub(super) fn end_attributes(event: &Event) -> Vec { + let mut attributes = Vec::new(); + push_error_attributes(&mut attributes, event); + match event.scope_type() { + Some(ScopeType::Llm) => push_llm_response_attributes(&mut attributes, event), + Some(ScopeType::Embedder) => push_embedding_response_attributes(&mut attributes, event), + _ => {} + } + attributes +} + +fn push_embedding_response_attributes(attributes: &mut Vec, event: &Event) { + if let Some(value) = scalar_string(event, &["gen_ai.response.model", "response_model", "model"]) + { + attributes.push(KeyValue::new("gen_ai.response.model", value)); + } + if let Some(value) = scalar_i64( + event, + &["gen_ai.usage.input_tokens", "input_tokens", "prompt_tokens"], + ) { + attributes.push(KeyValue::new("gen_ai.usage.input_tokens", value)); + } +} + +fn operation_name(event: &Event) -> &'static str { + match event.scope_type() { + Some(ScopeType::Agent) => OPERATION_INVOKE_AGENT, + Some(ScopeType::Tool) => OPERATION_EXECUTE_TOOL, + Some(ScopeType::Embedder) => OPERATION_EMBEDDINGS, + Some(ScopeType::Retriever) => OPERATION_RETRIEVAL, + Some(ScopeType::Llm) => llm_operation_name(event), + _ => OPERATION_CHAT, + } +} + +fn llm_operation_name(event: &Event) -> &'static str { + let name = event.name().to_ascii_lowercase(); + if name.contains("generate_content") || name.contains("generatecontent") { + OPERATION_GENERATE_CONTENT + } else if name.contains("completion") && !name.contains("chat") { + OPERATION_TEXT_COMPLETION + } else { + OPERATION_CHAT + } +} + +fn push_provider_and_server_attributes(attributes: &mut Vec, event: &Event) { + if let Some(provider) = provider_name(event) { + attributes.push(KeyValue::new(GEN_AI_PROVIDER_NAME, provider)); + } + if let Some(address) = scalar_string(event, &[semconv::SERVER_ADDRESS, "server_address"]) { + attributes.push(KeyValue::new(semconv::SERVER_ADDRESS, address)); + } + if let Some(port) = scalar_i64(event, &[semconv::SERVER_PORT, "server_port"]) { + attributes.push(KeyValue::new(semconv::SERVER_PORT, port)); + } +} + +fn push_conversation_attribute(attributes: &mut Vec, event: &Event) { + if let Some(conversation_id) = scalar_string( + event, + &[ + "gen_ai.conversation.id", + "conversation_id", + "session_id", + "thread_id", + ], + ) { + attributes.push(KeyValue::new("gen_ai.conversation.id", conversation_id)); + } +} + +fn push_agent_attributes(attributes: &mut Vec, event: &Event) { + attributes.push(KeyValue::new("gen_ai.agent.name", agent_name(event))); + if let Some(value) = scalar_string(event, &["gen_ai.agent.description", "agent_description"]) { + attributes.push(KeyValue::new("gen_ai.agent.description", value)); + } + push_model_attribute(attributes, event); +} + +fn push_model_attribute(attributes: &mut Vec, event: &Event) { + if let Some(model) = request_model(event) { + attributes.push(KeyValue::new("gen_ai.request.model", model)); + } +} + +fn push_llm_request_attributes(attributes: &mut Vec, event: &Event) { + let Some(request) = event.normalized_llm_request() else { + push_model_attribute(attributes, event); + return; + }; + let request = request.as_ref(); + if let Some(model) = request + .model + .clone() + .or_else(|| event.model_name().map(ToOwned::to_owned)) + { + attributes.push(KeyValue::new("gen_ai.request.model", model)); + } + if let Some(params) = request.params.as_ref() { + if let Some(value) = params.temperature { + attributes.push(KeyValue::new("gen_ai.request.temperature", value)); + } + if request.max_output_tokens.is_none() + && let Some(value) = params.max_tokens.and_then(to_i64) + { + attributes.push(KeyValue::new("gen_ai.request.max_tokens", value)); + } + if let Some(value) = params.top_p { + attributes.push(KeyValue::new("gen_ai.request.top_p", value)); + } + if let Some(value) = params.stop.as_ref() { + attributes.push(KeyValue::new( + "gen_ai.request.stop_sequences", + string_array(value.iter().cloned()), + )); + } + } + if let Some(value) = request.max_output_tokens.and_then(to_i64) { + attributes.push(KeyValue::new("gen_ai.request.max_tokens", value)); + } + if request.stream == Some(true) { + attributes.push(KeyValue::new("gen_ai.request.stream", true)); + } + push_api_specific_request_attributes(attributes, request.api_specific.as_ref()); +} + +fn push_api_specific_request_attributes( + attributes: &mut Vec, + api_specific: Option<&ApiSpecificRequest>, +) { + match api_specific { + Some(ApiSpecificRequest::AnthropicMessages { top_k, .. }) => { + if let Some(value) = top_k.and_then(to_i64) { + attributes.push(KeyValue::new("gen_ai.request.top_k", value)); + } + } + Some(ApiSpecificRequest::OpenAIChat { + frequency_penalty, + n, + presence_penalty, + seed, + .. + }) => { + if let Some(value) = frequency_penalty { + attributes.push(KeyValue::new("gen_ai.request.frequency_penalty", *value)); + } + if let Some(value) = n.filter(|value| *value != 1).and_then(to_i64) { + attributes.push(KeyValue::new("gen_ai.request.choice.count", value)); + } + if let Some(value) = presence_penalty { + attributes.push(KeyValue::new("gen_ai.request.presence_penalty", *value)); + } + if let Some(value) = seed { + attributes.push(KeyValue::new("gen_ai.request.seed", *value)); + } + } + _ => {} + } +} + +fn push_llm_response_attributes(attributes: &mut Vec, event: &Event) { + let Some(response) = event.normalized_llm_response() else { + return; + }; + let response = response.as_ref(); + if let Some(value) = response.id.as_ref() { + attributes.push(KeyValue::new("gen_ai.response.id", value.clone())); + } + if let Some(value) = response.model.as_ref() { + attributes.push(KeyValue::new("gen_ai.response.model", value.clone())); + } + if let Some(value) = response.finish_reason.as_ref() { + attributes.push(KeyValue::new( + "gen_ai.response.finish_reasons", + string_array([finish_reason(value).to_string()]), + )); + } + if let Some(usage) = response.usage.as_ref() { + if let Some(value) = usage.prompt_tokens.and_then(to_i64) { + attributes.push(KeyValue::new("gen_ai.usage.input_tokens", value)); + } + if let Some(value) = usage.completion_tokens.and_then(to_i64) { + attributes.push(KeyValue::new("gen_ai.usage.output_tokens", value)); + } + if let Some(value) = usage.cache_read_tokens.and_then(to_i64) { + attributes.push(KeyValue::new(GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS, value)); + } + if let Some(value) = usage.cache_write_tokens.and_then(to_i64) { + attributes.push(KeyValue::new( + GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS, + value, + )); + } + } +} + +fn push_tool_attributes(attributes: &mut Vec, event: &Event) { + attributes.push(KeyValue::new("gen_ai.tool.name", tool_name(event))); + if let Some(value) = scalar_string(event, &["gen_ai.tool.type", "tool_type"]) { + attributes.push(KeyValue::new("gen_ai.tool.type", value)); + } + if let Some(value) = event + .tool_call_id() + .map(ToOwned::to_owned) + .or_else(|| scalar_string(event, &["gen_ai.tool.call.id", "tool_call_id"])) + { + attributes.push(KeyValue::new("gen_ai.tool.call.id", value)); + } + if let Some(value) = scalar_string( + event, + &["gen_ai.tool.description", "tool_description", "description"], + ) { + attributes.push(KeyValue::new("gen_ai.tool.description", value)); + } +} + +fn push_retrieval_attributes(attributes: &mut Vec, event: &Event) { + if let Some(value) = data_source_id(event) { + attributes.push(KeyValue::new("gen_ai.data_source.id", value)); + } + push_model_attribute(attributes, event); + if let Some(value) = scalar_i64(event, &[GEN_AI_RETRIEVAL_TOP_K, "top_k"]) { + attributes.push(KeyValue::new(GEN_AI_RETRIEVAL_TOP_K, value)); + } +} + +fn finish_reason(reason: &FinishReason) -> &str { + match reason { + FinishReason::Complete => "stop", + FinishReason::Length => "length", + FinishReason::ToolUse => "tool_calls", + FinishReason::ContentFilter => "content_filter", + FinishReason::Unknown(value) => value, + } +} + +fn request_model(event: &Event) -> Option { + event + .normalized_llm_request() + .and_then(|request| request.as_ref().model.clone()) + .or_else(|| event.model_name().map(ToOwned::to_owned)) + .or_else(|| scalar_string(event, &["gen_ai.request.model", "model", "model_name"])) +} + +fn provider_name(event: &Event) -> Option { + scalar_string(event, &[GEN_AI_PROVIDER_NAME, "provider_name", "provider"]) + .or_else(|| provider_from_event_name(event)) + .or_else(|| provider_from_normalized_request(event).map(str::to_string)) +} + +fn provider_from_event_name(event: &Event) -> Option { + let name = event.name().to_ascii_lowercase(); + [ + ("azure_ai_inference", "azure.ai.inference"), + ("azure ai inference", "azure.ai.inference"), + ("azure_openai", "azure.ai.openai"), + ("azure openai", "azure.ai.openai"), + ("anthropic", "anthropic"), + ("claude", "anthropic"), + ("bedrock", "aws.bedrock"), + ("cohere", "cohere"), + ("deepseek", "deepseek"), + ("gemini", "gcp.gemini"), + ("vertex", "gcp.vertex_ai"), + ("groq", "groq"), + ("mistral", "mistral_ai"), + ("openai", "openai"), + ("gpt", "openai"), + ("perplexity", "perplexity"), + ] + .into_iter() + .find_map(|(needle, provider)| name.contains(needle).then(|| provider.to_string())) +} + +fn provider_from_normalized_request(event: &Event) -> Option<&'static str> { + let request = event.normalized_llm_request()?; + match request.as_ref().api_specific.as_ref()? { + ApiSpecificRequest::AnthropicMessages { .. } => Some("anthropic"), + ApiSpecificRequest::OpenAIChat { .. } | ApiSpecificRequest::OpenAIResponses { .. } => { + Some("openai") + } + ApiSpecificRequest::Custom { .. } => None, + } +} + +fn agent_name(event: &Event) -> String { + scalar_string(event, &["gen_ai.agent.name"]).unwrap_or_else(|| event.name().to_string()) +} + +fn tool_name(event: &Event) -> String { + scalar_string(event, &["gen_ai.tool.name"]).unwrap_or_else(|| event.name().to_string()) +} + +fn data_source_id(event: &Event) -> Option { + scalar_string( + event, + &[ + "gen_ai.data_source.id", + "data_source_id", + "index_name", + "collection_name", + ], + ) +} + +fn push_error_attributes(attributes: &mut Vec, event: &Event) { + let is_error = event + .metadata() + .and_then(Value::as_object) + .and_then(|metadata| metadata.get("otel.status_code")) + .and_then(Value::as_str) + .is_some_and(|status| status.eq_ignore_ascii_case("ERROR")); + if !is_error { + return; + } + let error_type = scalar_string(event, &[semconv::ERROR_TYPE, "error_type"]) + .unwrap_or_else(|| "_OTHER".to_string()); + attributes.push(KeyValue::new(semconv::ERROR_TYPE, error_type)); +} + +fn scalar_string(event: &Event, keys: &[&str]) -> Option { + if let Some(profile) = event.category_profile() { + for key in keys { + if let Some(value) = profile.extra.get(*key) { + if let Some(value) = value.as_str() { + return Some(value.to_string()); + } + if value.is_number() || value.is_boolean() { + return Some(value.to_string()); + } + } + } + } + for object in event_objects(event) { + for key in keys { + if let Some(value) = object_value(object, key) { + if let Some(value) = value.as_str() { + return Some(value.to_string()); + } + if value.is_number() || value.is_boolean() { + return Some(value.to_string()); + } + } + } + } + None +} + +fn scalar_i64(event: &Event, keys: &[&str]) -> Option { + if let Some(profile) = event.category_profile() { + for key in keys { + if let Some(value) = profile.extra.get(*key) { + if let Some(value) = value.as_i64() { + return Some(value); + } + if let Some(value) = value.as_u64().and_then(to_i64) { + return Some(value); + } + } + } + } + for object in event_objects(event) { + for key in keys { + if let Some(value) = object_value(object, key) { + if let Some(value) = value.as_i64() { + return Some(value); + } + if let Some(value) = value.as_u64().and_then(to_i64) { + return Some(value); + } + } + } + } + None +} + +fn object_value<'a>(object: &'a Map, key: &str) -> Option<&'a Json> { + object.get(key).or_else(|| { + ["usage", "request", "response"] + .into_iter() + .filter_map(|container| object.get(container).and_then(Value::as_object)) + .find_map(|nested| nested.get(key)) + }) +} + +fn event_objects(event: &Event) -> Vec<&Map> { + let mut objects = Vec::new(); + if let Some(value) = event.metadata().and_then(Value::as_object) { + objects.push(value); + } + if let Some(value) = event.data().and_then(Value::as_object) { + objects.push(value); + } + objects +} + +fn string_array(values: impl IntoIterator) -> opentelemetry::Value { + opentelemetry::Value::Array(opentelemetry::Array::String( + values.into_iter().map(Into::into).collect(), + )) +} + +fn to_i64(value: u64) -> Option { + i64::try_from(value).ok() +} diff --git a/crates/core/src/observability/plugin_component.rs b/crates/core/src/observability/plugin_component.rs index e52f78cd3..cb32e1295 100644 --- a/crates/core/src/observability/plugin_component.rs +++ b/crates/core/src/observability/plugin_component.rs @@ -10,21 +10,22 @@ //! //! The plugin intentionally infers subscriber names from the component namespace //! so configuration remains portable across bindings. Agent Trajectory -//! Observability Format (ATOF), OpenTelemetry, and OpenInference each register -//! one global subscriber when enabled. Agent Trajectory Interchange Format -//! (ATIF) uses a global dispatcher that detects top-level agent or turn scopes -//! and creates one scope-local exporter for each trajectory run. Coding-agent -//! turns that need bounded traces carry role metadata; their declared scope -//! type is preserved in the exported event stream. +//! Observability Format (ATOF) registers one global subscriber when enabled. +//! Typed OpenTelemetry endpoints share one global fan-out subscriber. Agent +//! Trajectory Interchange Format (ATIF) uses a global dispatcher that detects +//! top-level agent or turn scopes and creates one scope-local exporter for each +//! trajectory run. Coding-agent turns that need bounded traces carry role +//! metadata; their declared scope type is preserved in the exported event +//! stream. use std::collections::{HashMap, HashSet}; use std::future::Future; +use std::panic::{AssertUnwindSafe, catch_unwind}; use std::path::PathBuf; use std::pin::Pin; #[cfg(feature = "object-store")] use std::sync::atomic::{AtomicU8, Ordering}; use std::sync::{Arc, Mutex}; -#[cfg(any(feature = "otel", feature = "openinference", feature = "object-store"))] use std::time::Duration; use serde::{Deserialize, Serialize}; @@ -35,29 +36,23 @@ use crate::api::event::{Event, ScopeCategory}; use crate::api::runtime::{EventSubscriberFn, current_scope_stack}; use crate::api::scope::ScopeType; use crate::api::subscriber::{ - scope_deregister_subscriber, try_scope_deregister_subscriber, try_scope_register_subscriber, + flush_subscribers, scope_deregister_subscriber, try_scope_deregister_subscriber, + try_scope_register_subscriber, }; use crate::config_editor::{ - EditorConfig, EditorFieldKind, EditorListItemSpec, EditorTaggedUnionSpec, EditorVariantSpec, + EditorConfig, EditorFieldKind, EditorFieldSpec, EditorListItemSpec, EditorSchema, + EditorTaggedUnionSpec, EditorVariantSpec, }; use crate::error::FlowError; +use crate::observability::OpenTelemetryType; use crate::observability::atif::{AtifAgentInfo, AtifExporter}; use crate::observability::atof::{ AtofEndpointFieldNamePolicy, AtofEndpointTransport, AtofExporter, AtofExporterConfig as CoreAtofExporterConfig, AtofExporterMode, AtofFileSinkConfig, AtofSinkConfig as CoreAtofSinkConfig, AtofStreamSinkConfig, }; -#[cfg(feature = "openinference")] -use crate::observability::openinference::{ - OpenInferenceConfig as CoreOpenInferenceConfig, OpenInferenceSubscriber, - OtlpTransport as OpenInferenceTransport, -}; -#[cfg(feature = "otel")] use crate::observability::otel::{ - OpenTelemetryConfig as CoreOpenTelemetryConfig, OpenTelemetrySubscriber, -}; -use crate::observability::{ - MarkProjection, OtlpAttributeMapping, default_mark_exclude_names, validate_attribute_mappings, + OpenTelemetryConfig as CoreOpenTelemetryConfig, OpenTelemetrySubscriber, OtlpTransport, }; use crate::plugin::{ ConfigDiagnostic, ConfigPolicy, DiagnosticLevel, Plugin, PluginComponentSpec, PluginError, @@ -129,10 +124,7 @@ pub struct ObservabilityConfig { pub atif: Option, /// OpenTelemetry trace export. #[serde(default, skip_serializing_if = "Option::is_none")] - pub opentelemetry: Option, - /// OpenInference trace export. - #[serde(default, skip_serializing_if = "Option::is_none")] - pub openinference: Option, + pub opentelemetry: Option, /// Observability-local unsupported-config policy. #[serde(default)] pub policy: ConfigPolicy, @@ -145,12 +137,62 @@ impl Default for ObservabilityConfig { atof: None, atif: None, opentelemetry: None, - openinference: None, policy: ConfigPolicy::default(), } } } +/// Multi-endpoint OpenTelemetry export settings. +#[derive(Debug, Clone, Default, Serialize, Deserialize)] +#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))] +pub struct OpenTelemetrySectionConfig { + /// Whether OpenTelemetry export is active. + #[serde(default)] + pub enabled: bool, + /// Independently configured OTLP destinations. + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub endpoints: Vec, +} + +/// One typed OTLP destination. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))] +pub struct OpenTelemetryEndpointConfig { + /// Semantic projection emitted by this endpoint. + #[serde(rename = "type")] + pub otel_type: OpenTelemetryType, + /// Required OTLP endpoint. + pub endpoint: String, + /// OTLP transport: `http_binary` or `grpc`. + #[serde(default = "default_otlp_transport")] + #[cfg_attr(feature = "schema", schemars(schema_with = "otlp_transport_schema"))] + pub transport: String, + /// Extra exporter headers or metadata. + #[serde(default)] + pub headers: HashMap, + /// Exporter headers mapped to environment variable names. + #[serde(default)] + pub header_env: HashMap, + /// Extra resource attributes. + #[serde(default)] + pub resource_attributes: HashMap, + /// `service.name` resource attribute. + #[serde(default = "default_otel_service_name")] + pub service_name: String, + /// Optional `service.namespace` resource attribute. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub service_namespace: Option, + /// Optional `service.version` resource attribute. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub service_version: Option, + /// Instrumentation scope name. + #[serde(default = "default_otel_instrumentation_scope")] + pub instrumentation_scope: String, + /// Export timeout in milliseconds. + #[serde(default = "default_timeout_millis")] + pub timeout_millis: u64, +} + /// Multi-sink ATOF JSONL exporter config. /// /// When enabled, this section wraps @@ -383,77 +425,6 @@ pub struct HttpStorageConfig { pub timeout_millis: u64, } -/// Shared OTLP exporter config for OpenTelemetry and OpenInference. -/// -/// The `opentelemetry` and `openinference` sections share the same shape but -/// construct different subscriber implementations. Both sections are disabled -/// by default and use `http_binary` transport unless configured otherwise. -#[derive(Debug, Clone, Serialize, Deserialize)] -#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))] -pub struct OtlpSectionConfig { - /// Whether the subscriber is active. - #[serde(default)] - pub enabled: bool, - /// Representation used for mark events: `inherit`, `event`, or `tool`. - #[serde(default)] - #[cfg_attr(feature = "schema", schemars(schema_with = "mark_projection_schema"))] - pub mark_projection: MarkProjection, - /// Mark names excluded from tool projection. Defaults to `llm.chunk`. - #[serde(default = "default_mark_exclude_names")] - pub mark_exclude_names: Vec, - /// Typed projected attributes copied to aliases. - #[serde(default, skip_serializing_if = "Vec::is_empty")] - pub attribute_mappings: Vec, - /// OTLP transport: `http_binary` or `grpc`. - #[serde(default = "default_otlp_transport")] - #[cfg_attr(feature = "schema", schemars(schema_with = "otlp_transport_schema"))] - pub transport: String, - /// OTLP endpoint. - #[serde(default, skip_serializing_if = "Option::is_none")] - pub endpoint: Option, - /// Extra exporter headers or metadata. - #[serde(default)] - pub headers: HashMap, - /// Extra resource attributes. - #[serde(default)] - pub resource_attributes: HashMap, - /// `service.name` resource attribute. - #[serde(default = "default_service_name")] - pub service_name: String, - /// Optional `service.namespace` resource attribute. - #[serde(default, skip_serializing_if = "Option::is_none")] - pub service_namespace: Option, - /// Optional `service.version` resource attribute. - #[serde(default, skip_serializing_if = "Option::is_none")] - pub service_version: Option, - /// Instrumentation scope name. - #[serde(default, skip_serializing_if = "Option::is_none")] - pub instrumentation_scope: Option, - /// Export timeout in milliseconds. - #[serde(default = "default_timeout_millis")] - pub timeout_millis: u64, -} - -impl Default for OtlpSectionConfig { - fn default() -> Self { - Self { - enabled: false, - mark_projection: MarkProjection::default(), - mark_exclude_names: default_mark_exclude_names(), - attribute_mappings: Vec::new(), - transport: default_otlp_transport(), - endpoint: None, - headers: HashMap::new(), - resource_attributes: HashMap::new(), - service_name: default_service_name(), - service_namespace: None, - service_version: None, - instrumentation_scope: None, - timeout_millis: default_timeout_millis(), - } - } -} - crate::editor_config! { impl ObservabilityConfig { atof => { @@ -474,15 +445,8 @@ crate::editor_config! { label: "OpenTelemetry", kind: Section, optional: true, - nested: OtlpSectionConfig, - default: OtlpSectionConfig, - }, - openinference => { - label: "OpenInference", - kind: Section, - optional: true, - nested: OtlpSectionConfig, - default: OtlpSectionConfig, + nested: OpenTelemetrySectionConfig, + default: OpenTelemetrySectionConfig, }, policy => { label: "policy", @@ -493,6 +457,90 @@ crate::editor_config! { } } +crate::editor_config! { + impl OpenTelemetrySectionConfig { + enabled => { label: "enabled", kind: Boolean }, + endpoints => { label: "endpoints", kind: List, list: &OPENTELEMETRY_ENDPOINT_LIST }, + } +} + +const fn otel_editor_field( + name: &'static str, + kind: EditorFieldKind, + enum_values: &'static [&'static str], + optional: bool, +) -> EditorFieldSpec { + EditorFieldSpec { + name, + label: name, + kind, + enum_values, + optional, + nested_schema: None, + nested_default: None, + list_item: None, + tagged_union: None, + } +} + +impl EditorConfig for OpenTelemetryEndpointConfig { + fn editor_schema() -> &'static EditorSchema { + static SCHEMA: EditorSchema = EditorSchema { + fields: &[ + otel_editor_field( + "type", + EditorFieldKind::Enum, + &["full", "gen_ai", "openinference"], + false, + ), + otel_editor_field("endpoint", EditorFieldKind::String, &[], false), + otel_editor_field( + "transport", + EditorFieldKind::Enum, + &["http_binary", "grpc"], + false, + ), + otel_editor_field("service_name", EditorFieldKind::String, &[], false), + otel_editor_field("service_namespace", EditorFieldKind::String, &[], true), + otel_editor_field("service_version", EditorFieldKind::String, &[], true), + otel_editor_field("instrumentation_scope", EditorFieldKind::String, &[], false), + otel_editor_field("timeout_millis", EditorFieldKind::Integer, &[], false), + otel_editor_field("headers", EditorFieldKind::StringMap, &[], false), + otel_editor_field("header_env", EditorFieldKind::StringMap, &[], false), + otel_editor_field( + "resource_attributes", + EditorFieldKind::StringMap, + &[], + false, + ), + ], + }; + &SCHEMA + } +} + +fn default_opentelemetry_endpoint_editor_value() -> Json { + serde_json::json!({ + "type": "full", + "endpoint": "", + "transport": "http_binary", + "service_name": "unknown_service", + "instrumentation_scope": "opentelemetry", + "timeout_millis": 3000, + "headers": {}, + "header_env": {}, + "resource_attributes": {}, + }) +} + +static OPENTELEMETRY_ENDPOINT_LIST: EditorListItemSpec = EditorListItemSpec { + kind: EditorFieldKind::Section, + schema: Some(::editor_schema), + default: Some(default_opentelemetry_endpoint_editor_value), + tagged_union: None, + list_item: None, +}; + crate::editor_config! { impl AtofSectionConfig { enabled => { label: "enabled", kind: Boolean }, @@ -578,49 +626,6 @@ static ATOF_SINK_LIST: EditorListItemSpec = EditorListItemSpec { list_item: None, }; -crate::editor_config! { - impl OtlpAttributeMapping { - key => { label: "key", kind: String }, - alias => { label: "alias", kind: String }, - } -} - -fn otlp_attribute_mapping_editor_schema() -> &'static crate::config_editor::EditorSchema { - ::editor_schema() -} - -fn default_otlp_attribute_mapping() -> Json { - serde_json::to_value(OtlpAttributeMapping::new("", "")) - .expect("attribute mapping should serialize") -} - -static OTLP_ATTRIBUTE_MAPPING_LIST_ITEM: crate::config_editor::EditorListItemSpec = - crate::config_editor::EditorListItemSpec { - kind: crate::config_editor::EditorFieldKind::Section, - schema: Some(otlp_attribute_mapping_editor_schema), - default: Some(default_otlp_attribute_mapping), - tagged_union: None, - list_item: None, - }; - -crate::editor_config! { - impl OtlpSectionConfig { - enabled => { label: "enabled", kind: Boolean }, - mark_projection => { label: "mark_projection", kind: Enum, values: ["inherit", "event", "tool"] }, - mark_exclude_names => { label: "mark_exclude_names", kind: Json }, - attribute_mappings => { label: "attribute_mappings", kind: List, list: &OTLP_ATTRIBUTE_MAPPING_LIST_ITEM }, - transport => { label: "transport", kind: Enum, values: ["http_binary", "grpc"] }, - endpoint => { label: "endpoint", kind: String, optional: true }, - headers => { label: "headers", kind: StringMap }, - resource_attributes => { label: "resource_attributes", kind: StringMap }, - service_name => { label: "service_name", kind: String }, - service_namespace => { label: "service_namespace", kind: String, optional: true }, - service_version => { label: "service_version", kind: String, optional: true }, - instrumentation_scope => { label: "instrumentation_scope", kind: String, optional: true }, - timeout_millis => { label: "timeout_millis", kind: Integer }, - } -} - struct ObservabilityPlugin; impl Plugin for ObservabilityPlugin { @@ -705,13 +710,6 @@ fn otlp_transport_schema( string_enum_schema(generator, &["http_binary", "grpc"], Some("http_binary")) } -#[cfg(feature = "schema")] -fn mark_projection_schema( - generator: &mut schemars::r#gen::SchemaGenerator, -) -> schemars::schema::Schema { - string_enum_schema(generator, &["inherit", "event", "tool"], Some("inherit")) -} - #[cfg(feature = "schema")] fn string_enum_schema( generator: &mut schemars::r#gen::SchemaGenerator, @@ -745,9 +743,6 @@ fn register_observability( if let Some(otel) = config.opentelemetry.filter(|section| section.enabled) { register_opentelemetry(otel, ctx)?; } - if let Some(openinference) = config.openinference.filter(|section| section.enabled) { - register_openinference(openinference, ctx)?; - } Ok(()) } @@ -942,92 +937,114 @@ fn build_atif_storage( )) } -#[cfg(feature = "otel")] fn register_opentelemetry( - section: OtlpSectionConfig, + section: OpenTelemetrySectionConfig, ctx: &mut PluginRegistrationContext, ) -> PluginResult<()> { - let endpoint_configured = section.endpoint.is_some(); - let subscriber = Arc::new( - OpenTelemetrySubscriber::new(build_otel_config(section)?) - .map_err(observability_registration_error)?, - ); - if endpoint_configured { + if section.endpoints.is_empty() { + return Err(PluginError::InvalidConfig( + "enabled OpenTelemetry section requires at least one endpoint".to_string(), + )); + } + let subscribers = build_opentelemetry_subscribers(section.endpoints)?; + for (index, _) in subscribers.iter().enumerate() { log::info!( target: "nemo_relay.plugin", event = "plugin_resource_access_pending", plugin_kind = OBSERVABILITY_PLUGIN_KIND, resource_kind = "otlp_endpoint", exporter = "opentelemetry", + resource_index = index, permission = "write"; "Plugin resource access will be validated during export" ); } - ctx.register_subscriber("opentelemetry", subscriber.subscriber())?; + let callbacks = subscribers + .iter() + .map(|subscriber| subscriber.subscriber()) + .collect::>(); ctx.add_registration(PluginRegistration::new( "observability", ctx.qualify_name("opentelemetry.shutdown"), - Box::new(move || { - subscriber - .shutdown() - .map_err(observability_registration_error) - }), + Box::new(move || shutdown_opentelemetry_subscribers(&subscribers).map_or(Ok(()), Err)), )); + ctx.register_subscriber( + "opentelemetry", + Arc::new(move |event| deliver_opentelemetry_event(&callbacks, event)), + )?; Ok(()) } -#[cfg(not(feature = "otel"))] -fn register_opentelemetry( - _section: OtlpSectionConfig, - _ctx: &mut PluginRegistrationContext, -) -> PluginResult<()> { - Err(PluginError::InvalidConfig( - "OpenTelemetry support is not enabled in this build".to_string(), - )) +fn deliver_opentelemetry_event(callbacks: &[EventSubscriberFn], event: &Event) { + for (index, callback) in callbacks.iter().enumerate() { + if catch_unwind(AssertUnwindSafe(|| callback(event))).is_err() { + log::error!( + target: "nemo_relay.plugin", + event = "opentelemetry_endpoint_callback_panicked", + plugin_kind = OBSERVABILITY_PLUGIN_KIND, + resource_kind = "otlp_endpoint", + resource_index = index; + "OpenTelemetry endpoint callback panicked; delivery continued to remaining endpoints" + ); + } + } } -#[cfg(feature = "openinference")] -fn register_openinference( - section: OtlpSectionConfig, - ctx: &mut PluginRegistrationContext, -) -> PluginResult<()> { - let endpoint_configured = section.endpoint.is_some(); - let subscriber = Arc::new( - OpenInferenceSubscriber::new(build_openinference_config(section)?) - .map_err(observability_registration_error)?, - ); - if endpoint_configured { - log::info!( - target: "nemo_relay.plugin", - event = "plugin_resource_access_pending", - plugin_kind = OBSERVABILITY_PLUGIN_KIND, - resource_kind = "otlp_endpoint", - exporter = "openinference", - permission = "write"; - "Plugin resource access will be validated during export" - ); - } - ctx.register_subscriber("openinference", subscriber.subscriber())?; - ctx.add_registration(PluginRegistration::new( - "observability", - ctx.qualify_name("openinference.shutdown"), - Box::new(move || { - subscriber - .shutdown() +fn build_opentelemetry_subscribers( + endpoints: Vec, +) -> PluginResult>> { + let mut subscribers = Vec::with_capacity(endpoints.len()); + for (index, endpoint) in endpoints.into_iter().enumerate() { + let subscriber = build_otel_config(index, endpoint).and_then(|config| { + OpenTelemetrySubscriber::new(config) + .map(Arc::new) .map_err(observability_registration_error) - }), - )); - Ok(()) + }); + match subscriber { + Ok(subscriber) => subscribers.push(subscriber), + Err(error) => { + if let Some(_rollback_error) = shutdown_opentelemetry_providers(&subscribers) { + log::warn!( + target: "nemo_relay.plugin", + event = "plugin_resource_rollback_failed", + plugin_kind = OBSERVABILITY_PLUGIN_KIND, + resource_kind = "otlp_endpoint", + reason = "shutdown_failed"; + "OpenTelemetry construction rollback could not shut down every endpoint" + ); + } + return Err(error); + } + } + } + Ok(subscribers) } -#[cfg(not(feature = "openinference"))] -fn register_openinference( - _section: OtlpSectionConfig, - _ctx: &mut PluginRegistrationContext, -) -> PluginResult<()> { - Err(PluginError::InvalidConfig( - "OpenInference support is not enabled in this build".to_string(), - )) +fn shutdown_opentelemetry_subscribers( + subscribers: &[Arc], +) -> Option { + let mut first_error = flush_subscribers().err().map(|error| { + observability_registration_error(crate::observability::otel::OpenTelemetryError::Core( + error, + )) + }); + let provider_error = shutdown_opentelemetry_providers(subscribers); + if first_error.is_none() { + first_error = provider_error; + } + first_error +} + +fn shutdown_opentelemetry_providers( + subscribers: &[Arc], +) -> Option { + let mut first_error = None; + for subscriber in subscribers { + if let Err(error) = subscriber.shutdown_provider() { + first_error.get_or_insert_with(|| observability_registration_error(error)); + } + } + first_error } struct AtifDispatcher { @@ -1738,78 +1755,67 @@ fn is_top_level_trajectory_start(event: &Event) -> bool { .unwrap_or(false) } -#[cfg(feature = "otel")] -fn build_otel_config(section: OtlpSectionConfig) -> PluginResult { - let mut config = match section.transport.as_str() { - "http_binary" => CoreOpenTelemetryConfig::http_binary(section.service_name), - "grpc" => CoreOpenTelemetryConfig::grpc(section.service_name), +fn build_otel_config( + index: usize, + section: OpenTelemetryEndpointConfig, +) -> PluginResult { + if section.endpoint.trim().is_empty() { + return Err(PluginError::InvalidConfig( + "OpenTelemetry endpoint must be a nonblank string".to_string(), + )); + } + let transport = match section.transport.as_str() { + "http_binary" => OtlpTransport::HttpBinary, + "grpc" => OtlpTransport::Grpc, other => { return Err(PluginError::InvalidConfig(format!( "OpenTelemetry transport must be 'http_binary' or 'grpc', got {other:?}" ))); } - } - .with_timeout(Duration::from_millis(section.timeout_millis)); - config = config - .with_mark_projection(section.mark_projection) - .with_mark_exclude_names(section.mark_exclude_names) - .with_attribute_mappings(section.attribute_mappings); - - if let Some(endpoint) = section.endpoint { - config = config.with_endpoint(endpoint); - } - if let Some(namespace) = section.service_namespace { - config = config.with_service_namespace(namespace); - } - if let Some(version) = section.service_version { - config = config.with_service_version(version); - } - if let Some(scope) = section.instrumentation_scope { - config = config.with_instrumentation_scope(scope); - } - for (key, value) in section.headers { - config = config.with_header(key, value); - } - for (key, value) in section.resource_attributes { - config = config.with_resource_attribute(key, value); - } - Ok(config) -} - -#[cfg(feature = "openinference")] -fn build_openinference_config(section: OtlpSectionConfig) -> PluginResult { - let transport = match section.transport.as_str() { - "http_binary" => OpenInferenceTransport::HttpBinary, - "grpc" => OpenInferenceTransport::Grpc, - other => { + }; + for (header, variable) in §ion.header_env { + if variable.trim().is_empty() || variable.trim() != variable { return Err(PluginError::InvalidConfig(format!( - "OpenInference transport must be 'http_binary' or 'grpc', got {other:?}" + "OpenTelemetry endpoints[{index}].header_env.{header} must name a nonblank environment variable without surrounding whitespace" ))); } - }; - let mut config = CoreOpenInferenceConfig::new() + if section + .headers + .keys() + .any(|configured| configured.eq_ignore_ascii_case(header)) + { + return Err(PluginError::InvalidConfig(format!( + "OpenTelemetry endpoints[{index}] header {header:?} cannot appear in both headers and header_env" + ))); + } + } + let mut config = CoreOpenTelemetryConfig::new(section.otel_type, section.endpoint) .with_transport(transport) .with_service_name(section.service_name) .with_timeout(Duration::from_millis(section.timeout_millis)) - .with_mark_projection(section.mark_projection) - .with_mark_exclude_names(section.mark_exclude_names) - .with_attribute_mappings(section.attribute_mappings); - - if let Some(endpoint) = section.endpoint { - config = config.with_endpoint(endpoint); - } + .with_instrumentation_scope(section.instrumentation_scope); if let Some(namespace) = section.service_namespace { config = config.with_service_namespace(namespace); } if let Some(version) = section.service_version { config = config.with_service_version(version); } - if let Some(scope) = section.instrumentation_scope { - config = config.with_instrumentation_scope(scope); - } for (key, value) in section.headers { config = config.with_header(key, value); } + for (key, variable) in section.header_env { + let value = std::env::var(&variable).map_err(|error| { + PluginError::InvalidConfig(format!( + "OpenTelemetry endpoints[{index}].header_env.{key} could not read environment variable {variable:?}: {error}" + )) + })?; + if value.trim().is_empty() || value.trim() != value { + return Err(PluginError::InvalidConfig(format!( + "OpenTelemetry endpoints[{index}].header_env.{key} references a blank or padded environment variable {variable:?}" + ))); + } + config = config.with_header(key, value); + } for (key, value) in section.resource_attributes { config = config.with_resource_attribute(key, value); } @@ -1879,6 +1885,16 @@ fn validate_top_level_observability_fields( "policy", ], ); + if plugin_config.contains_key("openinference") { + push_policy_diag( + diagnostics, + UnsupportedBehavior::Error, + "observability.legacy_openinference_section", + Some(OBSERVABILITY_PLUGIN_KIND.to_string()), + Some("openinference".to_string()), + "the standalone OpenInference section was removed in observability config version 3; configure an opentelemetry endpoint with type = \"openinference\"".to_string(), + ); + } } fn validate_observability_section_fields( @@ -1933,6 +1949,7 @@ fn validate_observability_section_fields( "opentelemetry", &[ "enabled", + "endpoints", "mark_projection", "mark_exclude_names", "attribute_mappings", @@ -1947,13 +1964,9 @@ fn validate_observability_section_fields( "timeout_millis", ], ); - validate_section_fields( - diagnostics, - policy, - plugin_config, - "openinference", - &[ - "enabled", + if let Some(opentelemetry) = plugin_config.get("opentelemetry").and_then(Json::as_object) { + validate_opentelemetry_endpoint_fields(diagnostics, policy, opentelemetry); + for legacy_field in [ "mark_projection", "mark_exclude_names", "attribute_mappings", @@ -1966,8 +1979,75 @@ fn validate_observability_section_fields( "service_version", "instrumentation_scope", "timeout_millis", - ], - ); + ] { + if opentelemetry.contains_key(legacy_field) { + push_policy_diag( + diagnostics, + UnsupportedBehavior::Error, + "observability.legacy_opentelemetry_field", + Some("opentelemetry".to_string()), + Some(legacy_field.to_string()), + format!( + "OpenTelemetry {legacy_field} moved into each typed endpoint in observability config version 3" + ), + ); + } + } + } +} + +fn validate_opentelemetry_endpoint_fields( + diagnostics: &mut Vec, + policy: &ConfigPolicy, + opentelemetry: &Map, +) { + const ALLOWED: &[&str] = &[ + "type", + "endpoint", + "transport", + "headers", + "header_env", + "resource_attributes", + "service_name", + "service_namespace", + "service_version", + "instrumentation_scope", + "timeout_millis", + ]; + const REMOVED: &[&str] = &[ + "mark_projection", + "mark_exclude_names", + "attribute_mappings", + "semantic_selector", + "capture_content", + ]; + let Some(endpoints) = opentelemetry.get("endpoints").and_then(Json::as_array) else { + return; + }; + for (index, endpoint) in endpoints.iter().filter_map(Json::as_object).enumerate() { + for field in endpoint + .keys() + .filter(|field| !ALLOWED.contains(&field.as_str())) + { + let behavior = if REMOVED.contains(&field.as_str()) { + UnsupportedBehavior::Error + } else { + policy.unknown_field + }; + push_policy_diag( + diagnostics, + behavior, + if REMOVED.contains(&field.as_str()) { + "observability.legacy_opentelemetry_field" + } else { + "observability.unknown_field" + }, + Some("opentelemetry".to_string()), + Some(format!("endpoints[{index}].{field}")), + format!("unknown OpenTelemetry endpoint field {field:?}"), + ); + } + } } fn validate_observability_section_values( @@ -1983,9 +2063,6 @@ fn validate_observability_section_values( if let Some(section) = &config.opentelemetry { validate_opentelemetry_section(diagnostics, &config.policy, section); } - if let Some(section) = &config.openinference { - validate_openinference_section(diagnostics, &config.policy, section); - } } fn validate_atof_section( @@ -2074,75 +2151,193 @@ fn validate_atif_storage_support( fn validate_opentelemetry_section( diagnostics: &mut Vec, policy: &ConfigPolicy, - section: &OtlpSectionConfig, + section: &OpenTelemetrySectionConfig, ) { - validate_otlp_values(diagnostics, policy, "opentelemetry", section); + if section.enabled && section.endpoints.is_empty() { + push_policy_diag( + diagnostics, + policy.unsupported_value, + "observability.unsupported_value", + Some("opentelemetry".to_string()), + Some("endpoints".to_string()), + "enabled OpenTelemetry section requires at least one endpoint".to_string(), + ); + } + for (index, endpoint) in section.endpoints.iter().enumerate() { + if endpoint.endpoint.trim().is_empty() { + push_policy_diag( + diagnostics, + policy.unsupported_value, + "observability.unsupported_value", + Some("opentelemetry".to_string()), + Some(format!("endpoints[{index}].endpoint")), + "OpenTelemetry endpoint must be a nonblank string".to_string(), + ); + } + if !matches!(endpoint.transport.as_str(), "http_binary" | "grpc") { + push_policy_diag( + diagnostics, + policy.unsupported_value, + "observability.unsupported_value", + Some("opentelemetry".to_string()), + Some(format!("endpoints[{index}].transport")), + "OpenTelemetry endpoint transport must be 'http_binary' or 'grpc'".to_string(), + ); + } + validate_opentelemetry_headers(diagnostics, policy, index, endpoint); + } validate_opentelemetry_feature_support(diagnostics, policy, section); } -#[cfg(not(feature = "otel"))] -fn validate_opentelemetry_feature_support( +fn validate_opentelemetry_headers( diagnostics: &mut Vec, policy: &ConfigPolicy, - section: &OtlpSectionConfig, + index: usize, + endpoint: &OpenTelemetryEndpointConfig, ) { - if section.enabled { + validate_case_insensitive_header_duplicates( + diagnostics, + policy, + index, + "headers", + endpoint.headers.keys(), + ); + validate_case_insensitive_header_duplicates( + diagnostics, + policy, + index, + "header_env", + endpoint.header_env.keys(), + ); + for (header, value) in &endpoint.headers { + let field = format!("endpoints[{index}].headers.{header}"); + validate_opentelemetry_header_name(diagnostics, policy, &field, header); + validate_opentelemetry_header_value(diagnostics, policy, &field, header, value); + } + for (header, variable) in &endpoint.header_env { + let field = format!("endpoints[{index}].header_env.{header}"); + validate_opentelemetry_header_name(diagnostics, policy, &field, header); + if endpoint + .headers + .keys() + .any(|configured| configured.eq_ignore_ascii_case(header)) + { + push_policy_diag( + diagnostics, + policy.unsupported_value, + "observability.unsupported_value", + Some("opentelemetry".to_string()), + Some(field.clone()), + format!( + "OpenTelemetry endpoints[{index}] header {header:?} cannot appear in both headers and header_env" + ), + ); + } + validate_opentelemetry_header_env(diagnostics, policy, &field, variable); + } +} + +fn validate_case_insensitive_header_duplicates<'a>( + diagnostics: &mut Vec, + policy: &ConfigPolicy, + index: usize, + map_name: &str, + headers: impl Iterator, +) { + let mut normalized = HashSet::new(); + for header in headers { + if !normalized.insert(header.to_ascii_lowercase()) { + push_policy_diag( + diagnostics, + policy.unsupported_value, + "observability.unsupported_value", + Some("opentelemetry".to_string()), + Some(format!("endpoints[{index}].{map_name}.{header}")), + format!( + "OpenTelemetry endpoints[{index}].{map_name} contains duplicate header {header:?} ignoring ASCII case" + ), + ); + } + } +} + +fn validate_opentelemetry_header_name( + diagnostics: &mut Vec, + policy: &ConfigPolicy, + field: &str, + header: &str, +) { + if header.trim().is_empty() + || header.trim() != header + || reqwest::header::HeaderName::from_bytes(header.as_bytes()).is_err() + { push_policy_diag( diagnostics, policy.unsupported_value, - "observability.feature_disabled", + "observability.unsupported_value", Some("opentelemetry".to_string()), - Some("enabled".to_string()), - "OpenTelemetry support is not enabled in this build".to_string(), + Some(field.to_string()), + format!("OpenTelemetry {field} header name {header:?} is invalid"), ); } } -#[cfg(feature = "otel")] -fn validate_opentelemetry_feature_support( - _diagnostics: &mut Vec, - _policy: &ConfigPolicy, - _section: &OtlpSectionConfig, -) { -} - -fn validate_openinference_section( +fn validate_opentelemetry_header_value( diagnostics: &mut Vec, policy: &ConfigPolicy, - section: &OtlpSectionConfig, + field: &str, + header: &str, + value: &str, ) { - validate_otlp_values(diagnostics, policy, "openinference", section); - validate_openinference_feature_support(diagnostics, policy, section); + if reqwest::header::HeaderValue::from_str(value).is_err() { + push_policy_diag( + diagnostics, + policy.unsupported_value, + "observability.unsupported_value", + Some("opentelemetry".to_string()), + Some(field.to_string()), + format!("OpenTelemetry header {header:?} has an invalid value"), + ); + } } -#[cfg(not(feature = "openinference"))] -fn validate_openinference_feature_support( +fn validate_opentelemetry_header_env( diagnostics: &mut Vec, policy: &ConfigPolicy, - section: &OtlpSectionConfig, + field: &str, + variable: &str, ) { - if section.enabled { + let trimmed = variable.trim(); + let error = if trimmed.is_empty() { + Some("must name a non-empty environment variable".to_string()) + } else if trimmed != variable { + Some(format!( + "must not have surrounding whitespace; got {variable:?}" + )) + } else { + None + }; + if let Some(error) = error { push_policy_diag( diagnostics, policy.unsupported_value, - "observability.feature_disabled", - Some("openinference".to_string()), - Some("enabled".to_string()), - "OpenInference support is not enabled in this build".to_string(), + "observability.unsupported_value", + Some("opentelemetry".to_string()), + Some(field.to_string()), + format!("OpenTelemetry {field} {error}"), ); } } -#[cfg(feature = "openinference")] -fn validate_openinference_feature_support( +fn validate_opentelemetry_feature_support( _diagnostics: &mut Vec, _policy: &ConfigPolicy, - _section: &OtlpSectionConfig, + _section: &OpenTelemetrySectionConfig, ) { } fn validate_version(diagnostics: &mut Vec, policy: &ConfigPolicy, version: u32) { - if version != 2 { + if version != 3 { push_policy_diag( diagnostics, policy.unsupported_value, @@ -2150,7 +2345,7 @@ fn validate_version(diagnostics: &mut Vec, policy: &ConfigPoli Some(OBSERVABILITY_PLUGIN_KIND.to_string()), Some("version".to_string()), format!( - "observability config version {version} is unsupported; use version 2 and migrate ATOF output_directory, filename, mode, and endpoints into sinks" + "observability config version {version} is unsupported; use version 3 and migrate OpenTelemetry and OpenInference exporters into opentelemetry.endpoints" ), ); } @@ -2721,34 +2916,6 @@ fn validate_atif_storage_env_var( } } -fn validate_otlp_values( - diagnostics: &mut Vec, - policy: &ConfigPolicy, - section_name: &str, - section: &OtlpSectionConfig, -) { - if !matches!(section.transport.as_str(), "http_binary" | "grpc") { - push_policy_diag( - diagnostics, - policy.unsupported_value, - "observability.unsupported_value", - Some(section_name.to_string()), - Some("transport".to_string()), - format!("{section_name} transport must be 'http_binary' or 'grpc'"), - ); - } - if let Err(message) = validate_attribute_mappings(§ion.attribute_mappings) { - push_policy_diag( - diagnostics, - policy.unsupported_value, - "observability.unsupported_value", - Some(section_name.to_string()), - Some("attribute_mappings".to_string()), - message, - ); - } -} - fn validate_unknown_fields( diagnostics: &mut Vec, policy: &ConfigPolicy, @@ -2801,7 +2968,7 @@ fn observability_registration_error(error: impl std::fmt::Display) -> PluginErro } fn default_observability_config_version() -> u32 { - 2 + 3 } fn default_atof_mode() -> String { @@ -2836,8 +3003,12 @@ fn default_otlp_transport() -> String { "http_binary".to_string() } -fn default_service_name() -> String { - "nemo-relay".to_string() +fn default_otel_service_name() -> String { + "unknown_service".to_string() +} + +fn default_otel_instrumentation_scope() -> String { + "opentelemetry".to_string() } fn default_timeout_millis() -> u64 { diff --git a/crates/core/src/plugin.rs b/crates/core/src/plugin.rs index ff7bc6c79..6d60e8864 100644 --- a/crates/core/src/plugin.rs +++ b/crates/core/src/plugin.rs @@ -1171,10 +1171,13 @@ pub fn validate_plugin_config(config: &PluginConfig) -> ConfigReport { /// Layers `right` (higher precedence) onto `left` in place. /// -/// Objects merge recursively and arrays/scalars are replaced by `right`, except the -/// top-level `components` array, whose entries pair by `kind` in order of appearance so -/// multi-instance kinds are not collapsed. Internal helper shared by plugin -/// initialization and `plugins.toml` discovery. +/// Objects merge recursively and arrays/scalars are replaced by `right`, except: +/// +/// - the top-level `components` array pairs entries by `kind` in order of appearance so +/// multi-instance kinds are not collapsed; +/// - lists inside a component's `config` concatenate with higher-precedence entries first. +/// +/// Internal helper shared by plugin initialization and `plugins.toml` discovery. fn layer_config(left: &mut Json, right: Json) { match (left, right) { (Json::Object(left), Json::Object(right)) => { @@ -1221,15 +1224,87 @@ fn merge_plugin_components(left: &mut Json, right: Json) { .copied(); *nth += 1; match slot { - Some(index) if kind == "pricing" => { - merge_pricing_component(&mut left_components[index], component) - } - Some(index) => merge_json_value(&mut left_components[index], component), + Some(index) => merge_plugin_component(&mut left_components[index], component), None => left_components.push(component), } } } +/// Merges one higher-precedence component into its lower-precedence match. +/// +/// Direct list fields in a component's `config` object concatenate with +/// higher-precedence entries first. Declared observability collections do the +/// same; deeper implementation-specific lists retain replacement semantics. +fn merge_plugin_component(existing: &mut Json, higher_priority: Json) { + let is_observability = component_kind(&higher_priority).or_else(|| component_kind(existing)) + == Some("observability"); + match (existing, higher_priority) { + (Json::Object(existing), Json::Object(higher_priority)) => { + for (key, value) in higher_priority { + match (key.as_str(), existing.get_mut(&key)) { + ("config", Some(existing_config)) => { + merge_plugin_config_value( + existing_config, + value, + &mut Vec::new(), + is_observability, + ); + } + (_, Some(existing_value)) => merge_json_value(existing_value, value), + (_, None) => { + existing.insert(key, value); + } + } + } + } + (existing, higher_priority) => *existing = higher_priority, + } +} + +/// Recursively merges plugin component config with scoped list concatenation. +fn merge_plugin_config_value( + lower_priority: &mut Json, + higher_priority: Json, + path: &mut Vec, + is_observability: bool, +) { + match (lower_priority, higher_priority) { + (Json::Object(lower_priority), Json::Object(higher_priority)) => { + for (key, value) in higher_priority { + path.push(key.clone()); + match lower_priority.get_mut(&key) { + Some(existing) => { + merge_plugin_config_value(existing, value, path, is_observability) + } + None => { + lower_priority.insert(key, value); + } + } + path.pop(); + } + } + (Json::Array(lower_priority), Json::Array(mut higher_priority)) + if plugin_config_list_concatenates(path, is_observability) => + { + higher_priority.append(lower_priority); + *lower_priority = higher_priority; + } + (lower_priority, higher_priority) => *lower_priority = higher_priority, + } +} + +fn plugin_config_list_concatenates(path: &[String], is_observability: bool) -> bool { + path.len() == 1 + || (is_observability + && matches!( + path, + [section, field] + if (section == "atof" && field == "sinks") + || (section == "opentelemetry" && field == "endpoints") + || (section == "atif" && field == "storage") + )) +} + /// Recursively merges `right` into a `left` JSON object; arrays and scalars are replaced. fn merge_json_value(left: &mut Json, right: Json) { match (left, right) { @@ -1251,35 +1326,6 @@ fn component_kind(component: &Json) -> Option<&str> { component.get("kind").and_then(Json::as_str) } -/// Like `merge_json_value`, but concatenates a `pricing` component's `config.sources` -/// (higher-precedence first) instead of replacing them, so lower-precedence fallback sources survive. -fn merge_pricing_component(existing: &mut Json, higher_priority: Json) { - let lower_priority_sources = pricing_component_sources(existing).cloned(); - let higher_priority_sources = pricing_component_sources(&higher_priority).cloned(); - merge_json_value(existing, higher_priority); - - let Some(mut sources) = higher_priority_sources else { - return; - }; - if let Some(lower_priority_sources) = lower_priority_sources { - sources.extend(lower_priority_sources); - } - set_pricing_component_sources(existing, sources); -} - -fn pricing_component_sources(component: &Json) -> Option<&Vec> { - component - .get("config") - .and_then(|config| config.get("sources")) - .and_then(Json::as_array) -} - -fn set_pricing_component_sources(component: &mut Json, sources: Vec) { - if let Some(config) = component.get_mut("config").and_then(Json::as_object_mut) { - config.insert("sources".into(), Json::Array(sources)); - } -} - /// Returns the JSON Schema for the canonical plugin configuration document. #[cfg(feature = "schema")] pub fn plugin_config_schema() -> Json { diff --git a/crates/core/tests/integration/atif_storage_tests.rs b/crates/core/tests/integration/atif_storage_tests.rs index 6703cf491..524905835 100644 --- a/crates/core/tests/integration/atif_storage_tests.rs +++ b/crates/core/tests/integration/atif_storage_tests.rs @@ -105,6 +105,7 @@ fn reset_runtime() { fn build_observability_config(bucket: &str, key_prefix: &str) -> PluginConfig { let Json::Object(component_config) = json!({ + "version": 3, "atif": { "enabled": true, "filename_template": "trajectory-{session_id}.json", @@ -142,6 +143,7 @@ fn build_http_observability_config(endpoints: &[String]) -> PluginConfig { }) .collect::>(); let Json::Object(component_config) = json!({ + "version": 3, "atif": { "enabled": true, "filename_template": "trajectory-{session_id}.json", diff --git a/crates/core/tests/integration/middleware_tests.rs b/crates/core/tests/integration/middleware_tests.rs index 41093cdcb..18d9b7c34 100644 --- a/crates/core/tests/integration/middleware_tests.rs +++ b/crates/core/tests/integration/middleware_tests.rs @@ -64,16 +64,10 @@ use nemo_relay::codec::optimization::{ }; use nemo_relay::error::FlowError; use nemo_relay::json::Json; -#[cfg(all(feature = "otel", feature = "openinference"))] -use nemo_relay::observability::MarkProjection; -#[cfg(all(feature = "otel", feature = "openinference"))] +use nemo_relay::observability::OpenTelemetryType; use nemo_relay::observability::atif::{AtifAgentInfo, AtifExporter}; -#[cfg(all(feature = "otel", feature = "openinference"))] -use nemo_relay::observability::openinference::OpenInferenceSubscriber; -#[cfg(all(feature = "otel", feature = "openinference"))] use nemo_relay::observability::otel::OpenTelemetrySubscriber; use nemo_relay::plugin::{PluginRegistrationContext, rollback_registrations}; -#[cfg(all(feature = "otel", feature = "openinference"))] use opentelemetry_sdk::trace::{InMemorySpanExporterBuilder, SdkTracerProvider}; use serde_json::json; @@ -821,7 +815,6 @@ async fn test_tool_execution_outcome_marks_follow_end_with_tool_parentage() { deregister_subscriber("tool_outcome_mark_observer").unwrap(); } -#[cfg(all(feature = "otel", feature = "openinference"))] #[tokio::test] async fn test_managed_tool_pending_marks_project_through_trace_exporters_only() { let _lock = TEST_MUTEX.lock().unwrap(); @@ -852,10 +845,9 @@ async fn test_managed_tool_pending_marks_project_through_trace_exporters_only() let otel_provider = SdkTracerProvider::builder() .with_simple_exporter(otel_exporter.clone()) .build(); - let otel = OpenTelemetrySubscriber::from_tracer_provider_with_mark_projection( + let otel = OpenTelemetrySubscriber::from_tracer_provider( otel_provider, "managed-tool-projection-otel", - MarkProjection::Tool, ); register_subscriber("managed_tool_projection_otel", otel.subscriber()).unwrap(); @@ -863,10 +855,10 @@ async fn test_managed_tool_pending_marks_project_through_trace_exporters_only() let openinference_provider = SdkTracerProvider::builder() .with_simple_exporter(openinference_exporter.clone()) .build(); - let openinference = OpenInferenceSubscriber::from_tracer_provider_with_mark_projection( + let openinference = OpenTelemetrySubscriber::from_tracer_provider_with_type( openinference_provider, "managed-tool-projection-openinference", - MarkProjection::Tool, + OpenTelemetryType::OpenInference, ); register_subscriber( "managed_tool_projection_openinference", @@ -952,8 +944,8 @@ async fn test_managed_tool_pending_marks_project_through_trace_exporters_only() assert_eq!(otel_mark.parent_span_id, otel_tool.span_context.span_id()); assert!(otel_mark.start_time > otel_tool.end_time); assert!(otel_mark.attributes.iter().any(|attribute| { - attribute.key.as_str() == "nemo_relay.mark.projection" - && attribute.value.to_string() == "tool" + attribute.key.as_str() == "nemo_relay.mark.orphan" + && attribute.value == opentelemetry::Value::Bool(true) })); for (key, value) in [ ("nemo_relay.mark.category", "custom"), @@ -984,7 +976,8 @@ async fn test_managed_tool_pending_marks_project_through_trace_exporters_only() ); assert!(openinference_mark.start_time > openinference_tool.end_time); assert!(openinference_mark.attributes.iter().any(|attribute| { - attribute.key.as_str() == "openinference.span.kind" && attribute.value.to_string() == "TOOL" + attribute.key.as_str() == "nemo_relay.mark.orphan" + && attribute.value == opentelemetry::Value::Bool(true) })); for (key, value) in [ ("nemo_relay.mark.category", "custom"), diff --git a/crates/core/tests/unit/observability/exporter_parity_tests.rs b/crates/core/tests/unit/observability/exporter_parity_tests.rs index 4982038e0..61369833b 100644 --- a/crates/core/tests/unit/observability/exporter_parity_tests.rs +++ b/crates/core/tests/unit/observability/exporter_parity_tests.rs @@ -26,11 +26,11 @@ use crate::codec::response::{ PricingCatalog, PricingResolver, reset_active_pricing_resolver, set_active_pricing_resolver, }; use crate::json::Json; +use crate::observability::OpenTelemetryType; use crate::observability::atif::{ AtifAgentInfo, AtifExporter, AtifStep, AtifStepExtra, AtifTrajectory, }; -use crate::observability::openinference::OpenInferenceSubscriber; -use crate::observability::otel::OpenTelemetrySubscriber; +use crate::observability::otel::{OpenTelemetrySubscriber, RelayIdGenerator}; // ------------------------------------------------------------------- // Helpers @@ -87,6 +87,7 @@ fn make_provider() -> ( ) { let exporter = InMemorySpanExporterBuilder::new().build(); let provider = SdkTracerProvider::builder() + .with_id_generator(RelayIdGenerator) .with_simple_exporter(exporter.clone()) .build(); (provider, exporter) @@ -238,9 +239,10 @@ fn export_through_all_exporters(events: &[Event]) -> ParityExports { let otel_record = otel.subscriber(); let (openinference_provider, openinference_exporter) = make_provider(); - let openinference = OpenInferenceSubscriber::from_tracer_provider( + let openinference = OpenTelemetrySubscriber::from_tracer_provider_with_type( openinference_provider, "parity-openinference", + OpenTelemetryType::OpenInference, ); let openinference_record = openinference.subscriber(); diff --git a/crates/core/tests/unit/observability/manual_tests.rs b/crates/core/tests/unit/observability/manual_tests.rs index 55fafc564..ceed7bbf8 100644 --- a/crates/core/tests/unit/observability/manual_tests.rs +++ b/crates/core/tests/unit/observability/manual_tests.rs @@ -8,7 +8,6 @@ use super::*; use serde_json::json; #[test] -#[cfg(feature = "otel")] fn cost_otel_policy_emits_any_currency() { let output = json!({"usage": {"cost": {"total": 0.5, "currency": "EUR"}}}); assert_eq!( @@ -18,7 +17,6 @@ fn cost_otel_policy_emits_any_currency() { } #[test] -#[cfg(feature = "openinference")] fn cost_openinference_policy_drops_non_usd() { let output = json!({"usage": {"cost": {"total": 0.5, "currency": "EUR"}}}); assert_eq!( @@ -28,7 +26,6 @@ fn cost_openinference_policy_drops_non_usd() { } #[test] -#[cfg(feature = "otel")] fn cost_component_sum_emits_currency_for_otel() { let output = json!({"usage": {"cost": {"input": 0.5, "output": 0.375, "currency": "EUR"}}}); assert_eq!( @@ -38,7 +35,6 @@ fn cost_component_sum_emits_currency_for_otel() { } #[test] -#[cfg(feature = "openinference")] fn cost_usd_field_passes_usd_only() { let output = json!({"usage": {"cost_usd": 1.25}}); assert_eq!( @@ -48,7 +44,6 @@ fn cost_usd_field_passes_usd_only() { } #[test] -#[cfg(feature = "openinference")] fn cost_absent_currency_treated_as_usd() { let output = json!({"usage": {"cost": {"total": 0.9}}}); assert_eq!( @@ -84,7 +79,6 @@ fn cost_atif_policy_accepts_relay_normalized_component_cost_without_currency() { } #[test] -#[cfg(feature = "openinference")] fn cost_per_map_fallthrough_under_usd_only() { // A non-USD `usage` cost is skipped under usd_only; `token_usage` USD wins. let output = json!({ diff --git a/crates/core/tests/unit/observability/openinference_tests.rs b/crates/core/tests/unit/observability/openinference_tests.rs index 22a3ca14d..fd48bfc02 100644 --- a/crates/core/tests/unit/observability/openinference_tests.rs +++ b/crates/core/tests/unit/observability/openinference_tests.rs @@ -23,13 +23,18 @@ use crate::codec::response::{ ResponseToolCall, Usage, reset_active_pricing_resolver, set_active_pricing_resolver, }; use crate::json::Json; +use crate::observability::MarkProjection; use crate::observability::atif::{AtifAgentInfo, AtifExporter, AtifStepExtra}; +use crate::observability::otel::RelayIdGenerator; +use opentelemetry::trace::SpanContext; use opentelemetry::trace::Status; use opentelemetry_sdk::trace::InMemorySpanExporterBuilder; +use opentelemetry_sdk::trace::SdkTracerProvider; use serde_json::json; use std::collections::HashMap; use std::io::{Read, Write}; use std::net::TcpListener; +use std::sync::Arc; use std::sync::mpsc; use std::thread; use uuid::Uuid; @@ -56,6 +61,7 @@ fn make_provider() -> ( ) { let exporter = InMemorySpanExporterBuilder::new().build(); let provider = SdkTracerProvider::builder() + .with_id_generator(RelayIdGenerator) .with_simple_exporter(exporter.clone()) .build(); (provider, exporter) @@ -676,71 +682,60 @@ fn header_value(headers_text: &str, header_name: &str) -> Option { #[test] fn config_defaults_and_builder_overrides_are_applied() { - let config = OpenInferenceConfig::new() - .with_service_name("demo-agent") - .with_endpoint("http://localhost:4318/v1/traces") - .with_header("authorization", "Bearer token") - .with_resource_attribute("deployment.environment", "test") - .with_service_namespace("agents") - .with_service_version("1.2.3") - .with_instrumentation_scope("demo-scope") - .with_mark_projection(MarkProjection::Tool) - .with_mark_exclude_names(["notification", "hook_mark"]) - .with_timeout(Duration::from_millis(1250)); - - assert_eq!(config.transport, OtlpTransport::HttpBinary); - assert_eq!( - config.endpoint.as_deref(), - Some("http://localhost:4318/v1/traces") - ); - assert_eq!( - config.headers.get("authorization"), - Some(&"Bearer token".into()) - ); - assert_eq!( - config.resource_attributes.get("deployment.environment"), - Some(&"test".into()) - ); - assert_eq!(config.service_name, "demo-agent"); - assert_eq!(config.service_namespace.as_deref(), Some("agents")); - assert_eq!(config.service_version.as_deref(), Some("1.2.3")); - assert_eq!(config.instrumentation_scope, "demo-scope"); - assert_eq!(config.mark_projection, MarkProjection::Tool); - assert_eq!(config.mark_exclude_names, vec!["notification", "hook_mark"]); - assert_eq!(config.timeout, Duration::from_millis(1250)); - - let defaults = OpenInferenceConfig::default(); - assert_eq!(defaults.transport, OtlpTransport::HttpBinary); - assert_eq!(defaults.service_name, "nemo-relay"); - assert_eq!(defaults.instrumentation_scope, "nemo-relay-openinference"); - assert_eq!(defaults.mark_projection, MarkProjection::Inherit); - assert_eq!(defaults.mark_exclude_names, vec!["llm.chunk"]); - assert_eq!(defaults.timeout, Duration::from_secs(3)); - assert!(defaults.headers.is_empty()); - assert!(defaults.resource_attributes.is_empty()); + let config = crate::observability::otel::OpenTelemetryConfig::new( + crate::observability::OpenTelemetryType::OpenInference, + "http://localhost:4318/v1/traces", + ) + .with_service_name("demo-agent") + .with_header("authorization", "Bearer token") + .with_resource_attribute("deployment.environment", "test") + .with_service_namespace("agents") + .with_service_version("1.2.3") + .with_instrumentation_scope("demo-scope") + .with_timeout(Duration::from_millis(1250)); + let subscriber = + crate::observability::otel::OpenTelemetrySubscriber::new(config).expect("valid config"); + subscriber.force_flush().unwrap(); + subscriber.shutdown().unwrap(); } #[test] -fn grpc_config_requires_a_tokio_runtime() { - let err = match OpenInferenceSubscriber::new( - OpenInferenceConfig::new() - .with_service_name("demo-agent") - .with_transport(OtlpTransport::Grpc), - ) { - Ok(_) => panic!("gRPC construction should require a Tokio runtime"), - Err(err) => err, - }; - assert!(matches!(err, OpenInferenceError::MissingTokioRuntime)); +fn grpc_config_owns_its_tokio_runtime() { + let subscriber = crate::observability::otel::OpenTelemetrySubscriber::new( + crate::observability::otel::OpenTelemetryConfig::new( + crate::observability::OpenTelemetryType::OpenInference, + "http://127.0.0.1:4317", + ) + .with_service_name("demo-agent") + .with_transport(crate::observability::otel::OtlpTransport::Grpc), + ) + .expect("gRPC construction should not require an ambient Tokio runtime"); + subscriber.shutdown().unwrap(); } #[test] fn invalid_grpc_headers_are_rejected() { - let err = build_grpc_metadata(&HashMap::from([( - "bad key".to_string(), - "value".to_string(), - )])) - .expect_err("invalid metadata key should fail"); - assert!(matches!(err, OpenInferenceError::InvalidGrpcHeader { .. })); + let runtime = tokio::runtime::Builder::new_current_thread() + .enable_all() + .build() + .unwrap(); + let err = runtime.block_on(async { + match crate::observability::otel::OpenTelemetrySubscriber::new( + crate::observability::otel::OpenTelemetryConfig::new( + crate::observability::OpenTelemetryType::OpenInference, + "http://127.0.0.1:4317", + ) + .with_transport(crate::observability::otel::OtlpTransport::Grpc) + .with_header("bad key", "value"), + ) { + Ok(_) => panic!("invalid metadata key should fail"), + Err(err) => err, + } + }); + assert!(matches!( + err, + crate::observability::otel::OpenTelemetryError::InvalidHeader { .. } + )); } #[test] @@ -749,7 +744,12 @@ fn subscriber_registration_and_provider_lifecycle_methods_work() { reset_global(); let (provider, _exporter) = make_provider(); - let subscriber = OpenInferenceSubscriber::from_tracer_provider(provider, "test-scope"); + let subscriber = + crate::observability::otel::OpenTelemetrySubscriber::from_tracer_provider_with_type( + provider, + "test-scope", + crate::observability::OpenTelemetryType::OpenInference, + ); let name = format!("otel_test_{}", Uuid::now_v7().simple()); subscriber.register(&name).unwrap(); @@ -762,10 +762,12 @@ fn subscriber_registration_and_provider_lifecycle_methods_work() { #[test] fn mapped_aliases_are_typed_and_cannot_replace_projected_span_fields() { let (provider, exporter) = make_provider(); - let subscriber = OpenInferenceSubscriber::from_tracer_provider_with_options( + let subscriber = + crate::observability::otel::OpenTelemetrySubscriber::from_tracer_provider_with_type_and_options( provider, "mapping-scope", - OpenInferenceSubscriberOptions { + crate::observability::OpenTelemetryType::OpenInference, + crate::observability::otel::OpenTelemetrySubscriberOptions { mark_projection: MarkProjection::Tool, mark_exclude_names: vec!["custom.mark".to_string()], attribute_mappings: vec![ @@ -848,7 +850,12 @@ fn mapped_aliases_are_typed_and_cannot_replace_projected_span_fields() { #[test] fn session_identity_is_projected_on_trace_roots_and_marks_only() { let (provider, exporter) = make_provider(); - let subscriber = OpenInferenceSubscriber::from_tracer_provider(provider, "session-identity"); + let subscriber = + crate::observability::otel::OpenTelemetrySubscriber::from_tracer_provider_with_type( + provider, + "session-identity", + crate::observability::OpenTelemetryType::OpenInference, + ); let callback = subscriber.subscriber(); let root_uuid = Uuid::now_v7(); let child_uuid = Uuid::now_v7(); @@ -986,13 +993,18 @@ fn session_identity_is_projected_on_trace_roots_and_marks_only() { #[test] fn mapped_orphan_mark_alias_cannot_replace_intrinsic_mark_fields() { let (provider, exporter) = make_provider(); - let subscriber = OpenInferenceSubscriber::from_tracer_provider_with_attribute_mappings( + let subscriber = + crate::observability::otel::OpenTelemetrySubscriber::from_tracer_provider_with_type_and_options( provider, "mapping-scope", - [crate::observability::OtlpAttributeMapping::new( - "nemo_relay.mark.data.value", - "nemo_relay.mark.orphan", - )], + crate::observability::OpenTelemetryType::OpenInference, + crate::observability::otel::OpenTelemetrySubscriberOptions { + attribute_mappings: vec![crate::observability::OtlpAttributeMapping::new( + "nemo_relay.mark.data.value", + "nemo_relay.mark.orphan", + )], + ..Default::default() + }, ) .unwrap(); let callback = subscriber.subscriber(); @@ -1030,7 +1042,12 @@ fn registered_subscriber_emits_spans_for_scope_push_pop_and_marks() { reset_global(); let (provider, exporter) = make_provider(); - let subscriber = OpenInferenceSubscriber::from_tracer_provider(provider, "e2e-scope"); + let subscriber = + crate::observability::otel::OpenTelemetrySubscriber::from_tracer_provider_with_type( + provider, + "e2e-scope", + crate::observability::OpenTelemetryType::OpenInference, + ); let name = format!("otel_e2e_{}", Uuid::now_v7().simple()); subscriber.register(&name).unwrap(); @@ -1096,7 +1113,7 @@ fn registered_subscriber_emits_spans_for_scope_push_pop_and_marks() { Some(&"start".to_string()) ); assert_eq!( - attributes.get(oi::METADATA.as_str()), + attributes.get("metadata"), Some(&"{\"phase\":\"start\"}".to_string()) ); @@ -1126,10 +1143,12 @@ fn http_config_exports_scope_push_pop_and_marks_without_tokio_runtime() { let (request_tx, request_rx) = mpsc::channel(); spawn_http_collector(listener, request_tx); - let config = OpenInferenceConfig::new() - .with_service_name("demo-agent") - .with_endpoint(endpoint); - let subscriber = OpenInferenceSubscriber::new(config).unwrap(); + let config = crate::observability::otel::OpenTelemetryConfig::new( + crate::observability::OpenTelemetryType::OpenInference, + endpoint, + ) + .with_service_name("demo-agent"); + let subscriber = crate::observability::otel::OpenTelemetrySubscriber::new(config).unwrap(); let name = format!("otel_http_{}", Uuid::now_v7().simple()); subscriber.register(&name).unwrap(); @@ -1173,8 +1192,10 @@ fn http_config_exports_scope_push_pop_and_marks_without_tokio_runtime() { #[test] fn records_span_start_mark_and_end() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let root_uuid = Uuid::now_v7(); let start = make_start_event( @@ -1225,8 +1246,10 @@ fn records_span_start_mark_and_end() { #[test] fn openclaw_model_timing_marks_attach_to_parent_spans() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let root_uuid = Uuid::now_v7(); processor.process(&make_start_event( @@ -1317,8 +1340,10 @@ fn openclaw_model_timing_marks_attach_to_parent_spans() { #[test] fn openclaw_hook_only_fallbacks_preserve_stripped_content_and_explicit_usage() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let stripped_uuid = Uuid::now_v7(); let partial_uuid = Uuid::now_v7(); @@ -1459,8 +1484,10 @@ fn openclaw_hook_only_fallbacks_preserve_stripped_content_and_explicit_usage() { #[test] fn llm_input_value_omits_request_headers() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let root_uuid = Uuid::now_v7(); processor.process(&make_start_event( @@ -1505,8 +1532,10 @@ fn un_annotated_provider_response_decoded_through_codec() { // detected and decoded through the codec layer (tier 3), so OpenInference // emits structured output messages instead of nothing. let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let uuid = Uuid::now_v7(); processor.process(&make_start_event( @@ -1555,8 +1584,10 @@ fn un_annotated_anthropic_response_emits_codec_computed_total_tokens() { // The un-annotated path must surface that codec total rather than dropping // it the way the manual scraper does. let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let uuid = Uuid::now_v7(); processor.process(&make_start_event( @@ -1599,8 +1630,10 @@ fn provider_shaped_empty_usage_falls_back_to_manual_token_usage() { // A provider-shaped response with an empty `usage` object yields an empty // codec usage; that must not mask the manual scraper's `token_usage`. let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let uuid = Uuid::now_v7(); processor.process(&make_start_event( @@ -1644,8 +1677,10 @@ fn provider_shaped_partial_usage_merges_with_manual_token_usage() { // per-field merge must keep all three rather than letting partial codec usage // mask the scraper's fields. let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let uuid = Uuid::now_v7(); processor.process(&make_start_event( @@ -1687,8 +1722,10 @@ fn provider_shaped_partial_usage_merges_with_manual_token_usage() { #[test] fn openclaw_replay_payloads_emit_flattened_openinference_llm_attributes() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let uuid = Uuid::now_v7(); processor.process(&make_start_event( @@ -1784,8 +1821,10 @@ fn openclaw_replay_payloads_emit_flattened_openinference_llm_attributes() { #[test] fn openclaw_replay_payloads_fall_back_to_prompt_when_replay_messages_are_empty() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let uuid = Uuid::now_v7(); processor.process(&make_start_event( @@ -1845,8 +1884,10 @@ fn openclaw_replay_payloads_fall_back_to_prompt_when_replay_messages_are_empty() #[test] fn openclaw_replay_payloads_fall_back_to_prompt_when_replay_messages_are_incomplete() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let uuid = Uuid::now_v7(); processor.process(&make_start_event( @@ -1910,8 +1951,10 @@ fn openclaw_replay_payloads_fall_back_to_prompt_when_replay_messages_are_incompl #[test] fn openclaw_replay_tool_call_alias_fields_emit_openinference_attributes() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let uuid = Uuid::now_v7(); processor.process(&make_start_event( @@ -1995,8 +2038,10 @@ fn openclaw_replay_tool_call_alias_fields_emit_openinference_attributes() { #[test] fn openclaw_subagent_scopes_preserve_nested_and_fallback_parent_linkage() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let parent_uuid = Uuid::now_v7(); let nested_child_uuid = Uuid::now_v7(); let fallback_child_uuid = Uuid::now_v7(); @@ -2118,8 +2163,10 @@ fn openclaw_subagent_scopes_preserve_nested_and_fallback_parent_linkage() { #[test] fn openclaw_placeholder_replay_falls_back_to_sanitized_json_input_value() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let uuid = Uuid::now_v7(); processor.process(&make_start_event( @@ -2192,8 +2239,10 @@ fn openclaw_placeholder_replay_falls_back_to_sanitized_json_input_value() { #[test] fn generic_unannotated_llm_output_does_not_emit_flattened_output_message_attrs() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let uuid = Uuid::now_v7(); processor.process(&make_start_event( @@ -2238,8 +2287,10 @@ fn generic_unannotated_llm_output_does_not_emit_flattened_output_message_attrs() #[test] fn llm_input_value_summarizes_tool_call_messages() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let root_uuid = Uuid::now_v7(); processor.process(&make_start_event( @@ -2292,8 +2343,10 @@ fn llm_input_value_summarizes_tool_call_messages() { #[test] fn output_value_prefers_display_content() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let root_uuid = Uuid::now_v7(); processor.process(&make_start_event( @@ -2341,8 +2394,10 @@ fn output_value_prefers_display_content() { #[test] fn output_value_extracts_chat_completion_display_text() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let root_uuid = Uuid::now_v7(); processor.process(&make_start_event( @@ -2422,8 +2477,10 @@ fn display_text_from_tool_calls_preserves_legacy_name_precedence() { #[test] fn output_value_extracts_openai_responses_display_text_and_usage() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let root_uuid = Uuid::now_v7(); processor.process(&make_scope_event_with_profile( @@ -2507,8 +2564,10 @@ fn output_value_extracts_openai_responses_display_text_and_usage() { #[test] fn tool_semantic_names_exist_without_input_payload() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let root_uuid = Uuid::now_v7(); processor.process(&make_start_event( @@ -2543,11 +2602,12 @@ fn tool_semantic_names_exist_without_input_payload() { #[test] fn derives_span_ids_from_relay_uuids() { let (provider, exporter) = make_provider(); - let mut processor = OpenInferenceEventProcessor::new_with_mark_projection( - provider.clone(), - "test-scope".to_string(), - MarkProjection::Tool, - ); + let mut processor = + crate::observability::otel::OtelEventProcessor::new_openinference_with_mark_projection( + provider.clone(), + "test-scope".to_string(), + MarkProjection::Tool, + ); let root_uuid = Uuid::from_u128(0x018f_0f0f_0f0f_7000_8123_4567_89ab_cdef); let child_uuid = Uuid::from_u128(0x018f_0f0f_0f10_7000_8fed_cba9_8765_4321); @@ -2638,8 +2698,10 @@ fn derives_span_ids_from_relay_uuids() { #[test] fn atif_lineage_correlates_with_openinference_span_attributes() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let agent_uuid = Uuid::now_v7(); let llm_uuid = Uuid::now_v7(); @@ -2724,8 +2786,10 @@ fn atif_lineage_correlates_with_openinference_span_attributes() { #[test] fn orphan_marks_become_zero_duration_spans() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let mark = make_mark_event(None, "detached", Some(json!({"kind": "standalone"}))); processor.process(&mark); @@ -2751,11 +2815,12 @@ fn orphan_marks_become_zero_duration_spans() { #[test] fn tool_projection_emits_generic_mark_as_parented_openinference_tool_span() { let (provider, exporter) = make_provider(); - let mut processor = OpenInferenceEventProcessor::new_with_mark_projection( - provider.clone(), - "test-scope".to_string(), - MarkProjection::Tool, - ); + let mut processor = + crate::observability::otel::OtelEventProcessor::new_openinference_with_mark_projection( + provider.clone(), + "test-scope".to_string(), + MarkProjection::Tool, + ); let parent_uuid = Uuid::now_v7(); let start = make_start_event(parent_uuid, None, "agent-turn", ScopeType::Agent, None); let mark = Event::Mark(MarkEvent::new( @@ -2852,11 +2917,12 @@ fn tool_projection_emits_generic_mark_as_parented_openinference_tool_span() { #[test] fn tool_projection_omits_standard_payload_attributes_when_mark_payload_is_absent() { let (provider, exporter) = make_provider(); - let mut processor = OpenInferenceEventProcessor::new_with_mark_projection( - provider.clone(), - "test-scope".to_string(), - MarkProjection::Tool, - ); + let mut processor = + crate::observability::otel::OtelEventProcessor::new_openinference_with_mark_projection( + provider.clone(), + "test-scope".to_string(), + MarkProjection::Tool, + ); processor.process(&make_mark_event(None, "plugin.checkpoint", None)); processor.force_flush().unwrap(); @@ -2889,11 +2955,12 @@ fn tool_projection_omits_standard_payload_attributes_when_mark_payload_is_absent #[test] fn tool_projection_handles_data_and_metadata_independently() { let (provider, exporter) = make_provider(); - let mut processor = OpenInferenceEventProcessor::new_with_mark_projection( - provider.clone(), - "test-scope".to_string(), - MarkProjection::Tool, - ); + let mut processor = + crate::observability::otel::OtelEventProcessor::new_openinference_with_mark_projection( + provider.clone(), + "test-scope".to_string(), + MarkProjection::Tool, + ); processor.process(&make_mark_event( None, "plugin.data_only", @@ -2961,7 +3028,7 @@ fn tool_projection_handles_data_and_metadata_independently() { #[test] fn tool_projection_exclusion_keeps_custom_mark_as_native_event() { let (provider, exporter) = make_provider(); - let mut processor = OpenInferenceEventProcessor::new_with_mark_projection_and_exclusions( + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference_with_mark_projection_and_exclusions( provider.clone(), "test-scope".to_string(), MarkProjection::Tool, @@ -2987,11 +3054,12 @@ fn tool_projection_exclusion_keeps_custom_mark_as_native_event() { #[test] fn tool_projection_reuses_completed_parent_context_for_late_marks() { let (provider, exporter) = make_provider(); - let mut processor = OpenInferenceEventProcessor::new_with_mark_projection( - provider.clone(), - "test-scope".to_string(), - MarkProjection::Tool, - ); + let mut processor = + crate::observability::otel::OtelEventProcessor::new_openinference_with_mark_projection( + provider.clone(), + "test-scope".to_string(), + MarkProjection::Tool, + ); let parent_uuid = Uuid::now_v7(); processor.process(&make_start_event( @@ -3043,11 +3111,12 @@ fn tool_projection_reuses_completed_parent_context_for_late_marks() { #[test] fn tool_projection_keeps_llm_chunks_as_parent_span_events() { let (provider, exporter) = make_provider(); - let mut processor = OpenInferenceEventProcessor::new_with_mark_projection( - provider.clone(), - "test-scope".to_string(), - MarkProjection::Tool, - ); + let mut processor = + crate::observability::otel::OtelEventProcessor::new_openinference_with_mark_projection( + provider.clone(), + "test-scope".to_string(), + MarkProjection::Tool, + ); let parent_uuid = Uuid::now_v7(); let start = make_start_event(parent_uuid, None, "llm", ScopeType::Llm, None); let chunk = make_mark_event(Some(parent_uuid), "llm.chunk", Some(json!({"delta": "x"}))); @@ -3079,8 +3148,10 @@ fn tool_projection_keeps_llm_chunks_as_parent_span_events() { #[test] fn late_parented_marks_reuse_completed_parent_trace_context() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let tool_uuid = Uuid::now_v7(); processor.process(&make_start_event( @@ -3136,9 +3207,11 @@ fn late_parented_marks_reuse_completed_parent_trace_context() { #[test] fn completed_span_context_cache_evicts_oldest_parent_contexts() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); - let span_count = COMPLETED_SPAN_CONTEXT_LIMIT + 2; + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); + let span_count = 4096 + 2; let mut completed_uuids = Vec::with_capacity(span_count); for index in 0..span_count { @@ -3215,7 +3288,10 @@ fn completed_span_context_cache_evicts_oldest_parent_contexts() { #[test] fn process_start_removes_completed_span_order_entry() { let (provider, _exporter) = make_provider(); - let mut processor = OpenInferenceEventProcessor::new(provider, "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider, + "test-scope".to_string(), + ); let tool_uuid = Uuid::now_v7(); processor.process(&make_start_event( @@ -3333,8 +3409,10 @@ fn semantic_scope_type_and_input_value_follow_event_variants() { #[test] fn scope_end_output_payload_is_exported_to_openinference_attributes() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let scope_uuid = Uuid::now_v7(); processor.process(&make_start_event( @@ -3387,8 +3465,10 @@ fn scope_end_metadata_sets_openinference_span_status() { for (metadata, expected_status) in cases { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let scope_uuid = Uuid::now_v7(); processor.process(&make_start_event( @@ -3451,29 +3531,23 @@ fn helper_functions_cover_additional_openinference_branches() { assert_eq!( openinference_span_kind(Some(ScopeType::Embedder)), - OpenInferenceSpanKind::Embedding + "EMBEDDING" ); assert_eq!( openinference_span_kind(Some(ScopeType::Reranker)), - OpenInferenceSpanKind::Reranker + "RERANKER" ); assert_eq!( openinference_span_kind(Some(ScopeType::Guardrail)), - OpenInferenceSpanKind::Guardrail + "GUARDRAIL" ); assert_eq!( openinference_span_kind(Some(ScopeType::Evaluator)), - OpenInferenceSpanKind::Evaluator - ); - assert_eq!( - openinference_span_kind(Some(ScopeType::Custom)), - OpenInferenceSpanKind::Chain - ); - assert_eq!( - openinference_span_kind(Some(ScopeType::Unknown)), - OpenInferenceSpanKind::Chain + "EVALUATOR" ); - assert_eq!(openinference_span_kind(None), OpenInferenceSpanKind::Chain); + assert_eq!(openinference_span_kind(Some(ScopeType::Custom)), "CHAIN"); + assert_eq!(openinference_span_kind(Some(ScopeType::Unknown)), "CHAIN"); + assert_eq!(openinference_span_kind(None), "CHAIN"); let llm_end = Event::Scope(ScopeEvent::new( BaseEvent::builder() @@ -3489,7 +3563,7 @@ fn helper_functions_cover_additional_openinference_branches() { let llm_attributes = attr_map(&common_attributes(&llm_end)); assert!(!llm_attributes.contains_key("nemo_relay.model_name")); assert_eq!( - llm_attributes.get(oi::llm::MODEL_NAME.as_str()), + llm_attributes.get("llm.model_name"), Some(&"demo-model".to_string()) ); let raw_model_end = Event::Scope(ScopeEvent::new( @@ -3504,7 +3578,7 @@ fn helper_functions_cover_additional_openinference_branches() { )); let raw_model_attributes = attr_map(&common_attributes(&raw_model_end)); assert_eq!( - raw_model_attributes.get(oi::llm::MODEL_NAME.as_str()), + raw_model_attributes.get("llm.model_name"), Some(&"raw-model".to_string()) ); let response_model_end = Event::Scope(ScopeEvent::new( @@ -3530,7 +3604,7 @@ fn helper_functions_cover_additional_openinference_branches() { )); let response_model_attributes = attr_map(&common_attributes(&response_model_end)); assert_eq!( - response_model_attributes.get(oi::llm::MODEL_NAME.as_str()), + response_model_attributes.get("llm.model_name"), Some(&"response-model".to_string()) ); assert_eq!( @@ -3538,7 +3612,7 @@ fn helper_functions_cover_additional_openinference_branches() { Some(&"done".to_string()) ); assert_eq!( - llm_attributes.get(oi::METADATA.as_str()), + llm_attributes.get("metadata"), Some(&"{\"phase\":\"done\"}".to_string()) ); @@ -3555,23 +3629,23 @@ fn helper_functions_cover_additional_openinference_branches() { )); let tool_start_attributes = attr_map(&start_attributes(&tool_start)); assert_eq!( - tool_start_attributes.get(oi::tool::NAME.as_str()), + tool_start_attributes.get("tool.name"), Some(&"lookup".to_string()) ); assert_eq!( - tool_start_attributes.get(oi::tool_call::function::NAME.as_str()), + tool_start_attributes.get("tool_call.function.name"), Some(&"lookup".to_string()) ); assert_eq!( - tool_start_attributes.get(oi::tool::PARAMETERS.as_str()), + tool_start_attributes.get("tool.parameters"), Some(&"{\"query\":\"hello\"}".to_string()) ); assert_eq!( - tool_start_attributes.get(oi::tool_call::function::ARGUMENTS.as_str()), + tool_start_attributes.get("tool_call.function.arguments"), Some(&"{\"query\":\"hello\"}".to_string()) ); assert_eq!( - tool_start_attributes.get(oi::tool_call::ID.as_str()), + tool_start_attributes.get("tool_call.id"), Some(&"call-123".to_string()) ); @@ -3588,11 +3662,11 @@ fn helper_functions_cover_additional_openinference_branches() { )); let tool_end_attributes = attr_map(&end_attributes(&tool_end)); assert_eq!( - tool_end_attributes.get(oi::output::VALUE.as_str()), + tool_end_attributes.get("output.value"), Some(&"{\"result\":true}".to_string()) ); assert_eq!( - tool_end_attributes.get(oi::output::MIME_TYPE.as_str()), + tool_end_attributes.get("output.mime_type"), Some(&"application/json".to_string()) ); @@ -3660,7 +3734,10 @@ fn helper_functions_cover_additional_openinference_branches() { assert_eq!(alias_usage.total_tokens, Some(18)); assert_eq!(alias_usage.cache_read_tokens, Some(5)); - let mut processor = OpenInferenceEventProcessor::new(make_provider().0, "test".into()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + make_provider().0, + "test".into(), + ); processor.process(&make_end_event( Uuid::now_v7(), None, @@ -3684,60 +3761,51 @@ fn helper_functions_cover_additional_openinference_branches() { #[test] fn provider_builders_cover_success_paths() { - let http_provider = build_tracer_provider( - &OpenInferenceConfig::new() - .with_service_name("demo-agent") - .with_header("authorization", "Bearer token") - .with_resource_attribute("deployment.environment", "test") - .with_service_namespace("agents") - .with_service_version("1.2.3"), + let subscriber = crate::observability::otel::OpenTelemetrySubscriber::new( + crate::observability::otel::OpenTelemetryConfig::new( + crate::observability::OpenTelemetryType::OpenInference, + "http://127.0.0.1:4318/v1/traces", + ) + .with_service_name("http-success") + .with_header("authorization", "Bearer token") + .with_resource_attribute("deployment.environment", "test") + .with_service_namespace("agents") + .with_service_version("1.2.3"), ) .unwrap(); - http_provider.force_flush().unwrap(); - http_provider.shutdown().unwrap(); - - let subscriber = - OpenInferenceSubscriber::new(OpenInferenceConfig::new().with_service_name("http-success")) - .unwrap(); subscriber.force_flush().unwrap(); subscriber.shutdown().unwrap(); } #[test] fn grpc_metadata_and_runtime_builder_paths_succeed() { - let metadata = build_grpc_metadata(&HashMap::from([( - "authorization".to_string(), - "Bearer token".to_string(), - )])) - .unwrap(); - assert_eq!( - metadata.get("authorization").unwrap().to_str().unwrap(), - "Bearer token" - ); - let runtime = tokio::runtime::Builder::new_current_thread() .enable_all() .build() .unwrap(); runtime.block_on(async { - let provider = build_tracer_provider( - &OpenInferenceConfig::new() - .with_service_name("grpc-demo") - .with_transport(OtlpTransport::Grpc) - .with_endpoint("http://127.0.0.1:4317") - .with_header("authorization", "Bearer token"), + let subscriber = crate::observability::otel::OpenTelemetrySubscriber::new( + crate::observability::otel::OpenTelemetryConfig::new( + crate::observability::OpenTelemetryType::OpenInference, + "http://127.0.0.1:4317", + ) + .with_service_name("grpc-demo") + .with_transport(crate::observability::otel::OtlpTransport::Grpc) + .with_header("authorization", "Bearer token"), ) .unwrap(); - provider.force_flush().ok(); - provider.shutdown().ok(); + subscriber.force_flush().ok(); + subscriber.shutdown().ok(); }); } #[test] fn llm_end_with_usage_emits_token_count_attributes() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let uuid = Uuid::now_v7(); processor.process(&make_start_event(uuid, None, "chat", ScopeType::Llm, None)); @@ -3807,8 +3875,10 @@ fn llm_end_with_known_model_usage_emits_derived_cost_attribute() { install_test_pricing("priced-model"); let _reset_guard = ResetPricingResolverGuard; let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let uuid = Uuid::now_v7(); processor.process(&make_start_event(uuid, None, "chat", ScopeType::Llm, None)); @@ -3926,8 +3996,10 @@ fn llm_end_with_manual_usage_and_output_model_emits_derived_cost_attribute() { install_test_pricing("priced-model"); let _reset_guard = ResetPricingResolverGuard; let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let uuid = Uuid::now_v7(); processor.process(&make_start_event(uuid, None, "chat", ScopeType::Llm, None)); @@ -3960,8 +4032,10 @@ fn llm_end_with_manual_usage_and_output_model_emits_derived_cost_attribute() { #[test] fn llm_end_with_manual_component_cost_emits_cost_attribute() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let uuid = Uuid::now_v7(); processor.process(&make_start_event(uuid, None, "chat", ScopeType::Llm, None)); @@ -3995,8 +4069,10 @@ fn llm_end_with_manual_component_cost_emits_cost_attribute() { #[test] fn llm_end_with_normalized_usage_cost_emits_cost_attribute() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let uuid = Uuid::now_v7(); processor.process(&make_start_event(uuid, None, "chat", ScopeType::Llm, None)); @@ -4045,8 +4121,10 @@ fn llm_end_with_normalized_usage_cost_emits_cost_attribute() { #[test] fn llm_end_with_component_only_usd_usage_cost_emits_cost_attribute() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let uuid = Uuid::now_v7(); processor.process(&make_start_event(uuid, None, "chat", ScopeType::Llm, None)); @@ -4098,8 +4176,10 @@ fn llm_end_with_non_usd_normalized_usage_cost_blocks_model_pricing_estimate() { install_test_pricing("priced-model"); let _reset_guard = ResetPricingResolverGuard; let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let uuid = Uuid::now_v7(); processor.process(&make_start_event(uuid, None, "test", ScopeType::Llm, None)); @@ -4151,8 +4231,10 @@ fn llm_end_with_unknown_model_usage_omits_derived_cost_attribute() { reset_active_pricing_resolver().unwrap(); let _reset_guard = ResetPricingResolverGuard; let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let uuid = Uuid::now_v7(); processor.process(&make_start_event(uuid, None, "chat", ScopeType::Llm, None)); @@ -4188,8 +4270,10 @@ fn llm_end_with_unknown_model_usage_omits_derived_cost_attribute() { #[test] fn llm_end_with_manual_usage_payload_emits_token_count_attributes() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let uuid = Uuid::now_v7(); processor.process(&make_start_event(uuid, None, "chat", ScopeType::Llm, None)); @@ -4245,8 +4329,10 @@ fn llm_end_with_manual_usage_payload_emits_token_count_attributes() { #[test] fn anthropic_messages_output_emits_openinference_text_tool_and_usage_attributes() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let uuid = Uuid::now_v7(); processor.process(&make_scope_event_with_profile( @@ -4347,8 +4433,10 @@ fn anthropic_messages_output_emits_openinference_text_tool_and_usage_attributes( #[test] fn annotated_llm_payloads_emit_flattened_openinference_message_and_tool_attributes() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let uuid = Uuid::now_v7(); processor.process(&make_scope_event_with_profile( @@ -4526,8 +4614,10 @@ fn annotated_input_projection_covers_extended_roles_and_native_text() { #[test] fn annotated_llm_instructions_emit_leading_system_input_message() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let uuid = Uuid::now_v7(); processor.process(&make_scope_event_with_profile( @@ -4582,8 +4672,10 @@ fn annotated_llm_instructions_emit_leading_system_input_message() { #[test] fn hermes_exact_api_payloads_emit_openinference_text_usage_and_metadata() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let uuid = Uuid::now_v7(); let metadata = json!({ "provider_payload_exact": true, @@ -4683,8 +4775,10 @@ fn hermes_exact_api_payloads_emit_openinference_text_usage_and_metadata() { #[test] fn hermes_api_request_error_emits_openinference_json_output_and_metadata() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let uuid = Uuid::now_v7(); let start_metadata = json!({ "provider_payload_exact": true, @@ -4777,14 +4871,10 @@ fn hermes_api_request_error_emits_openinference_json_output_and_metadata() { attributes.get("openinference.metadata.fidelity_source"), Some(&"hermes_api_hooks".to_string()) ); + assert_attr_contains(&attributes, "metadata", "\"provider_payload_exact\":false"); assert_attr_contains( &attributes, - oi::METADATA.as_str(), - "\"provider_payload_exact\":false", - ); - assert_attr_contains( - &attributes, - oi::METADATA.as_str(), + "metadata", "\"fidelity_source\":\"hermes_api_hooks\"", ); } @@ -4792,8 +4882,10 @@ fn hermes_api_request_error_emits_openinference_json_output_and_metadata() { #[test] fn llm_end_with_inconsistent_manual_usage_omits_invalid_total_tokens() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let uuid = Uuid::now_v7(); processor.process(&make_start_event(uuid, None, "chat", ScopeType::Llm, None)); @@ -4833,8 +4925,10 @@ fn llm_end_with_inconsistent_manual_usage_omits_invalid_total_tokens() { #[test] fn llm_end_without_usage_omits_token_count_attributes() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let uuid = Uuid::now_v7(); processor.process(&make_start_event(uuid, None, "chat", ScopeType::Llm, None)); @@ -4859,8 +4953,10 @@ fn llm_end_without_usage_omits_token_count_attributes() { #[test] fn llm_end_with_partial_usage_emits_only_present_fields() { let (provider, exporter) = make_provider(); - let mut processor = - OpenInferenceEventProcessor::new(provider.clone(), "test-scope".to_string()); + let mut processor = crate::observability::otel::OtelEventProcessor::new_openinference( + provider.clone(), + "test-scope".to_string(), + ); let uuid = Uuid::now_v7(); processor.process(&make_start_event(uuid, None, "chat", ScopeType::Llm, None)); diff --git a/crates/core/tests/unit/observability/otel_tests.rs b/crates/core/tests/unit/observability/otel_tests.rs index c162e8746..40a7ce38f 100644 --- a/crates/core/tests/unit/observability/otel_tests.rs +++ b/crates/core/tests/unit/observability/otel_tests.rs @@ -22,6 +22,7 @@ use crate::json::Json; use crate::observability::atif::{AtifAgentInfo, AtifExporter, AtifStepExtra}; use opentelemetry_sdk::trace::InMemorySpanExporterBuilder; use serde_json::json; +use std::collections::BTreeSet; use std::collections::HashMap; use std::io::{Read, Write}; use std::net::TcpListener; @@ -297,6 +298,7 @@ fn make_provider() -> ( ) { let exporter = InMemorySpanExporterBuilder::new().build(); let provider = SdkTracerProvider::builder() + .with_id_generator(RelayIdGenerator) .with_simple_exporter(exporter.clone()) .build(); (provider, exporter) @@ -540,22 +542,18 @@ fn header_value(headers_text: &str, header_name: &str) -> Option { #[test] fn config_defaults_and_builder_overrides_are_applied() { - let config = OpenTelemetryConfig::http_binary("demo-agent") - .with_endpoint("http://localhost:4318/v1/traces") - .with_header("authorization", "Bearer token") - .with_resource_attribute("deployment.environment", "test") - .with_service_namespace("agents") - .with_service_version("1.2.3") - .with_instrumentation_scope("demo-scope") - .with_mark_projection(MarkProjection::Tool) - .with_mark_exclude_names(["notification", "hook_mark"]) - .with_timeout(Duration::from_millis(1250)); + let config = + OpenTelemetryConfig::new(OpenTelemetryType::Full, "http://localhost:4318/v1/traces") + .with_service_name("demo-agent") + .with_header("authorization", "Bearer token") + .with_resource_attribute("deployment.environment", "test") + .with_service_namespace("agents") + .with_service_version("1.2.3") + .with_instrumentation_scope("demo-scope") + .with_timeout(Duration::from_millis(1250)); assert_eq!(config.transport, OtlpTransport::HttpBinary); - assert_eq!( - config.endpoint.as_deref(), - Some("http://localhost:4318/v1/traces") - ); + assert_eq!(config.endpoint, "http://localhost:4318/v1/traces"); assert_eq!( config.headers.get("authorization"), Some(&"Bearer token".into()) @@ -568,14 +566,14 @@ fn config_defaults_and_builder_overrides_are_applied() { assert_eq!(config.service_namespace.as_deref(), Some("agents")); assert_eq!(config.service_version.as_deref(), Some("1.2.3")); assert_eq!(config.instrumentation_scope, "demo-scope"); - assert_eq!(config.mark_projection, MarkProjection::Tool); - assert_eq!(config.mark_exclude_names, vec!["notification", "hook_mark"]); + assert_eq!(config.mark_projection, MarkProjection::Inherit); + assert_eq!(config.mark_exclude_names, vec!["llm.chunk"]); assert_eq!(config.timeout, Duration::from_millis(1250)); let defaults = OpenTelemetryConfig::default(); assert_eq!(defaults.transport, OtlpTransport::HttpBinary); - assert_eq!(defaults.service_name, "nemo-relay"); - assert_eq!(defaults.instrumentation_scope, "nemo-relay-otel"); + assert_eq!(defaults.service_name, "unknown_service"); + assert_eq!(defaults.instrumentation_scope, "opentelemetry"); assert_eq!(defaults.mark_projection, MarkProjection::Inherit); assert_eq!(defaults.mark_exclude_names, vec!["llm.chunk"]); assert_eq!(defaults.timeout, Duration::from_secs(3)); @@ -584,12 +582,28 @@ fn config_defaults_and_builder_overrides_are_applied() { } #[test] -fn grpc_config_requires_a_tokio_runtime() { - let err = match OpenTelemetrySubscriber::new(OpenTelemetryConfig::grpc("demo-agent")) { - Ok(_) => panic!("gRPC construction should require a Tokio runtime"), - Err(err) => err, +fn grpc_config_owns_its_tokio_runtime() { + let subscriber = OpenTelemetrySubscriber::new( + OpenTelemetryConfig::new(OpenTelemetryType::Full, "http://localhost:4317") + .with_transport(OtlpTransport::Grpc) + .with_service_name("demo-agent"), + ) + .expect("gRPC construction should not require an ambient Tokio runtime"); + subscriber.shutdown().unwrap(); +} + +#[test] +fn direct_config_rejects_a_blank_endpoint_before_exporter_construction() { + let error = match OpenTelemetrySubscriber::new(OpenTelemetryConfig::new( + OpenTelemetryType::GenAi, + " ", + )) { + Ok(_) => panic!("blank endpoints must be rejected"), + Err(error) => error, }; - assert!(matches!(err, OpenTelemetryError::MissingTokioRuntime)); + assert!( + matches!(error, OpenTelemetryError::ExporterBuild(message) if message.contains("nonblank")) + ); } #[test] @@ -602,6 +616,61 @@ fn invalid_grpc_headers_are_rejected() { assert!(matches!(err, OpenTelemetryError::InvalidGrpcHeader { .. })); } +#[test] +fn direct_config_rejects_invalid_and_case_duplicate_headers() { + for config in [ + OpenTelemetryConfig::new(OpenTelemetryType::Full, "http://localhost:4318/v1/traces") + .with_header("bad header", "value"), + OpenTelemetryConfig::new(OpenTelemetryType::GenAi, "http://localhost:4318/v1/traces") + .with_header("x-control", "line one\nline two"), + OpenTelemetryConfig::new( + OpenTelemetryType::OpenInference, + "http://localhost:4318/v1/traces", + ) + .with_header("Authorization", "first") + .with_header("authorization", "second"), + ] { + let error = match OpenTelemetrySubscriber::new(config) { + Ok(_) => panic!("invalid direct exporter headers should fail construction"), + Err(error) => error, + }; + assert!(matches!(error, OpenTelemetryError::InvalidHeader { .. })); + } +} + +#[test] +fn direct_config_rejects_process_global_otel_headers() { + const CHILD_MARKER: &str = "NEMO_RELAY_TEST_GLOBAL_OTEL_HEADER_CHILD"; + if let Ok(variable) = std::env::var(CHILD_MARKER) { + assert!(matches!( + reject_global_header_environment(), + Err(OpenTelemetryError::GlobalHeaderEnvironmentUnsupported { + variable: rejected + }) if rejected == variable + )); + return; + } + + for variable in [ + "OTEL_EXPORTER_OTLP_HEADERS", + "OTEL_EXPORTER_OTLP_TRACES_HEADERS", + ] { + let status = std::process::Command::new(std::env::current_exe().unwrap()) + .arg("--exact") + .arg("observability::otel::tests::direct_config_rejects_process_global_otel_headers") + .env(CHILD_MARKER, variable) + .env(variable, "authorization=secret") + .env_remove(if variable == "OTEL_EXPORTER_OTLP_HEADERS" { + "OTEL_EXPORTER_OTLP_TRACES_HEADERS" + } else { + "OTEL_EXPORTER_OTLP_HEADERS" + }) + .status() + .unwrap(); + assert!(status.success()); + } +} + #[test] fn subscriber_registration_and_provider_lifecycle_methods_work() { let _guard = crate::observability::test_mutex().lock().unwrap(); @@ -955,6 +1024,409 @@ fn registered_subscriber_emits_spans_for_scope_push_pop_and_marks() { ); } +#[test] +fn gen_ai_projection_is_fixed_and_preserves_ancestry_through_omitted_scopes() { + let (provider, exporter) = make_provider(); + let mut processor = OtelEventProcessor::new_with_mark_projection_and_exclusions_and_mappings( + provider, + "gen-ai-test".to_string(), + OpenTelemetryType::GenAi, + MarkProjection::Tool, + Vec::new(), + Vec::new(), + ); + assert!( + processor + .mark_attributes(&make_mark_event(None, "omitted-mark", None)) + .is_empty() + ); + let agent_uuid = Uuid::now_v7(); + let reranker_uuid = Uuid::now_v7(); + let tool_uuid = Uuid::now_v7(); + + processor.process(&make_start_event( + agent_uuid, + None, + "research-agent", + ScopeType::Agent, + Some(json!({"secret": "must-not-export"})), + )); + processor.process(&make_start_event( + reranker_uuid, + Some(agent_uuid), + "rerank", + ScopeType::Reranker, + None, + )); + processor.process(&make_mark_event( + Some(agent_uuid), + "checkpoint", + Some(json!({"secret": "must-not-export"})), + )); + processor.process(&make_start_event( + tool_uuid, + Some(reranker_uuid), + "web-search", + ScopeType::Tool, + Some(json!({"query": "must-not-export"})), + )); + processor.process(&make_end_event( + tool_uuid, + Some(reranker_uuid), + "web-search", + ScopeType::Tool, + Some(json!({"result": "must-not-export"})), + )); + processor.process(&make_end_event( + reranker_uuid, + Some(agent_uuid), + "rerank", + ScopeType::Reranker, + None, + )); + processor.process(&make_end_event( + agent_uuid, + None, + "research-agent", + ScopeType::Agent, + None, + )); + processor.force_flush().unwrap(); + + let spans = exporter.get_finished_spans().unwrap(); + assert_eq!(spans.len(), 2); + let agent = spans + .iter() + .find(|span| span.name.as_ref() == "invoke_agent research-agent") + .unwrap(); + let tool = spans + .iter() + .find(|span| span.name.as_ref() == "execute_tool web-search") + .unwrap(); + assert_eq!(agent.span_kind, SpanKind::Internal); + assert_eq!(tool.span_kind, SpanKind::Internal); + assert_eq!(tool.parent_span_id, agent.span_context.span_id()); + assert!(agent.events.events.is_empty()); + assert!(spans.iter().all(|span| { + span.attributes.iter().all(|attribute| { + !attribute.key.as_str().starts_with("nemo_relay.") + && !attribute.value.to_string().contains("must-not-export") + }) + })); + let agent_attributes = attr_map(&agent.attributes); + let tool_attributes = attr_map(&tool.attributes); + assert_eq!( + agent_attributes.get("gen_ai.operation.name"), + Some(&"invoke_agent".to_string()) + ); + assert_eq!( + tool_attributes.get("gen_ai.operation.name"), + Some(&"execute_tool".to_string()) + ); +} + +#[test] +fn gen_ai_projection_uses_standard_operation_names_and_span_kinds() { + for (scope_type, name, expected_name, expected_kind) in [ + ( + ScopeType::Agent, + "planner", + "invoke_agent planner", + SpanKind::Internal, + ), + (ScopeType::Llm, "chat", "chat", SpanKind::Client), + ( + ScopeType::Llm, + "generate_content", + "generate_content", + SpanKind::Client, + ), + ( + ScopeType::Llm, + "text_completion", + "text_completion", + SpanKind::Client, + ), + ( + ScopeType::Tool, + "search", + "execute_tool search", + SpanKind::Internal, + ), + (ScopeType::Embedder, "embed", "embeddings", SpanKind::Client), + ( + ScopeType::Retriever, + "retrieve", + "retrieval", + SpanKind::Client, + ), + ] { + let event = make_start_event(Uuid::now_v7(), None, name, scope_type, None); + assert!(crate::observability::otel_genai::supports(&event)); + assert_eq!( + crate::observability::otel_genai::span_name(&event), + expected_name + ); + assert_eq!( + crate::observability::otel_genai::span_kind(&event), + expected_kind + ); + } + + for unsupported in [ScopeType::Reranker, ScopeType::Guardrail] { + let event = make_start_event(Uuid::now_v7(), None, "unsupported", unsupported, None); + assert!(!crate::observability::otel_genai::supports(&event)); + } +} + +#[test] +fn gen_ai_projection_emits_only_span_specific_attributes() { + let common = json!({ + "provider": "openai", + "conversation_id": "conversation-1", + "server_address": "api.example.test", + "server_port": 443, + "model": "model-1", + "agent_description": "helpful", + "tool_type": "function", + "tool_call_id": "call-1", + "tool_description": "searches", + "data_source_id": "docs", + "top_k": 5 + }); + let cases = [ + ( + ScopeType::Agent, + "agent", + [ + "gen_ai.agent.description", + "gen_ai.agent.name", + "gen_ai.conversation.id", + "gen_ai.operation.name", + "gen_ai.request.model", + ] + .as_slice(), + ), + ( + ScopeType::Llm, + "chat", + [ + "gen_ai.conversation.id", + "gen_ai.operation.name", + "gen_ai.provider.name", + "gen_ai.request.model", + "server.address", + "server.port", + ] + .as_slice(), + ), + ( + ScopeType::Tool, + "search", + [ + "gen_ai.operation.name", + "gen_ai.tool.call.id", + "gen_ai.tool.description", + "gen_ai.tool.name", + "gen_ai.tool.type", + ] + .as_slice(), + ), + ( + ScopeType::Embedder, + "embed", + [ + "gen_ai.operation.name", + "gen_ai.provider.name", + "gen_ai.request.model", + "server.address", + "server.port", + ] + .as_slice(), + ), + ( + ScopeType::Retriever, + "retrieve", + [ + "gen_ai.data_source.id", + "gen_ai.operation.name", + "gen_ai.provider.name", + "gen_ai.request.model", + "gen_ai.retrieval.top_k", + "server.address", + "server.port", + ] + .as_slice(), + ), + ]; + for (scope_type, name, expected) in cases { + let event = make_start_event(Uuid::now_v7(), None, name, scope_type, Some(common.clone())); + let attributes = crate::observability::otel_genai::start_attributes(&event); + let actual = attributes + .iter() + .map(|attribute| attribute.key.as_str()) + .collect::>(); + assert_eq!(actual, expected.iter().copied().collect()); + assert!(attributes.iter().all(|attribute| { + attribute.key.as_str() != "gen_ai.conversation.id" + || matches!(scope_type, ScopeType::Agent | ScopeType::Llm) + })); + if scope_type == ScopeType::Retriever { + let top_k = attributes + .iter() + .find(|attribute| attribute.key.as_str() == "gen_ai.retrieval.top_k") + .unwrap(); + assert_eq!(top_k.value, opentelemetry::Value::I64(5)); + } + } + + let embed_end = make_end_event( + Uuid::now_v7(), + None, + "embed", + ScopeType::Embedder, + Some(json!({"input_tokens": 7, "output_tokens": 11})), + ); + let embed_attributes = attr_map(&crate::observability::otel_genai::end_attributes( + &embed_end, + )); + assert_eq!( + embed_attributes.get("gen_ai.usage.input_tokens"), + Some(&"7".to_string()) + ); + assert!(!embed_attributes.contains_key("gen_ai.usage.output_tokens")); +} + +#[test] +fn gen_ai_projection_prefers_standard_names_and_normalized_provider_details() { + let agent = make_start_event( + Uuid::now_v7(), + None, + "fallback-agent", + ScopeType::Agent, + Some(json!({"gen_ai.agent.name": "semantic-agent"})), + ); + assert_eq!( + crate::observability::otel_genai::span_name(&agent), + "invoke_agent semantic-agent" + ); + + let tool = make_start_event( + Uuid::now_v7(), + None, + "fallback-tool", + ScopeType::Tool, + Some(json!({"gen_ai.tool.name": "semantic-tool"})), + ); + assert_eq!( + crate::observability::otel_genai::span_name(&tool), + "execute_tool semantic-tool" + ); + + let llm = Event::Scope(ScopeEvent::new( + BaseEvent::builder() + .uuid(Uuid::now_v7()) + .name("openai.chat") + .data(json!({ + "headers": {}, + "content": { + "model": "gpt-5", + "messages": [{"role": "user", "content": "hello"}], + "frequency_penalty": 0.25, + "n": 2, + "presence_penalty": -0.5, + "seed": 42, + "stream": true + } + })) + .build(), + ScopeCategory::Start, + Vec::new(), + EventCategory::llm(), + None, + )); + let attributes = attr_map(&crate::observability::otel_genai::start_attributes(&llm)); + assert_eq!( + attributes.get("gen_ai.provider.name"), + Some(&"openai".to_string()) + ); + assert_eq!( + attributes.get("gen_ai.request.stream"), + Some(&"true".to_string()) + ); + assert_eq!( + attributes.get("gen_ai.request.frequency_penalty"), + Some(&"0.25".to_string()) + ); + assert_eq!( + attributes.get("gen_ai.request.choice.count"), + Some(&"2".to_string()) + ); + assert_eq!( + attributes.get("gen_ai.request.presence_penalty"), + Some(&"-0.5".to_string()) + ); + assert_eq!( + attributes.get("gen_ai.request.seed"), + Some(&"42".to_string()) + ); + + let anthropic = Event::Scope(ScopeEvent::new( + BaseEvent::builder() + .uuid(Uuid::now_v7()) + .name("anthropic.messages") + .data(json!({ + "headers": {}, + "content": { + "model": "claude-sonnet", + "max_tokens": 100, + "messages": [{"role": "user", "content": "hello"}], + "top_k": 12 + } + })) + .build(), + ScopeCategory::Start, + Vec::new(), + EventCategory::llm(), + None, + )); + let attributes = attr_map(&crate::observability::otel_genai::start_attributes( + &anthropic, + )); + assert_eq!( + attributes.get("gen_ai.request.top_k"), + Some(&"12".to_string()) + ); + + for (name, expected) in [ + ("azure_openai.chat", "azure.ai.openai"), + ("azure_ai_inference.chat", "azure.ai.inference"), + ] { + let event = Event::Scope(ScopeEvent::new( + BaseEvent::builder() + .uuid(Uuid::now_v7()) + .name(name) + .data(json!({ + "headers": {}, + "content": { + "model": "gpt-5", + "messages": [{"role": "user", "content": "hello"}] + } + })) + .build(), + ScopeCategory::Start, + Vec::new(), + EventCategory::llm(), + None, + )); + let attributes = attr_map(&crate::observability::otel_genai::start_attributes(&event)); + assert_eq!( + attributes.get("gen_ai.provider.name"), + Some(&expected.to_string()) + ); + } +} + #[test] fn http_config_exports_scope_push_pop_and_marks_without_tokio_runtime() { let _guard = crate::observability::test_mutex().lock().unwrap(); @@ -1007,6 +1479,76 @@ fn http_config_exports_scope_push_pop_and_marks_without_tokio_runtime() { assert!(!request.body.is_empty()); } +#[test] +fn direct_gen_ai_and_openinference_configs_export_typed_otlp_payloads() { + let _guard = crate::observability::test_mutex().lock().unwrap(); + reset_global(); + + for (otel_type, expected_key) in [ + ( + OpenTelemetryType::GenAi, + b"gen_ai.operation.name".as_slice(), + ), + ( + OpenTelemetryType::OpenInference, + b"openinference.span.kind".as_slice(), + ), + ] { + let listener = TcpListener::bind("127.0.0.1:0").unwrap(); + let endpoint = format!("http://{}/v1/traces", listener.local_addr().unwrap()); + let (request_tx, request_rx) = mpsc::channel(); + spawn_http_collector(listener, request_tx); + let subscriber = OpenTelemetrySubscriber::new( + OpenTelemetryConfig::new(otel_type, endpoint) + .with_service_name("typed-direct-service") + .with_instrumentation_scope("typed-direct-scope"), + ) + .unwrap(); + let callback = subscriber.subscriber(); + let uuid = Uuid::now_v7(); + callback(&make_start_event( + uuid, + None, + "typed-agent", + ScopeType::Agent, + None, + )); + callback(&make_end_event( + uuid, + None, + "typed-agent", + ScopeType::Agent, + None, + )); + subscriber.force_flush().unwrap(); + + let request = request_rx + .recv_timeout(Duration::from_secs(5)) + .expect("typed direct config should export an OTLP request"); + assert_eq!(request.path, "/v1/traces"); + assert_eq!(request.content_type, "application/x-protobuf"); + assert!( + request + .body + .windows(expected_key.len()) + .any(|window| window == expected_key), + "typed projection key should be encoded in the OTLP payload" + ); + for expected_metadata in [ + b"typed-direct-service".as_slice(), + b"typed-direct-scope".as_slice(), + ] { + assert!( + request + .body + .windows(expected_metadata.len()) + .any(|window| window == expected_metadata) + ); + } + subscriber.shutdown().unwrap(); + } +} + #[test] fn records_span_start_mark_and_end() { let (provider, exporter) = make_provider(); @@ -2170,7 +2712,8 @@ fn helper_functions_cover_additional_otel_branches() { #[test] fn provider_builders_cover_success_paths() { let http_provider = build_tracer_provider( - &OpenTelemetryConfig::http_binary("demo-agent") + &OpenTelemetryConfig::new(OpenTelemetryType::Full, "http://localhost:4318/v1/traces") + .with_service_name("demo-agent") .with_header("authorization", "Bearer token") .with_resource_attribute("deployment.environment", "test") .with_service_namespace("agents") @@ -2180,8 +2723,11 @@ fn provider_builders_cover_success_paths() { http_provider.force_flush().unwrap(); http_provider.shutdown().unwrap(); - let subscriber = - OpenTelemetrySubscriber::new(OpenTelemetryConfig::http_binary("http-success")).unwrap(); + let subscriber = OpenTelemetrySubscriber::new( + OpenTelemetryConfig::new(OpenTelemetryType::Full, "http://localhost:4318/v1/traces") + .with_service_name("http-success"), + ) + .unwrap(); subscriber.force_flush().unwrap(); subscriber.shutdown().unwrap(); } diff --git a/crates/core/tests/unit/observability/plugin_component_tests.rs b/crates/core/tests/unit/observability/plugin_component_tests.rs index 6b17f869d..99ed3601d 100644 --- a/crates/core/tests/unit/observability/plugin_component_tests.rs +++ b/crates/core/tests/unit/observability/plugin_component_tests.rs @@ -18,13 +18,12 @@ use crate::plugin::{ }; use serde_json::json; use std::fs; -#[cfg(feature = "atof-streaming")] use std::io::{Read, Write}; -#[cfg(feature = "atof-streaming")] use std::net::TcpListener; +use std::sync::mpsc; #[cfg(feature = "atof-streaming")] use std::sync::{Arc, Mutex}; -use std::time::{SystemTime, UNIX_EPOCH}; +use std::time::{Duration, SystemTime, UNIX_EPOCH}; fn temp_dir(prefix: &str) -> PathBuf { let id = SystemTime::now() @@ -164,6 +163,43 @@ fn reset_runtime() { *context.write().unwrap() = NemoRelayContextState::new(); } +fn start_otlp_capture_server() -> (String, mpsc::Receiver>) { + let listener = TcpListener::bind("127.0.0.1:0").unwrap(); + let endpoint = format!("http://{}/v1/traces", listener.local_addr().unwrap()); + let (sender, receiver) = mpsc::channel(); + std::thread::spawn(move || { + let (mut stream, _) = listener.accept().unwrap(); + stream + .set_read_timeout(Some(Duration::from_secs(10))) + .unwrap(); + let mut request = Vec::new(); + let mut byte = [0_u8; 1]; + while !request.ends_with(b"\r\n\r\n") { + stream.read_exact(&mut byte).unwrap(); + request.push(byte[0]); + } + let headers = String::from_utf8_lossy(&request); + let content_length = headers + .lines() + .find_map(|line| { + line.split_once(':').and_then(|(name, value)| { + name.eq_ignore_ascii_case("content-length") + .then_some(value.trim()) + }) + }) + .unwrap() + .parse::() + .unwrap(); + let mut body = vec![0_u8; content_length]; + stream.read_exact(&mut body).unwrap(); + stream + .write_all(b"HTTP/1.1 200 OK\r\nContent-Length: 0\r\nConnection: close\r\n\r\n") + .unwrap(); + sender.send(body).unwrap(); + }); + (endpoint, receiver) +} + fn component(config: Json) -> PluginComponentSpec { let Json::Object(config) = config else { panic!("component config must be an object"); @@ -206,24 +242,52 @@ fn editor_schema_tracks_observability_config_types() { ); let otlp = schema - .field("openinference") - .expect("openinference section") + .field("opentelemetry") + .expect("opentelemetry section") .schema() - .expect("openinference editor schema"); - let headers = otlp.field("headers").expect("headers field"); - assert_eq!(headers.kind, EditorFieldKind::StringMap); - - let attribute_mappings = otlp - .field("attribute_mappings") - .expect("attribute mappings field"); - assert_eq!(attribute_mappings.kind, EditorFieldKind::List); - let mapping = attribute_mappings + .expect("opentelemetry editor schema"); + let otlp_endpoints = otlp.field("endpoints").expect("endpoints field"); + assert_eq!(otlp_endpoints.kind, EditorFieldKind::List); + let otlp_endpoint = otlp_endpoints .list_item - .expect("attribute mapping list item"); - assert_eq!(mapping.kind, EditorFieldKind::Section); - let mapping_schema = mapping.schema.expect("attribute mapping schema")(); - assert_eq!(mapping_schema.fields[0].name, "key"); - assert_eq!(mapping_schema.fields[1].name, "alias"); + .expect("OTLP endpoint list metadata"); + assert_eq!(otlp_endpoint.kind, EditorFieldKind::Section); + let otlp_endpoint_schema = otlp_endpoint.schema.expect("OTLP endpoint schema")(); + assert_eq!( + otlp_endpoint_schema + .field("type") + .expect("OTLP endpoint type") + .enum_values, + &["full", "gen_ai", "openinference"] + ); + assert_eq!( + otlp_endpoint_schema + .field("endpoint") + .expect("OTLP endpoint URL") + .kind, + EditorFieldKind::String + ); + assert_eq!( + otlp_endpoint_schema + .field("header_env") + .expect("OTLP endpoint header_env") + .kind, + EditorFieldKind::StringMap + ); + assert_eq!( + default_opentelemetry_endpoint_editor_value(), + json!({ + "type": "full", + "endpoint": "", + "transport": "http_binary", + "service_name": "unknown_service", + "instrumentation_scope": "opentelemetry", + "timeout_millis": 3000, + "headers": {}, + "header_env": {}, + "resource_attributes": {}, + }) + ); } fn push_agent(name: &str) -> crate::api::scope::ScopeHandle { @@ -335,11 +399,10 @@ fn default_config_and_component_conversion_cover_public_shape() { reset_runtime(); let defaults = ObservabilityConfig::default(); - assert_eq!(defaults.version, 2); + assert_eq!(defaults.version, 3); assert!(defaults.atof.is_none()); assert!(defaults.atif.is_none()); assert!(defaults.opentelemetry.is_none()); - assert!(defaults.openinference.is_none()); let atof = AtofSectionConfig::default(); assert!(!atof.enabled); @@ -363,120 +426,366 @@ fn default_config_and_component_conversion_cover_public_shape() { assert_eq!(atif.model_name, "unknown"); assert_eq!(atif.filename_template, "nemo-relay-atif-{session_id}.json"); - let otlp = OtlpSectionConfig::default(); - assert!(!otlp.enabled); - assert_eq!(otlp.mark_projection, MarkProjection::Inherit); - assert_eq!(otlp.mark_exclude_names, vec!["llm.chunk"]); - assert!(otlp.attribute_mappings.is_empty()); - assert_eq!(otlp.transport, "http_binary"); - assert_eq!(otlp.service_name, "nemo-relay"); - assert_eq!(otlp.timeout_millis, 3_000); + let otel = OpenTelemetrySectionConfig { + enabled: true, + endpoints: vec![OpenTelemetryEndpointConfig { + otel_type: OpenTelemetryType::Full, + endpoint: "http://localhost:4318/v1/traces".to_string(), + transport: default_otlp_transport(), + service_name: default_otel_service_name(), + service_namespace: None, + service_version: None, + instrumentation_scope: default_otel_instrumentation_scope(), + timeout_millis: default_timeout_millis(), + headers: HashMap::new(), + header_env: HashMap::new(), + resource_attributes: HashMap::new(), + }], + }; let generic: PluginComponentSpec = ComponentSpec::new(ObservabilityConfig { atof: Some(atof), atif: Some(atif), - opentelemetry: Some(otlp.clone()), - openinference: Some(otlp), + opentelemetry: Some(otel), ..ObservabilityConfig::default() }) .into(); assert_eq!(generic.kind, OBSERVABILITY_PLUGIN_KIND); assert!(generic.enabled); - assert_eq!(generic.config["version"], json!(2)); + assert_eq!(generic.config["version"], json!(3)); assert_eq!(generic.config["atif"]["agent_name"], json!("NeMo Relay")); } #[test] -fn mark_projection_parses_for_otlp_and_rejects_unknown_values() { - let mappings: OtlpSectionConfig = serde_json::from_value(json!({ - "attribute_mappings": [{ - "key": "nemo_relay.start.metadata.tenant", - "alias": "tenant.id" - }] - })) - .unwrap(); - assert_eq!(mappings.attribute_mappings.len(), 1); +fn version_three_rejects_removed_otlp_controls() { + let report = validate_plugin_config(&plugin_config(json!({ + "opentelemetry": { + "enabled": false, + "mark_projection": "tool", + "attribute_mappings": [], + "endpoint": "http://localhost:4318/v1/traces" + }, + "openinference": { + "enabled": false, + "endpoint": "http://localhost:4318/v1/traces" + } + }))); + assert!(report.has_errors()); + assert!(report.diagnostics.iter().any(|diagnostic| { + diagnostic.code == "observability.legacy_opentelemetry_field" + && diagnostic.field.as_deref() == Some("mark_projection") + })); + assert!(report.diagnostics.iter().any(|diagnostic| { + diagnostic.code == "observability.legacy_opentelemetry_field" + && diagnostic.field.as_deref() == Some("attribute_mappings") + })); + assert!(report.diagnostics.iter().any(|diagnostic| { + diagnostic.code == "observability.legacy_opentelemetry_field" + && diagnostic.field.as_deref() == Some("endpoint") + })); + assert!(report.diagnostics.iter().any(|diagnostic| { + diagnostic.code == "observability.legacy_openinference_section" + && diagnostic.field.as_deref() == Some("openinference") + })); +} - let otlp: OtlpSectionConfig = serde_json::from_value(json!({ - "mark_projection": "tool" - })) +#[test] +fn opentelemetry_endpoint_header_env_is_resolved_and_snapshotted() { + let _guard = crate::observability::test_mutex().lock().unwrap(); + let variable = "NEMO_RELAY_TEST_OTEL_HEADER_ENV"; + unsafe { std::env::set_var(variable, "Bearer initial") }; + let config = build_otel_config( + 0, + OpenTelemetryEndpointConfig { + otel_type: OpenTelemetryType::GenAi, + endpoint: "http://localhost:4318/v1/traces".to_string(), + transport: default_otlp_transport(), + service_name: default_otel_service_name(), + service_namespace: None, + service_version: None, + instrumentation_scope: default_otel_instrumentation_scope(), + timeout_millis: default_timeout_millis(), + headers: HashMap::new(), + header_env: HashMap::from([("authorization".to_string(), variable.to_string())]), + resource_attributes: HashMap::new(), + }, + ) .unwrap(); - assert_eq!(otlp.mark_projection, MarkProjection::Tool); + unsafe { std::env::set_var(variable, "Bearer changed") }; + assert_eq!(config.header("authorization"), Some("Bearer initial")); + unsafe { std::env::remove_var(variable) }; +} + +fn test_opentelemetry_endpoint() -> OpenTelemetryEndpointConfig { + OpenTelemetryEndpointConfig { + otel_type: OpenTelemetryType::Full, + endpoint: "http://localhost:4318/v1/traces".to_string(), + transport: default_otlp_transport(), + service_name: default_otel_service_name(), + service_namespace: None, + service_version: None, + instrumentation_scope: default_otel_instrumentation_scope(), + timeout_millis: default_timeout_millis(), + headers: HashMap::new(), + header_env: HashMap::new(), + resource_attributes: HashMap::new(), + } +} - let event: OtlpSectionConfig = serde_json::from_value(json!({ - "mark_projection": "event", - "mark_exclude_names": [] - })) - .unwrap(); - assert_eq!(event.mark_projection, MarkProjection::Event); - assert!(event.mark_exclude_names.is_empty()); +#[test] +fn build_otel_config_rejects_each_activation_only_invalid_value() { + let _guard = crate::observability::test_mutex().lock().unwrap(); - let custom_exclusions: OtlpSectionConfig = serde_json::from_value(json!({ - "mark_projection": "tool", - "mark_exclude_names": ["notification", "hook_mark"] - })) - .unwrap(); - assert_eq!( - custom_exclusions.mark_exclude_names, - vec!["notification", "hook_mark"] + let mut endpoint = test_opentelemetry_endpoint(); + endpoint.endpoint = " ".to_string(); + assert!(build_otel_config(0, endpoint).is_err()); + + let mut endpoint = test_opentelemetry_endpoint(); + endpoint.transport = "udp".to_string(); + assert!(build_otel_config(0, endpoint).is_err()); + + for variable in ["", " PADDED_ENV "] { + let mut endpoint = test_opentelemetry_endpoint(); + endpoint + .header_env + .insert("authorization".to_string(), variable.to_string()); + assert!(build_otel_config(1, endpoint).is_err()); + } + + let mut endpoint = test_opentelemetry_endpoint(); + endpoint + .headers + .insert("Authorization".to_string(), "inline".to_string()); + endpoint + .header_env + .insert("authorization".to_string(), "TOKEN".to_string()); + assert!(build_otel_config(2, endpoint).is_err()); + + let variable = "NEMO_RELAY_TEST_BLANK_OTEL_HEADER_ENV"; + unsafe { std::env::set_var(variable, " ") }; + let mut endpoint = test_opentelemetry_endpoint(); + endpoint + .header_env + .insert("authorization".to_string(), variable.to_string()); + assert!(build_otel_config(3, endpoint).is_err()); + unsafe { std::env::remove_var(variable) }; +} + +#[test] +fn validate_opentelemetry_section_reports_empty_and_malformed_endpoints() { + let policy = ConfigPolicy::default(); + let mut diagnostics = Vec::new(); + validate_opentelemetry_section( + &mut diagnostics, + &policy, + &OpenTelemetrySectionConfig { + enabled: true, + endpoints: Vec::new(), + }, ); + assert!(diagnostics.iter().any(|diagnostic| { + diagnostic.field.as_deref() == Some("endpoints") + && diagnostic.message.contains("at least one endpoint") + })); - let error = serde_json::from_value::(json!({ - "mark_projection": "span" - })) - .unwrap_err(); - assert!(error.to_string().contains("unknown variant `span`")); + let mut endpoint = test_opentelemetry_endpoint(); + endpoint.endpoint = " ".to_string(); + endpoint.transport = "udp".to_string(); + endpoint + .header_env + .insert("empty".to_string(), String::new()); + endpoint + .header_env + .insert("padded".to_string(), " TOKEN ".to_string()); + diagnostics.clear(); + validate_opentelemetry_section( + &mut diagnostics, + &policy, + &OpenTelemetrySectionConfig { + enabled: true, + endpoints: vec![endpoint], + }, + ); + for field in [ + "endpoints[0].endpoint", + "endpoints[0].transport", + "endpoints[0].header_env.empty", + "endpoints[0].header_env.padded", + ] { + assert!( + diagnostics + .iter() + .any(|diagnostic| diagnostic.field.as_deref() == Some(field)), + "missing diagnostic for {field}: {diagnostics:?}" + ); + } +} +#[test] +fn opentelemetry_endpoint_header_env_rejects_missing_and_duplicate_headers() { + let _guard = crate::observability::test_mutex().lock().unwrap(); + let variable = "NEMO_RELAY_TEST_MISSING_OTEL_HEADER_ENV"; + unsafe { std::env::remove_var(variable) }; let report = validate_plugin_config(&plugin_config(json!({ - "opentelemetry": {"mark_projection": "span"} + "opentelemetry": { + "enabled": true, + "endpoints": [{ + "type": "full", + "endpoint": "http://localhost:4318/v1/traces", + "headers": {"Authorization": "inline"}, + "header_env": { + "authorization": variable, + "x-api-key": variable + } + }] + } }))); assert!(report.has_errors()); - assert!(report.diagnostics.iter().any(|diagnostic| diagnostic.code - == "observability.invalid_plugin_config" - && diagnostic.message.contains("unknown variant `span`"))); + assert!(report.diagnostics.iter().any(|diagnostic| { + diagnostic.field.as_deref() == Some("endpoints[0].header_env.authorization") + && diagnostic.message.contains("both headers and header_env") + })); + let activation = futures::executor::block_on(initialize_plugins_exact(plugin_config(json!({ + "opentelemetry": { + "enabled": true, + "endpoints": [{ + "type": "full", + "endpoint": "http://localhost:4318/v1/traces", + "header_env": {"x-api-key": variable} + }] + } + })))); + assert!(activation.is_err()); +} + +#[test] +fn outer_disabled_component_does_not_resolve_opentelemetry_header_env() { + let _guard = crate::observability::test_mutex().lock().unwrap(); + let variable = "NEMO_RELAY_TEST_DISABLED_OTEL_HEADER_ENV"; + unsafe { std::env::remove_var(variable) }; + let mut config = plugin_config(json!({ + "opentelemetry": { + "enabled": true, + "endpoints": [{ + "type": "full", + "endpoint": "http://localhost:4318/v1/traces", + "header_env": {"authorization": variable} + }] + } + })); + config.components[0].enabled = false; + futures::executor::block_on(initialize_plugins_exact(config)).unwrap(); + clear_plugin_configuration().unwrap(); +} +#[test] +fn opentelemetry_endpoint_rejects_unknown_and_removed_fields() { let report = validate_plugin_config(&plugin_config(json!({ - "atif": {"mark_projection": "tool"} + "policy": {"unknown_field": "error"}, + "opentelemetry": { + "enabled": true, + "endpoints": [{ + "type": "full", + "endpoint": "http://localhost:4318/v1/traces", + "header_en": {"authorization": "TOKEN"}, + "mark_projection": "tool", + "capture_content": true + }] + } }))); + + for field in [ + "endpoints[0].header_en", + "endpoints[0].mark_projection", + "endpoints[0].capture_content", + ] { + assert!( + report + .diagnostics + .iter() + .any(|diagnostic| diagnostic.field.as_deref() == Some(field)), + "missing endpoint diagnostic for {field}: {:?}", + report.diagnostics + ); + } assert!(report.diagnostics.iter().any(|diagnostic| { - diagnostic.code == "observability.unknown_field" - && diagnostic.field.as_deref() == Some("mark_projection") + diagnostic.field.as_deref() == Some("endpoints[0].header_en") + && diagnostic.code == "observability.unknown_field" })); + assert!(report.diagnostics.iter().any(|diagnostic| { + diagnostic.field.as_deref() == Some("endpoints[0].mark_projection") + && diagnostic.code == "observability.legacy_opentelemetry_field" + })); +} +#[test] +fn opentelemetry_endpoint_rejects_invalid_and_case_duplicate_headers() { let report = validate_plugin_config(&plugin_config(json!({ - "openinference": { - "attribute_mappings": [ - {"key": "", "alias": "tenant.id"}, - {"key": "openinference.metadata.tenant", "alias": "tenant.id"} + "opentelemetry": { + "enabled": true, + "endpoints": [ + { + "type": "full", + "endpoint": "http://localhost:4318/v1/traces", + "headers": { + "bad header": "value", + "x-control": "line one\nline two", + "Authorization": "first", + "authorization": "second" + } + }, + { + "type": "gen_ai", + "endpoint": "http://localhost:4318/v1/traces", + "header_env": { + "X-Api-Key": "PATH", + "x-api-key": "PATH" + } + } ] } }))); + assert!(report.diagnostics.iter().any(|diagnostic| { - diagnostic.code == "observability.unsupported_value" - && diagnostic.field.as_deref() == Some("attribute_mappings") - && diagnostic - .message - .contains("attribute mapping key must not be blank") + diagnostic.field.as_deref() == Some("endpoints[0].headers.bad header") + && diagnostic.message.contains("header name") + })); + assert!(report.diagnostics.iter().any(|diagnostic| { + diagnostic.field.as_deref() == Some("endpoints[0].headers.x-control") + && diagnostic.message.contains("invalid value") + })); + assert!(report.diagnostics.iter().any(|diagnostic| { + diagnostic + .message + .contains("endpoints[0].headers contains duplicate header") + })); + assert!(report.diagnostics.iter().any(|diagnostic| { + diagnostic + .message + .contains("endpoints[1].header_env contains duplicate header") })); +} + +#[test] +fn disabled_opentelemetry_does_not_resolve_header_env() { + let _guard = crate::observability::test_mutex().lock().unwrap(); + let variable = "NEMO_RELAY_TEST_DISABLED_OTEL_HEADER_ENV"; + unsafe { std::env::remove_var(variable) }; let report = validate_plugin_config(&plugin_config(json!({ - "policy": {"unknown_field": "error"}, "opentelemetry": { - "attribute_mappings": [{ - "key": "nemo_relay.start.metadata.tenant", - "alias": "tenant.id" - }] - }, - "openinference": { - "attribute_mappings": [{ - "key": "openinference.metadata.tenant", - "alias": "tenant.id" + "enabled": false, + "endpoints": [{ + "type": "full", + "endpoint": "http://localhost:4318/v1/traces", + "header_env": {"authorization": variable} }] } }))); + assert!( !report.has_errors(), - "valid attribute mappings must not be reported as unknown: {:?}", + "disabled endpoint unexpectedly resolved header_env: {:?}", report.diagnostics ); } @@ -490,7 +799,6 @@ fn schema_contains_every_supported_observability_option() { "atof", "atif", "opentelemetry", - "openinference", "policy", "enabled", "output_directory", @@ -498,6 +806,7 @@ fn schema_contains_every_supported_observability_option() { "mode", "name", "sinks", + "endpoints", "type", "url", "field_name_policy", @@ -505,9 +814,6 @@ fn schema_contains_every_supported_observability_option() { "agent_name", "agent_version", "model_name", - "mark_projection", - "mark_exclude_names", - "attribute_mappings", "tool_definitions", "extra", "filename_template", @@ -540,11 +846,6 @@ fn schema_contains_every_supported_observability_option() { "transport", &["http_binary", "grpc"] )); - assert!(schema_property_has_enum( - &schema, - "mark_projection", - &["inherit", "event", "tool"] - )); assert!(schema_property_has_default( &schema, "mode", @@ -608,8 +909,7 @@ fn empty_and_disabled_config_register_nothing() { let config = plugin_config(json!({ "atof": {"enabled": false}, "atif": {"enabled": false}, - "opentelemetry": {"enabled": false, "transport": "grpc"}, - "openinference": {"enabled": false, "transport": "grpc"} + "opentelemetry": {"enabled": false, "endpoints": []} })); assert!(!validate_plugin_config(&config).has_errors()); futures::executor::block_on(initialize_plugins_exact(config)).unwrap(); @@ -772,14 +1072,17 @@ fn invalid_shapes_and_strict_policy_are_reported() { ); let strict_bad_transport = validate_plugin_config(&plugin_config(json!({ - "openinference": {"enabled": true, "transport": "udp"} + "opentelemetry": { + "enabled": true, + "endpoints": [{"type": "openinference", "endpoint": "http://localhost:4318/v1/traces", "transport": "udp"}] + } }))); assert!(strict_bad_transport.has_errors()); assert!( strict_bad_transport .diagnostics .iter() - .any(|diag| diag.field.as_deref() == Some("transport")) + .any(|diag| diag.field.as_deref() == Some("endpoints[0].transport")) ); } @@ -1044,24 +1347,12 @@ fn initialization_fails_for_invalid_enabled_file_exporters() { "policy": {"unsupported_value": "ignore"}, "opentelemetry": { "enabled": true, - "transport": "udp" + "endpoints": [{"type": "full", "endpoint": "http://localhost:4318/v1/traces", "transport": "udp"}] } })); let error = futures::executor::block_on(initialize_plugins_exact(invalid_otel_transport)).unwrap_err(); assert!(error.to_string().contains("OpenTelemetry transport")); - - let invalid_openinference_transport = plugin_config(json!({ - "policy": {"unsupported_value": "ignore"}, - "openinference": { - "enabled": true, - "transport": "udp" - } - })); - let error = - futures::executor::block_on(initialize_plugins_exact(invalid_openinference_transport)) - .unwrap_err(); - assert!(error.to_string().contains("OpenInference transport")); } #[test] @@ -2066,27 +2357,29 @@ fn otlp_sections_register_inferred_subscribers_with_full_config() { let config = plugin_config(json!({ "opentelemetry": { "enabled": true, - "transport": "http_binary", - "endpoint": "http://127.0.0.1:4318/v1/traces", - "headers": {"authorization": "token"}, - "resource_attributes": {"deployment.environment": "test"}, - "service_name": "otel-service", - "service_namespace": "agents", - "service_version": "1.2.3", - "instrumentation_scope": "test-otel", - "timeout_millis": 1 - }, - "openinference": { - "enabled": true, - "transport": "http_binary", - "endpoint": "http://127.0.0.1:4318/v1/traces", - "headers": {"authorization": "token"}, - "resource_attributes": {"deployment.environment": "test"}, - "service_name": "oi-service", - "service_namespace": "agents", - "service_version": "1.2.3", - "instrumentation_scope": "test-openinference", - "timeout_millis": 1 + "endpoints": [ + { + "type": "full", + "transport": "http_binary", + "endpoint": "http://127.0.0.1:4318/v1/traces", + "headers": {"authorization": "token"}, + "resource_attributes": {"deployment.environment": "test"}, + "service_name": "otel-service", + "service_namespace": "agents", + "service_version": "1.2.3", + "instrumentation_scope": "test-otel", + "timeout_millis": 1 + }, + { + "type": "openinference", + "endpoint": "http://127.0.0.1:4318/v1/traces", + "service_name": "oi-service" + }, + { + "type": "gen_ai", + "endpoint": "http://127.0.0.1:4318/v1/traces" + } + ] } })); assert!(!validate_plugin_config(&config).has_errors()); @@ -2101,10 +2394,161 @@ fn otlp_sections_register_inferred_subscribers_with_full_config() { .cloned() .collect::>(); assert!(names.contains(&"__nemo_relay_plugin__observability__opentelemetry".to_string())); - assert!(names.contains(&"__nemo_relay_plugin__observability__openinference".to_string())); + assert_eq!( + names + .iter() + .filter(|name| *name == "__nemo_relay_plugin__observability__opentelemetry") + .count(), + 1 + ); clear_plugin_configuration().unwrap(); } +#[test] +fn opentelemetry_endpoints_fan_out_to_heterogeneous_and_repeated_types() { + let _guard = crate::observability::test_mutex().lock().unwrap(); + reset_runtime(); + let (full_endpoint, full_request) = start_otlp_capture_server(); + let (gen_ai_endpoint, gen_ai_request) = start_otlp_capture_server(); + let (repeated_endpoint, repeated_request) = start_otlp_capture_server(); + + let config = plugin_config(json!({ + "opentelemetry": { + "enabled": true, + "endpoints": [ + {"type": "full", "endpoint": full_endpoint}, + {"type": "gen_ai", "endpoint": gen_ai_endpoint}, + {"type": "full", "endpoint": repeated_endpoint} + ] + } + })); + futures::executor::block_on(initialize_plugins_exact(config)).unwrap(); + + let agent = push_agent("fanout-agent"); + pop(&agent); + clear_plugin_configuration().unwrap(); + + for request in [full_request, gen_ai_request, repeated_request] { + let body = request + .recv_timeout(Duration::from_secs(10)) + .expect("each configured endpoint should receive the exported span"); + assert!(!body.is_empty()); + } +} + +#[test] +fn opentelemetry_endpoint_delivery_failure_does_not_block_other_endpoints() { + let _guard = crate::observability::test_mutex().lock().unwrap(); + reset_runtime(); + let (healthy_endpoint, healthy_request) = start_otlp_capture_server(); + let config = plugin_config(json!({ + "opentelemetry": { + "enabled": true, + "endpoints": [ + { + "type": "full", + "endpoint": "http://127.0.0.1:1/v1/traces", + "timeout_millis": 50 + }, + {"type": "openinference", "endpoint": healthy_endpoint} + ] + } + })); + futures::executor::block_on(initialize_plugins_exact(config)).unwrap(); + + let agent = push_agent("failure-isolation-agent"); + pop(&agent); + let _ = clear_plugin_configuration(); + + let body = healthy_request + .recv_timeout(Duration::from_secs(10)) + .expect("healthy endpoint should receive spans despite another endpoint failing"); + assert!(!body.is_empty()); +} + +#[test] +fn invalid_later_opentelemetry_endpoint_leaves_no_fanout_registration() { + let _guard = crate::observability::test_mutex().lock().unwrap(); + reset_runtime(); + let config = plugin_config(json!({ + "opentelemetry": { + "enabled": true, + "endpoints": [ + { + "type": "full", + "endpoint": "http://127.0.0.1:4318/v1/traces" + }, + { + "type": "gen_ai", + "endpoint": "not a valid endpoint" + } + ] + } + })); + + assert!(futures::executor::block_on(initialize_plugins_exact(config)).is_err()); + assert!( + !global_context() + .read() + .unwrap() + .event_subscribers + .contains_key("__nemo_relay_plugin__observability__opentelemetry") + ); +} + +#[test] +fn opentelemetry_shutdown_helper_attempts_every_constructed_endpoint() { + let _guard = crate::observability::test_mutex().lock().unwrap(); + reset_runtime(); + let (subscribers, exporters): (Vec<_>, Vec<_>) = (0..2) + .map(|index| { + let exporter = opentelemetry_sdk::trace::InMemorySpanExporterBuilder::new().build(); + let provider = opentelemetry_sdk::trace::SdkTracerProvider::builder() + .with_simple_exporter(exporter.clone()) + .build(); + ( + std::sync::Arc::new(OpenTelemetrySubscriber::from_tracer_provider( + provider, + format!("rollback-{index}"), + )), + exporter, + ) + }) + .unzip(); + + assert!(shutdown_opentelemetry_subscribers(&subscribers).is_none()); + for exporter in exporters { + assert!( + exporter.is_shutdown_called(), + "every constructed endpoint exporter should be shut down" + ); + } +} + +#[test] +fn opentelemetry_delivery_continues_after_an_endpoint_panics() { + let delivered = std::sync::Arc::new(std::sync::atomic::AtomicBool::new(false)); + let delivered_after_panic = std::sync::Arc::clone(&delivered); + let callbacks: Vec = vec![ + std::sync::Arc::new(|_| panic!("simulated endpoint failure")), + std::sync::Arc::new(move |_| { + delivered_after_panic.store(true, std::sync::atomic::Ordering::SeqCst); + }), + ]; + let event = crate::api::event::Event::Mark(crate::api::event::MarkEvent::new( + crate::api::event::BaseEvent::builder() + .uuid(Uuid::now_v7()) + .name("fanout") + .build(), + None, + None, + )); + + deliver_opentelemetry_event(&callbacks, &event); + + assert!(delivered.load(std::sync::atomic::Ordering::SeqCst)); +} + #[test] fn atif_storage_defaults_to_empty() { let config = AtifSectionConfig::default(); diff --git a/crates/core/tests/unit/plugin_tests.rs b/crates/core/tests/unit/plugin_tests.rs index b39abb9d2..a0c7503cf 100644 --- a/crates/core/tests/unit/plugin_tests.rs +++ b/crates/core/tests/unit/plugin_tests.rs @@ -494,8 +494,9 @@ fn reset_global() { #[test] fn test_layer_config_overlay_wins() { // The overlay is the higher-precedence layer: it overrides shared component fields, deep-merges - // nested config objects, replaces arrays, appends overlay-only kinds, preserves base-only kinds, - // replaces top-level scalars, and recursively merges top-level objects (policy). + // nested config objects, concatenates config lists, appends overlay-only kinds, preserves + // base-only kinds, replaces top-level scalars, and recursively merges top-level objects + // (policy). let base = json!({ "version": 1, "components": [ @@ -552,8 +553,8 @@ fn test_layer_config_overlay_wins() { ); assert_eq!( alpha["config"]["list"], - json!([9]), - "arrays are replaced, not merged" + json!([9, 1, 2, 3]), + "config lists concatenate with higher-precedence entries first" ); // Base-only component is preserved. @@ -569,6 +570,115 @@ fn test_layer_config_overlay_wins() { ); } +#[test] +fn test_layer_config_concatenates_nested_observability_lists() { + let base = json!({ + "components": [{ + "kind": "observability", + "config": { + "atof": { + "sinks": [{"type": "file", "output_directory": "/system"}] + }, + "opentelemetry": { + "endpoints": [{"type": "full", "endpoint": "http://system:4318/v1/traces"}] + }, + "atif": { + "storage": [{"type": "http", "endpoint": "http://system/trajectory"}] + }, + "implementation": { + "nested": [1, 2] + } + } + }] + }); + let overlay = json!({ + "components": [{ + "kind": "observability", + "config": { + "atof": { + "sinks": [{"type": "file", "output_directory": "/user"}] + }, + "opentelemetry": { + "endpoints": [ + {"type": "gen_ai", "endpoint": "http://user:4318/v1/traces"}, + {"type": "openinference", "endpoint": "http://user:4319/v1/traces"} + ] + }, + "atif": { + "storage": [{"type": "http", "endpoint": "http://user/trajectory"}] + }, + "implementation": { + "nested": [9] + } + } + }] + }); + + let mut merged = base; + layer_config(&mut merged, overlay); + let config = &merged["components"][0]["config"]; + + assert_eq!( + config["atof"]["sinks"], + json!([ + {"type": "file", "output_directory": "/user"}, + {"type": "file", "output_directory": "/system"} + ]) + ); + assert_eq!( + config["opentelemetry"]["endpoints"], + json!([ + {"type": "gen_ai", "endpoint": "http://user:4318/v1/traces"}, + {"type": "openinference", "endpoint": "http://user:4319/v1/traces"}, + {"type": "full", "endpoint": "http://system:4318/v1/traces"} + ]) + ); + assert_eq!( + config["atif"]["storage"], + json!([ + {"type": "http", "endpoint": "http://user/trajectory"}, + {"type": "http", "endpoint": "http://system/trajectory"} + ]) + ); + assert_eq!( + config["implementation"]["nested"], + json!([9]), + "deeper implementation-specific lists retain replacement semantics" + ); +} + +#[test] +fn test_layer_config_replaces_observability_named_nested_lists_for_other_plugins() { + let mut merged = json!({ + "components": [{ + "kind": "third.party", + "config": { + "atof": {"sinks": ["base"]}, + "opentelemetry": {"endpoints": ["base"]}, + "atif": {"storage": ["base"]} + } + }] + }); + layer_config( + &mut merged, + json!({ + "components": [{ + "kind": "third.party", + "config": { + "atof": {"sinks": ["overlay"]}, + "opentelemetry": {"endpoints": ["overlay"]}, + "atif": {"storage": ["overlay"]} + } + }] + }), + ); + + let config = &merged["components"][0]["config"]; + assert_eq!(config["atof"]["sinks"], json!(["overlay"])); + assert_eq!(config["opentelemetry"]["endpoints"], json!(["overlay"])); + assert_eq!(config["atif"]["storage"], json!(["overlay"])); +} + #[test] fn test_layer_config_preserves_multi_instance_kinds() { // A kind used more than once (multi-instance plugins) must not collapse into the first slot. diff --git a/crates/ffi/Cargo.toml b/crates/ffi/Cargo.toml index aad8a3c20..adc3d29f4 100644 --- a/crates/ffi/Cargo.toml +++ b/crates/ffi/Cargo.toml @@ -17,7 +17,7 @@ workspace = true crate-type = ["cdylib", "staticlib", "rlib"] [dependencies] -nemo-relay = { workspace = true, features = ["atof-streaming", "otel", "openinference", "worker-grpc"] } +nemo-relay = { workspace = true, features = ["atof-streaming", "worker-grpc"] } nemo-relay-adaptive = { workspace = true, features = ["redis-backend"] } nemo-relay-pii-redaction.workspace = true chrono = "0.4" diff --git a/crates/ffi/README.md b/crates/ffi/README.md index ceb5e5cad..f54af7c61 100644 --- a/crates/ffi/README.md +++ b/crates/ffi/README.md @@ -44,6 +44,10 @@ binding consumes it through CGo. - **Exported `nemo_relay_*` symbols**: APIs for scopes, tool calls, LLM calls, middleware, subscribers, plugins, observability exporters, and scope stack isolation. +- **Typed OpenTelemetry export**: + `nemo_relay_otel_subscriber_create` constructs one `full`, `gen_ai`, or + `openinference` endpoint subscriber. The endpoint and projection type are + required. - **Generated header**: A committed `nemo_relay.h` file for C-compatible consumers. - **Native library outputs**: Shared and static libraries for platform diff --git a/crates/ffi/nemo_relay.h b/crates/ffi/nemo_relay.h index 3c381015a..c6f8749c3 100644 --- a/crates/ffi/nemo_relay.h +++ b/crates/ffi/nemo_relay.h @@ -182,11 +182,6 @@ typedef struct FfiLlmSanitizeRequestCodec FfiLlmSanitizeRequestCodec; */ typedef struct FfiLlmSanitizeResponseCodec FfiLlmSanitizeResponseCodec; -/** - * Opaque OpenInference subscriber handle. - */ -typedef struct FfiOpenInferenceSubscriber FfiOpenInferenceSubscriber; - /** * Opaque OpenTelemetry subscriber handle. */ @@ -1445,16 +1440,15 @@ NemoRelayStatus nemo_relay_atof_exporter_shutdown(const struct FfiAtofExporter * NemoRelayStatus nemo_relay_atof_exporter_path(const struct FfiAtofExporter *exporter, char **out); /** - * Creates a new OpenTelemetry subscriber. + * Creates one typed OpenTelemetry exporter subscriber. * - * Nullable strings use crate defaults when omitted. `headers_json` and - * `resource_attributes_json` must be JSON objects of string values when - * provided. + * `otel_type` must be `full`, `gen_ai`, or `openinference`. `endpoint` is required. * * # Safety * Any non-null C strings must be valid and `out` must be non-null. */ -NemoRelayStatus nemo_relay_otel_subscriber_create(const char *transport, +NemoRelayStatus nemo_relay_otel_subscriber_create(const char *otel_type, + const char *transport, const char *endpoint, const char *headers_json, const char *resource_attributes_json, @@ -1465,26 +1459,6 @@ NemoRelayStatus nemo_relay_otel_subscriber_create(const char *transport, uint64_t timeout_millis, struct FfiOpenTelemetrySubscriber **out); -/** - * Creates a new OpenTelemetry subscriber with typed attribute mappings. - * - * `attribute_mappings_json` is a JSON array of `{ "key": string, "alias": string }` objects. - * - * # Safety - * Any non-null C strings must be valid and `out` must be non-null. - */ -NemoRelayStatus nemo_relay_otel_subscriber_create_with_attribute_mappings(const char *transport, - const char *endpoint, - const char *headers_json, - const char *resource_attributes_json, - const char *service_name, - const char *service_namespace, - const char *service_version, - const char *instrumentation_scope, - uint64_t timeout_millis, - const char *attribute_mappings_json, - struct FfiOpenTelemetrySubscriber **out); - /** * Registers the OpenTelemetry subscriber as an event subscriber. * @@ -1518,80 +1492,6 @@ NemoRelayStatus nemo_relay_otel_subscriber_force_flush(const struct FfiOpenTelem */ NemoRelayStatus nemo_relay_otel_subscriber_shutdown(const struct FfiOpenTelemetrySubscriber *subscriber); -/** - * Creates a new OpenInference subscriber. - * - * Nullable strings use crate defaults when omitted. `headers_json` and - * `resource_attributes_json` must be JSON objects of string values when - * provided. - * - * # Safety - * Any non-null C strings must be valid and `out` must be non-null. - */ -NemoRelayStatus nemo_relay_openinference_subscriber_create(const char *transport, - const char *endpoint, - const char *headers_json, - const char *resource_attributes_json, - const char *service_name, - const char *service_namespace, - const char *service_version, - const char *instrumentation_scope, - uint64_t timeout_millis, - struct FfiOpenInferenceSubscriber **out); - -/** - * Creates a new OpenInference subscriber with typed attribute mappings. - * - * `attribute_mappings_json` is a JSON array of `{ "key": string, "alias": string }` objects. - * - * # Safety - * Any non-null C strings must be valid and `out` must be non-null. - */ -NemoRelayStatus nemo_relay_openinference_subscriber_create_with_attribute_mappings(const char *transport, - const char *endpoint, - const char *headers_json, - const char *resource_attributes_json, - const char *service_name, - const char *service_namespace, - const char *service_version, - const char *instrumentation_scope, - uint64_t timeout_millis, - const char *attribute_mappings_json, - struct FfiOpenInferenceSubscriber **out); - -/** - * Registers the OpenInference subscriber as an event subscriber. - * - * # Safety - * `subscriber` and `name` must be valid, non-null pointers. - */ -NemoRelayStatus nemo_relay_openinference_subscriber_register(const struct FfiOpenInferenceSubscriber *subscriber, - const char *name); - -/** - * Deregisters the OpenInference subscriber by name. - * - * # Safety - * `name` must be a valid C string. - */ -NemoRelayStatus nemo_relay_openinference_subscriber_deregister(const char *name); - -/** - * Forces a flush of finished spans through the exporter. - * - * # Safety - * `subscriber` must be a valid, non-null pointer. - */ -NemoRelayStatus nemo_relay_openinference_subscriber_force_flush(const struct FfiOpenInferenceSubscriber *subscriber); - -/** - * Shuts down the underlying tracer provider. - * - * # Safety - * `subscriber` must be a valid, non-null pointer. - */ -NemoRelayStatus nemo_relay_openinference_subscriber_shutdown(const struct FfiOpenInferenceSubscriber *subscriber); - /** * Load and activate dynamic plugins as one owned transaction. * @@ -2682,16 +2582,6 @@ void nemo_relay_atof_exporter_free(struct FfiAtofExporter *ptr); */ void nemo_relay_otel_subscriber_free(struct FfiOpenTelemetrySubscriber *ptr); -/** - * Free an OpenInference subscriber handle previously returned by - * `nemo_relay_openinference_subscriber_create`. - * - * # Safety - * `ptr` must be a valid pointer returned by - * `nemo_relay_openinference_subscriber_create`, or null. - */ -void nemo_relay_openinference_subscriber_free(struct FfiOpenInferenceSubscriber *ptr); - /** * Free an adaptive runtime handle previously returned by * `nemo_relay_adaptive_runtime_create`. diff --git a/crates/ffi/src/api/mod.rs b/crates/ffi/src/api/mod.rs index 42f40bdca..03103f58a 100644 --- a/crates/ffi/src/api/mod.rs +++ b/crates/ffi/src/api/mod.rs @@ -34,13 +34,13 @@ use crate::error::{ NemoRelayStatus, clear_last_error, last_error_message, set_last_error, status_from_error, status_from_plugin_error, }; +pub use crate::types::nemo_relay_otel_subscriber_free; use crate::types::{ FfiAtifExporter, FfiAtofExporter, FfiCodecHandle, FfiLLMHandle, FfiLLMRequest, - FfiLlmSanitizeRequestCodec, FfiLlmSanitizeResponseCodec, FfiOpenInferenceSubscriber, - FfiOpenTelemetrySubscriber, FfiPluginActivation, FfiPluginContext, FfiScopeHandle, - FfiScopeStack, FfiThreadScopeStackBinding, FfiToolHandle, NemoRelayScopeType, + FfiLlmSanitizeRequestCodec, FfiLlmSanitizeResponseCodec, FfiOpenTelemetrySubscriber, + FfiPluginActivation, FfiPluginContext, FfiScopeHandle, FfiScopeStack, + FfiThreadScopeStackBinding, FfiToolHandle, NemoRelayScopeType, }; -pub use crate::types::{nemo_relay_openinference_subscriber_free, nemo_relay_otel_subscriber_free}; use libc::c_char; use nemo_relay::api::llm as core_llm_api; use nemo_relay::api::llm::{LlmAttributes, LlmRequest, LlmRequestInterceptOutcome}; diff --git a/crates/ffi/src/api/observability.rs b/crates/ffi/src/api/observability.rs index 65c397dba..6dcc8933b 100644 --- a/crates/ffi/src/api/observability.rs +++ b/crates/ffi/src/api/observability.rs @@ -2,10 +2,9 @@ // SPDX-License-Identifier: Apache-2.0 use super::{ - Duration, FfiAtifExporter, FfiAtofExporter, FfiOpenInferenceSubscriber, - FfiOpenTelemetrySubscriber, NemoRelayStatus, c_char, c_str_to_json, c_str_to_string, - clear_last_error, core_subscriber_api, json_to_c_string, set_last_error, status_from_error, - str_to_c_string, tokio_runtime, + Duration, FfiAtifExporter, FfiAtofExporter, FfiOpenTelemetrySubscriber, NemoRelayStatus, + c_char, c_str_to_json, c_str_to_string, clear_last_error, core_subscriber_api, + json_to_c_string, set_last_error, status_from_error, str_to_c_string, tokio_runtime, }; type AtofExporter = nemo_relay::observability::atof::AtofExporter; @@ -14,9 +13,6 @@ type AtofExporterError = nemo_relay::observability::atof::AtofExporterError; type AtofExporterMode = nemo_relay::observability::atof::AtofExporterMode; type OpenTelemetryConfig = nemo_relay::observability::otel::OpenTelemetryConfig; type OpenTelemetrySubscriber = nemo_relay::observability::otel::OpenTelemetrySubscriber; -type OpenInferenceConfig = nemo_relay::observability::openinference::OpenInferenceConfig; -type OpenInferenceSubscriber = nemo_relay::observability::openinference::OpenInferenceSubscriber; -type OtlpAttributeMapping = nemo_relay::observability::OtlpAttributeMapping; type ObservabilityComponentSpec = nemo_relay::observability::plugin_component::ComponentSpec; type ObservabilityConfig = nemo_relay::observability::plugin_component::ObservabilityConfig; @@ -542,28 +538,6 @@ fn parse_string_map_json( Ok(out) } -fn parse_attribute_mappings_json( - json_ptr: *const c_char, -) -> Result, NemoRelayStatus> { - if json_ptr.is_null() { - return Ok(Vec::new()); - } - let json_string = c_str_to_string(json_ptr)?; - let value: serde_json::Value = serde_json::from_str(&json_string).map_err(|error| { - set_last_error(&format!("invalid attribute_mappings JSON: {error}")); - NemoRelayStatus::InvalidJson - })?; - let mappings: Vec = serde_json::from_value(value).map_err(|error| { - set_last_error(&format!("invalid attribute_mappings: {error}")); - NemoRelayStatus::InvalidArg - })?; - nemo_relay::observability::validate_attribute_mappings(&mappings).map_err(|error| { - set_last_error(&format!("invalid attribute_mappings: {error}")); - NemoRelayStatus::InvalidArg - })?; - Ok(mappings) -} - fn required_out_ptr(out: *mut *mut T) -> Result<(), NemoRelayStatus> { if out.is_null() { set_last_error("out pointer is null"); @@ -598,17 +572,6 @@ where }) } -fn apply_timeout(config: T, timeout_millis: u64, apply: F) -> T -where - F: FnOnce(T, Duration) -> T, -{ - if timeout_millis != 0 { - apply(config, Duration::from_millis(timeout_millis)) - } else { - config - } -} - fn apply_string_map( mut config: T, json_ptr: *const c_char, @@ -630,35 +593,23 @@ fn parse_transport(ptr: *const c_char) -> Result { fn otel_config_for_transport( transport: &str, + otel_type: nemo_relay::observability::OpenTelemetryType, + endpoint: String, service_name: String, ) -> Result { - match transport { - "http_binary" => Ok(OpenTelemetryConfig::http_binary(service_name)), - "grpc" => Ok(OpenTelemetryConfig::grpc(service_name)), + let transport = match transport { + "http_binary" => nemo_relay::observability::otel::OtlpTransport::HttpBinary, + "grpc" => nemo_relay::observability::otel::OtlpTransport::Grpc, other => { set_last_error(&format!( "transport must be 'http_binary' or 'grpc', got {other:?}" )); - Err(NemoRelayStatus::InvalidArg) - } - } -} - -fn openinference_config_for_transport( - transport: &str, -) -> Result { - match transport { - "http_binary" => Ok(OpenInferenceConfig::new() - .with_transport(nemo_relay::observability::openinference::OtlpTransport::HttpBinary)), - "grpc" => Ok(OpenInferenceConfig::new() - .with_transport(nemo_relay::observability::openinference::OtlpTransport::Grpc)), - other => { - set_last_error(&format!( - "transport must be 'http_binary' or 'grpc', got {other:?}" - )); - Err(NemoRelayStatus::InvalidArg) + return Err(NemoRelayStatus::InvalidArg); } - } + }; + Ok(OpenTelemetryConfig::new(otel_type, endpoint) + .with_transport(transport) + .with_service_name(service_name)) } fn create_otel_subscriber( @@ -671,62 +622,41 @@ fn create_otel_subscriber( }) } -fn create_openinference_subscriber( - config: OpenInferenceConfig, -) -> Result { - let _runtime_guard = tokio_runtime().enter(); - OpenInferenceSubscriber::new(config).map_err(|error| { - set_last_error(&error.to_string()); - NemoRelayStatus::Internal - }) +fn parse_otel_type( + ptr: *const c_char, +) -> Result { + match parse_optional_string(ptr)? { + Some(value) if value == "full" => Ok(nemo_relay::observability::OpenTelemetryType::Full), + Some(value) if value == "gen_ai" => Ok(nemo_relay::observability::OpenTelemetryType::GenAi), + Some(value) if value == "openinference" => { + Ok(nemo_relay::observability::OpenTelemetryType::OpenInference) + } + Some(value) => { + set_last_error(&format!( + "type must be 'full', 'gen_ai', or 'openinference', got {value:?}" + )); + Err(NemoRelayStatus::InvalidArg) + } + None => { + set_last_error("type is required"); + Err(NemoRelayStatus::InvalidArg) + } + } } -/// Creates a new OpenTelemetry subscriber. -/// -/// Nullable strings use crate defaults when omitted. `headers_json` and -/// `resource_attributes_json` must be JSON objects of string values when -/// provided. -/// -/// # Safety -/// Any non-null C strings must be valid and `out` must be non-null. -#[unsafe(no_mangle)] -pub unsafe extern "C" fn nemo_relay_otel_subscriber_create( - transport: *const c_char, - endpoint: *const c_char, - headers_json: *const c_char, - resource_attributes_json: *const c_char, - service_name: *const c_char, - service_namespace: *const c_char, - service_version: *const c_char, - instrumentation_scope: *const c_char, - timeout_millis: u64, - out: *mut *mut FfiOpenTelemetrySubscriber, -) -> NemoRelayStatus { - unsafe { - nemo_relay_otel_subscriber_create_with_attribute_mappings( - transport, - endpoint, - headers_json, - resource_attributes_json, - service_name, - service_namespace, - service_version, - instrumentation_scope, - timeout_millis, - std::ptr::null(), - out, - ) +fn parse_required_otel_endpoint(ptr: *const c_char) -> Result { + match parse_optional_string(ptr)? { + Some(value) if !value.trim().is_empty() => Ok(value), + _ => { + set_last_error("endpoint is required and must be nonblank"); + Err(NemoRelayStatus::InvalidArg) + } } } -/// Creates a new OpenTelemetry subscriber with typed attribute mappings. -/// -/// `attribute_mappings_json` is a JSON array of `{ "key": string, "alias": string }` objects. -/// -/// # Safety -/// Any non-null C strings must be valid and `out` must be non-null. -#[unsafe(no_mangle)] -pub unsafe extern "C" fn nemo_relay_otel_subscriber_create_with_attribute_mappings( +#[allow(clippy::too_many_arguments)] +fn build_ffi_otel_config( + otel_type: *const c_char, transport: *const c_char, endpoint: *const c_char, headers_json: *const c_char, @@ -736,228 +666,56 @@ pub unsafe extern "C" fn nemo_relay_otel_subscriber_create_with_attribute_mappin service_version: *const c_char, instrumentation_scope: *const c_char, timeout_millis: u64, - attribute_mappings_json: *const c_char, - out: *mut *mut FfiOpenTelemetrySubscriber, -) -> NemoRelayStatus { - clear_last_error(); - if let Err(status) = required_out_ptr(out) { - return status; - } - - let transport = match parse_transport(transport) { - Ok(value) => value, - Err(status) => return status, - }; - let service_name = match parse_string_or_default(service_name, "nemo-relay") { - Ok(value) => value, - Err(status) => return status, - }; - - let mut config = match otel_config_for_transport(&transport, service_name) { - Ok(config) => config, - Err(status) => return status, - }; - config = match apply_optional_string(config, endpoint, OpenTelemetryConfig::with_endpoint) { - Ok(config) => config, - Err(status) => return status, - }; - config = match apply_optional_string( +) -> Result { + let mut config = otel_config_for_transport( + &parse_transport(transport)?, + parse_otel_type(otel_type)?, + parse_required_otel_endpoint(endpoint)?, + parse_string_or_default(service_name, "unknown_service")?, + )?; + config = apply_optional_string( config, service_namespace, OpenTelemetryConfig::with_service_namespace, - ) { - Ok(config) => config, - Err(status) => return status, - }; - config = match apply_optional_string( + )?; + config = apply_optional_string( config, service_version, OpenTelemetryConfig::with_service_version, - ) { - Ok(config) => config, - Err(status) => return status, - }; - config = match apply_optional_string( - config, - instrumentation_scope, - OpenTelemetryConfig::with_instrumentation_scope, - ) { - Ok(config) => config, - Err(status) => return status, - }; - config = apply_timeout(config, timeout_millis, OpenTelemetryConfig::with_timeout); - config = match apply_string_map( + )?; + config = config + .with_instrumentation_scope(parse_string_or_default( + instrumentation_scope, + "opentelemetry", + )?) + .with_timeout(Duration::from_millis(if timeout_millis == 0 { + 3_000 + } else { + timeout_millis + })); + config = apply_string_map( config, headers_json, "headers", OpenTelemetryConfig::with_header, - ) { - Ok(config) => config, - Err(status) => return status, - }; - let attribute_mappings = match parse_attribute_mappings_json(attribute_mappings_json) { - Ok(mappings) => mappings, - Err(status) => return status, - }; - config = config.with_attribute_mappings(attribute_mappings); - config = match apply_string_map( + )?; + apply_string_map( config, resource_attributes_json, "resource_attributes", OpenTelemetryConfig::with_resource_attribute, - ) { - Ok(config) => config, - Err(status) => return status, - }; - - let subscriber = match create_otel_subscriber(config) { - Ok(subscriber) => subscriber, - Err(status) => return status, - }; - unsafe { *out = Box::into_raw(Box::new(FfiOpenTelemetrySubscriber(subscriber))) }; - NemoRelayStatus::Ok -} - -/// Registers the OpenTelemetry subscriber as an event subscriber. -/// -/// # Safety -/// `subscriber` and `name` must be valid, non-null pointers. -#[unsafe(no_mangle)] -pub unsafe extern "C" fn nemo_relay_otel_subscriber_register( - subscriber: *const FfiOpenTelemetrySubscriber, - name: *const c_char, -) -> NemoRelayStatus { - clear_last_error(); - if subscriber.is_null() { - set_last_error("subscriber pointer is null"); - return NemoRelayStatus::NullPointer; - } - let name = match c_str_to_string(name) { - Ok(s) => s, - Err(status) => return status, - }; - - match unsafe { &*subscriber }.0.register(&name) { - Ok(()) => NemoRelayStatus::Ok, - Err(e) => { - set_last_error(&e.to_string()); - NemoRelayStatus::Internal - } - } + ) } -/// Deregisters the OpenTelemetry subscriber by name. +/// Creates one typed OpenTelemetry exporter subscriber. /// -/// # Safety -/// `name` must be a valid C string. -#[unsafe(no_mangle)] -pub unsafe extern "C" fn nemo_relay_otel_subscriber_deregister( - name: *const c_char, -) -> NemoRelayStatus { - clear_last_error(); - let name = match c_str_to_string(name) { - Ok(s) => s, - Err(status) => return status, - }; - - match core_subscriber_api::deregister_subscriber(&name) { - Ok(_) => NemoRelayStatus::Ok, - Err(e) => status_from_error(&e), - } -} - -/// Forces a flush of finished spans through the exporter. -/// -/// # Safety -/// `subscriber` must be a valid, non-null pointer. -#[unsafe(no_mangle)] -pub unsafe extern "C" fn nemo_relay_otel_subscriber_force_flush( - subscriber: *const FfiOpenTelemetrySubscriber, -) -> NemoRelayStatus { - clear_last_error(); - if subscriber.is_null() { - set_last_error("subscriber pointer is null"); - return NemoRelayStatus::NullPointer; - } - - match unsafe { &*subscriber }.0.force_flush() { - Ok(()) => NemoRelayStatus::Ok, - Err(e) => { - set_last_error(&e.to_string()); - NemoRelayStatus::Internal - } - } -} - -/// Shuts down the underlying tracer provider. -/// -/// # Safety -/// `subscriber` must be a valid, non-null pointer. -#[unsafe(no_mangle)] -pub unsafe extern "C" fn nemo_relay_otel_subscriber_shutdown( - subscriber: *const FfiOpenTelemetrySubscriber, -) -> NemoRelayStatus { - clear_last_error(); - if subscriber.is_null() { - set_last_error("subscriber pointer is null"); - return NemoRelayStatus::NullPointer; - } - - match unsafe { &*subscriber }.0.shutdown() { - Ok(()) => NemoRelayStatus::Ok, - Err(e) => { - set_last_error(&e.to_string()); - NemoRelayStatus::Internal - } - } -} - -/// Creates a new OpenInference subscriber. -/// -/// Nullable strings use crate defaults when omitted. `headers_json` and -/// `resource_attributes_json` must be JSON objects of string values when -/// provided. +/// `otel_type` must be `full`, `gen_ai`, or `openinference`. `endpoint` is required. /// /// # Safety /// Any non-null C strings must be valid and `out` must be non-null. #[unsafe(no_mangle)] -pub unsafe extern "C" fn nemo_relay_openinference_subscriber_create( - transport: *const c_char, - endpoint: *const c_char, - headers_json: *const c_char, - resource_attributes_json: *const c_char, - service_name: *const c_char, - service_namespace: *const c_char, - service_version: *const c_char, - instrumentation_scope: *const c_char, - timeout_millis: u64, - out: *mut *mut FfiOpenInferenceSubscriber, -) -> NemoRelayStatus { - unsafe { - nemo_relay_openinference_subscriber_create_with_attribute_mappings( - transport, - endpoint, - headers_json, - resource_attributes_json, - service_name, - service_namespace, - service_version, - instrumentation_scope, - timeout_millis, - std::ptr::null(), - out, - ) - } -} - -/// Creates a new OpenInference subscriber with typed attribute mappings. -/// -/// `attribute_mappings_json` is a JSON array of `{ "key": string, "alias": string }` objects. -/// -/// # Safety -/// Any non-null C strings must be valid and `out` must be non-null. -#[unsafe(no_mangle)] -pub unsafe extern "C" fn nemo_relay_openinference_subscriber_create_with_attribute_mappings( +pub unsafe extern "C" fn nemo_relay_otel_subscriber_create( + otel_type: *const c_char, transport: *const c_char, endpoint: *const c_char, headers_json: *const c_char, @@ -967,95 +725,42 @@ pub unsafe extern "C" fn nemo_relay_openinference_subscriber_create_with_attribu service_version: *const c_char, instrumentation_scope: *const c_char, timeout_millis: u64, - attribute_mappings_json: *const c_char, - out: *mut *mut FfiOpenInferenceSubscriber, + out: *mut *mut FfiOpenTelemetrySubscriber, ) -> NemoRelayStatus { clear_last_error(); if let Err(status) = required_out_ptr(out) { return status; } - - let transport = match parse_transport(transport) { - Ok(value) => value, - Err(status) => return status, - }; - let mut config = match openinference_config_for_transport(&transport) { - Ok(config) => config, - Err(status) => return status, - }; - config = - match apply_optional_string(config, service_name, OpenInferenceConfig::with_service_name) { - Ok(config) => config, - Err(status) => return status, - }; - config = match apply_optional_string(config, endpoint, OpenInferenceConfig::with_endpoint) { - Ok(config) => config, - Err(status) => return status, - }; - config = match apply_optional_string( - config, + let config = match build_ffi_otel_config( + otel_type, + transport, + endpoint, + headers_json, + resource_attributes_json, + service_name, service_namespace, - OpenInferenceConfig::with_service_namespace, - ) { - Ok(config) => config, - Err(status) => return status, - }; - config = match apply_optional_string( - config, service_version, - OpenInferenceConfig::with_service_version, - ) { - Ok(config) => config, - Err(status) => return status, - }; - config = match apply_optional_string( - config, instrumentation_scope, - OpenInferenceConfig::with_instrumentation_scope, - ) { - Ok(config) => config, - Err(status) => return status, - }; - config = apply_timeout(config, timeout_millis, OpenInferenceConfig::with_timeout); - config = match apply_string_map( - config, - headers_json, - "headers", - OpenInferenceConfig::with_header, - ) { - Ok(config) => config, - Err(status) => return status, - }; - let attribute_mappings = match parse_attribute_mappings_json(attribute_mappings_json) { - Ok(mappings) => mappings, - Err(status) => return status, - }; - config = config.with_attribute_mappings(attribute_mappings); - config = match apply_string_map( - config, - resource_attributes_json, - "resource_attributes", - OpenInferenceConfig::with_resource_attribute, + timeout_millis, ) { Ok(config) => config, Err(status) => return status, }; - - let subscriber = match create_openinference_subscriber(config) { + let subscriber = match create_otel_subscriber(config) { Ok(subscriber) => subscriber, Err(status) => return status, }; - unsafe { *out = Box::into_raw(Box::new(FfiOpenInferenceSubscriber(subscriber))) }; + unsafe { *out = Box::into_raw(Box::new(FfiOpenTelemetrySubscriber(subscriber))) }; NemoRelayStatus::Ok } -/// Registers the OpenInference subscriber as an event subscriber. +/// Registers the OpenTelemetry subscriber as an event subscriber. /// /// # Safety /// `subscriber` and `name` must be valid, non-null pointers. #[unsafe(no_mangle)] -pub unsafe extern "C" fn nemo_relay_openinference_subscriber_register( - subscriber: *const FfiOpenInferenceSubscriber, +pub unsafe extern "C" fn nemo_relay_otel_subscriber_register( + subscriber: *const FfiOpenTelemetrySubscriber, name: *const c_char, ) -> NemoRelayStatus { clear_last_error(); @@ -1077,12 +782,12 @@ pub unsafe extern "C" fn nemo_relay_openinference_subscriber_register( } } -/// Deregisters the OpenInference subscriber by name. +/// Deregisters the OpenTelemetry subscriber by name. /// /// # Safety /// `name` must be a valid C string. #[unsafe(no_mangle)] -pub unsafe extern "C" fn nemo_relay_openinference_subscriber_deregister( +pub unsafe extern "C" fn nemo_relay_otel_subscriber_deregister( name: *const c_char, ) -> NemoRelayStatus { clear_last_error(); @@ -1102,8 +807,8 @@ pub unsafe extern "C" fn nemo_relay_openinference_subscriber_deregister( /// # Safety /// `subscriber` must be a valid, non-null pointer. #[unsafe(no_mangle)] -pub unsafe extern "C" fn nemo_relay_openinference_subscriber_force_flush( - subscriber: *const FfiOpenInferenceSubscriber, +pub unsafe extern "C" fn nemo_relay_otel_subscriber_force_flush( + subscriber: *const FfiOpenTelemetrySubscriber, ) -> NemoRelayStatus { clear_last_error(); if subscriber.is_null() { @@ -1125,8 +830,8 @@ pub unsafe extern "C" fn nemo_relay_openinference_subscriber_force_flush( /// # Safety /// `subscriber` must be a valid, non-null pointer. #[unsafe(no_mangle)] -pub unsafe extern "C" fn nemo_relay_openinference_subscriber_shutdown( - subscriber: *const FfiOpenInferenceSubscriber, +pub unsafe extern "C" fn nemo_relay_otel_subscriber_shutdown( + subscriber: *const FfiOpenTelemetrySubscriber, ) -> NemoRelayStatus { clear_last_error(); if subscriber.is_null() { diff --git a/crates/ffi/src/types/mod.rs b/crates/ffi/src/types/mod.rs index 26bf32577..a471c5691 100644 --- a/crates/ffi/src/types/mod.rs +++ b/crates/ffi/src/types/mod.rs @@ -63,10 +63,6 @@ pub struct FfiAtifExporter(pub nemo_relay::observability::atif::AtifExporter); pub struct FfiAtofExporter(pub nemo_relay::observability::atof::AtofExporter); /// Opaque OpenTelemetry subscriber handle. pub struct FfiOpenTelemetrySubscriber(pub nemo_relay::observability::otel::OpenTelemetrySubscriber); -/// Opaque OpenInference subscriber handle. -pub struct FfiOpenInferenceSubscriber( - pub nemo_relay::observability::openinference::OpenInferenceSubscriber, -); /// Opaque owned adaptive runtime handle. pub struct FfiAdaptiveRuntime(pub std::sync::Mutex>); /// Opaque owned dynamic plugin host activation. @@ -270,21 +266,6 @@ pub unsafe extern "C" fn nemo_relay_otel_subscriber_free(ptr: *mut FfiOpenTeleme } } -/// Free an OpenInference subscriber handle previously returned by -/// `nemo_relay_openinference_subscriber_create`. -/// -/// # Safety -/// `ptr` must be a valid pointer returned by -/// `nemo_relay_openinference_subscriber_create`, or null. -#[unsafe(no_mangle)] -pub unsafe extern "C" fn nemo_relay_openinference_subscriber_free( - ptr: *mut FfiOpenInferenceSubscriber, -) { - if !ptr.is_null() { - drop(unsafe { Box::from_raw(ptr) }); - } -} - /// Free an adaptive runtime handle previously returned by /// `nemo_relay_adaptive_runtime_create`. /// diff --git a/crates/ffi/tests/integration/api/coverage_sweeps_tests.rs b/crates/ffi/tests/integration/api/coverage_sweeps_tests.rs index a7794ed3d..8708edb9e 100644 --- a/crates/ffi/tests/integration/api/coverage_sweeps_tests.rs +++ b/crates/ffi/tests/integration/api/coverage_sweeps_tests.rs @@ -1083,7 +1083,7 @@ fn test_ffi_adaptive_and_observability_entry_points_from_integration_binary() { nemo_relay_observability_default_config_json(&mut out_json), NemoRelayStatus::Ok ); - assert_eq!(returned_json(out_json)["version"], json!(2)); + assert_eq!(returned_json(out_json)["version"], json!(3)); assert_eq!( nemo_relay_observability_default_config_json(ptr::null_mut()), NemoRelayStatus::NullPointer diff --git a/crates/ffi/tests/unit/api/core_tests.rs b/crates/ffi/tests/unit/api/core_tests.rs index 35e1907b1..6b1320e5f 100644 --- a/crates/ffi/tests/unit/api/core_tests.rs +++ b/crates/ffi/tests/unit/api/core_tests.rs @@ -201,7 +201,7 @@ fn test_ffi_observability_plugin_file_sinks() { "kind": "observability", "enabled": true, "config": { - "version": 2, + "version": 3, "atof": { "enabled": true, "sinks": [{ @@ -238,7 +238,7 @@ fn test_ffi_observability_plugin_file_sinks() { nemo_relay_observability_default_config_json(&mut default_config_json), NemoRelayStatus::Ok ); - assert_eq!(returned_json(default_config_json)["version"], json!(2)); + assert_eq!(returned_json(default_config_json)["version"], json!(3)); let mut component_json = ptr::null_mut(); assert_eq!( nemo_relay_observability_component_spec_json(ptr::null(), true, &mut component_json), @@ -329,7 +329,7 @@ fn test_ffi_observability_plugin_atif_splits_multiple_top_level_agents() { "kind": "observability", "enabled": true, "config": { - "version": 2, + "version": 3, "atif": { "enabled": true, "output_directory": dir_text, diff --git a/crates/ffi/tests/unit/api/coverage_sweeps_tests.rs b/crates/ffi/tests/unit/api/coverage_sweeps_tests.rs index 3c0381eb6..f3732cf8a 100644 --- a/crates/ffi/tests/unit/api/coverage_sweeps_tests.rs +++ b/crates/ffi/tests/unit/api/coverage_sweeps_tests.rs @@ -3107,11 +3107,13 @@ fn test_ffi_observability_component_and_constructor_error_paths() { ); let invalid_map_shape = cstring(r#"["not-an-object"]"#); + let endpoint = cstring("http://localhost:4318/v1/traces"); let mut otel = ptr::null_mut(); assert_eq!( nemo_relay_otel_subscriber_create( + c"full".as_ptr(), ptr::null(), - ptr::null(), + endpoint.as_ptr(), invalid_map_shape.as_ptr(), ptr::null(), ptr::null(), @@ -3125,9 +3127,10 @@ fn test_ffi_observability_component_and_constructor_error_paths() { ); let mut openinference = ptr::null_mut(); assert_eq!( - nemo_relay_openinference_subscriber_create( - ptr::null(), + nemo_relay_otel_subscriber_create( + c"openinference".as_ptr(), ptr::null(), + endpoint.as_ptr(), invalid_map_shape.as_ptr(), ptr::null(), ptr::null(), diff --git a/crates/ffi/tests/unit/api/plugin_tests.rs b/crates/ffi/tests/unit/api/plugin_tests.rs index ebf6a4217..16426de31 100644 --- a/crates/ffi/tests/unit/api/plugin_tests.rs +++ b/crates/ffi/tests/unit/api/plugin_tests.rs @@ -1320,12 +1320,14 @@ fn test_ffi_specialized_subscriber_and_exporter_default_and_invalid_name_paths() unsafe { let invalid_utf8 = [0xffu8, 0]; let invalid_name = invalid_utf8.as_ptr() as *const c_char; + let endpoint = c"http://localhost:4318/v1/traces"; let mut otel_subscriber: *mut FfiOpenTelemetrySubscriber = ptr::null_mut(); assert_eq!( nemo_relay_otel_subscriber_create( + c"full".as_ptr(), ptr::null(), - ptr::null(), + endpoint.as_ptr(), ptr::null(), ptr::null(), ptr::null(), @@ -1372,11 +1374,12 @@ fn test_ffi_specialized_subscriber_and_exporter_default_and_invalid_name_paths() ); nemo_relay_otel_subscriber_free(otel_subscriber); - let mut oi_subscriber: *mut FfiOpenInferenceSubscriber = ptr::null_mut(); + let mut oi_subscriber: *mut FfiOpenTelemetrySubscriber = ptr::null_mut(); assert_eq!( - nemo_relay_openinference_subscriber_create( - ptr::null(), + nemo_relay_otel_subscriber_create( + c"openinference".as_ptr(), ptr::null(), + endpoint.as_ptr(), ptr::null(), ptr::null(), ptr::null(), @@ -1390,38 +1393,38 @@ fn test_ffi_specialized_subscriber_and_exporter_default_and_invalid_name_paths() ); let oi_name = cstring(&unique_name("ffi_oi_defaults")); assert_eq!( - nemo_relay_openinference_subscriber_register(oi_subscriber, invalid_name), + nemo_relay_otel_subscriber_register(oi_subscriber, invalid_name), NemoRelayStatus::InvalidUtf8 ); assert_eq!( - nemo_relay_openinference_subscriber_register(oi_subscriber, oi_name.as_ptr()), + nemo_relay_otel_subscriber_register(oi_subscriber, oi_name.as_ptr()), NemoRelayStatus::Ok ); assert_eq!( - nemo_relay_openinference_subscriber_register(oi_subscriber, oi_name.as_ptr()), + nemo_relay_otel_subscriber_register(oi_subscriber, oi_name.as_ptr()), NemoRelayStatus::Internal ); assert_eq!( - nemo_relay_openinference_subscriber_deregister(ptr::null()), + nemo_relay_otel_subscriber_deregister(ptr::null()), NemoRelayStatus::NullPointer ); assert_eq!( - nemo_relay_openinference_subscriber_deregister(invalid_name), + nemo_relay_otel_subscriber_deregister(invalid_name), NemoRelayStatus::InvalidUtf8 ); assert_eq!( - nemo_relay_openinference_subscriber_deregister(oi_name.as_ptr()), + nemo_relay_otel_subscriber_deregister(oi_name.as_ptr()), NemoRelayStatus::Ok ); assert_eq!( - nemo_relay_openinference_subscriber_force_flush(oi_subscriber), + nemo_relay_otel_subscriber_force_flush(oi_subscriber), NemoRelayStatus::Ok ); assert_eq!( - nemo_relay_openinference_subscriber_shutdown(oi_subscriber), + nemo_relay_otel_subscriber_shutdown(oi_subscriber), NemoRelayStatus::Ok ); - nemo_relay_openinference_subscriber_free(oi_subscriber); + nemo_relay_otel_subscriber_free(oi_subscriber); let session = cstring("specialized-session"); let agent = cstring("specialized-agent"); @@ -1466,123 +1469,6 @@ fn test_ffi_specialized_subscriber_and_exporter_default_and_invalid_name_paths() } } -#[test] -fn test_ffi_typed_attribute_mapping_constructors_validate_and_accept_mappings() { - let _lock = TEST_MUTEX.lock().unwrap_or_else(|e| e.into_inner()); - reset_globals(); - - unsafe { - let valid = cstring(r#"[{"key":"nemo_relay.start.data.tenant","alias":"tenant.id"}]"#); - let invalid = cstring(r#"[{"key":"","alias":"tenant.id"}]"#); - - let mut otel = ptr::null_mut(); - assert_eq!( - nemo_relay_otel_subscriber_create_with_attribute_mappings( - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - 0, - valid.as_ptr(), - &mut otel, - ), - NemoRelayStatus::Ok - ); - nemo_relay_otel_subscriber_free(otel); - assert_eq!( - nemo_relay_otel_subscriber_create_with_attribute_mappings( - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - 0, - invalid.as_ptr(), - &mut otel, - ), - NemoRelayStatus::InvalidArg - ); - - let mut openinference = ptr::null_mut(); - assert_eq!( - nemo_relay_openinference_subscriber_create_with_attribute_mappings( - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - 0, - valid.as_ptr(), - &mut openinference, - ), - NemoRelayStatus::Ok - ); - nemo_relay_openinference_subscriber_free(openinference); - assert_eq!( - nemo_relay_openinference_subscriber_create_with_attribute_mappings( - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - 0, - invalid.as_ptr(), - &mut openinference, - ), - NemoRelayStatus::InvalidArg - ); - - for invalid_shape in ["{}", "null", r#"[{"key":1,"alias":"tenant.id"}]"#] { - let invalid_shape = cstring(invalid_shape); - assert_eq!( - nemo_relay_otel_subscriber_create_with_attribute_mappings( - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - 0, - invalid_shape.as_ptr(), - &mut otel, - ), - NemoRelayStatus::InvalidArg - ); - assert_eq!( - nemo_relay_openinference_subscriber_create_with_attribute_mappings( - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - ptr::null(), - 0, - invalid_shape.as_ptr(), - &mut openinference, - ), - NemoRelayStatus::InvalidArg - ); - } - } -} - #[test] fn test_ffi_specialized_constructor_invalid_utf8_and_malformed_json_sweep() { let _lock = TEST_MUTEX.lock().unwrap_or_else(|e| e.into_inner()); @@ -1604,6 +1490,7 @@ fn test_ffi_specialized_constructor_invalid_utf8_and_malformed_json_sweep() { let mut otel = ptr::null_mut(); assert_eq!( nemo_relay_otel_subscriber_create( + c"full".as_ptr(), ptr::null(), endpoint.as_ptr(), malformed_json.as_ptr(), @@ -1619,6 +1506,7 @@ fn test_ffi_specialized_constructor_invalid_utf8_and_malformed_json_sweep() { ); assert_eq!( nemo_relay_otel_subscriber_create( + c"full".as_ptr(), ptr::null(), endpoint.as_ptr(), valid_headers.as_ptr(), @@ -1684,6 +1572,7 @@ fn test_ffi_specialized_constructor_invalid_utf8_and_malformed_json_sweep() { ] { assert_eq!( nemo_relay_otel_subscriber_create( + c"full".as_ptr(), transport, endpoint_ptr, valid_headers.as_ptr(), @@ -1701,7 +1590,8 @@ fn test_ffi_specialized_constructor_invalid_utf8_and_malformed_json_sweep() { let mut openinference = ptr::null_mut(); assert_eq!( - nemo_relay_openinference_subscriber_create( + nemo_relay_otel_subscriber_create( + c"openinference".as_ptr(), ptr::null(), endpoint.as_ptr(), malformed_json.as_ptr(), @@ -1716,7 +1606,8 @@ fn test_ffi_specialized_constructor_invalid_utf8_and_malformed_json_sweep() { NemoRelayStatus::InvalidJson ); assert_eq!( - nemo_relay_openinference_subscriber_create( + nemo_relay_otel_subscriber_create( + c"openinference".as_ptr(), ptr::null(), endpoint.as_ptr(), valid_headers.as_ptr(), @@ -1781,7 +1672,8 @@ fn test_ffi_specialized_constructor_invalid_utf8_and_malformed_json_sweep() { ), ] { assert_eq!( - nemo_relay_openinference_subscriber_create( + nemo_relay_otel_subscriber_create( + c"openinference".as_ptr(), transport, endpoint_ptr, valid_headers.as_ptr(), diff --git a/crates/ffi/tests/unit/api/registry_tests.rs b/crates/ffi/tests/unit/api/registry_tests.rs index efc28e2a0..2bd41fc7f 100644 --- a/crates/ffi/tests/unit/api/registry_tests.rs +++ b/crates/ffi/tests/unit/api/registry_tests.rs @@ -5,6 +5,61 @@ use super::*; use nemo_relay::plugin::rollback_registrations; +use std::io::{Read, Write}; +use std::net::TcpListener; +use std::sync::mpsc::{self, Receiver}; +use std::thread::{self, JoinHandle}; +use std::time::Duration; + +fn start_otlp_http_collector() -> (String, Receiver>, JoinHandle<()>) { + let listener = TcpListener::bind("127.0.0.1:0").unwrap(); + let address = listener.local_addr().unwrap(); + let (sender, receiver) = mpsc::channel(); + let handle = thread::spawn(move || { + let (mut stream, _) = listener.accept().unwrap(); + stream + .set_read_timeout(Some(Duration::from_secs(5))) + .unwrap(); + + let mut request = Vec::new(); + let mut buffer = [0_u8; 4096]; + let (header_end, content_length) = loop { + let read = stream.read(&mut buffer).unwrap(); + assert!( + read > 0, + "collector connection closed before request headers" + ); + request.extend_from_slice(&buffer[..read]); + if let Some(header_end) = request.windows(4).position(|value| value == b"\r\n\r\n") { + let header_end = header_end + 4; + let headers = String::from_utf8_lossy(&request[..header_end]); + let content_length = headers + .lines() + .find_map(|line| { + line.split_once(':').and_then(|(name, value)| { + name.eq_ignore_ascii_case("content-length") + .then(|| value.trim().parse::().unwrap()) + }) + }) + .expect("OTLP request must include content-length"); + break (header_end, content_length); + } + }; + while request.len() < header_end + content_length { + let read = stream.read(&mut buffer).unwrap(); + assert!(read > 0, "collector connection closed before request body"); + request.extend_from_slice(&buffer[..read]); + } + + sender + .send(request[header_end..header_end + content_length].to_vec()) + .unwrap(); + stream + .write_all(b"HTTP/1.1 200 OK\r\ncontent-length: 0\r\nconnection: close\r\n\r\n") + .unwrap(); + }); + (format!("http://{address}/v1/traces"), receiver, handle) +} unsafe extern "C" fn event_sanitize_cb( _user_data: *mut libc::c_void, @@ -449,6 +504,7 @@ fn test_ffi_open_telemetry_subscriber_lifecycle_and_errors() { assert_eq!( nemo_relay_otel_subscriber_create( + c"full".as_ptr(), ptr::null(), endpoint.as_ptr(), headers.as_ptr(), @@ -464,6 +520,7 @@ fn test_ffi_open_telemetry_subscriber_lifecycle_and_errors() { ); assert_eq!( nemo_relay_otel_subscriber_create( + c"full".as_ptr(), invalid_transport.as_ptr(), endpoint.as_ptr(), headers.as_ptr(), @@ -479,6 +536,7 @@ fn test_ffi_open_telemetry_subscriber_lifecycle_and_errors() { ); assert_eq!( nemo_relay_otel_subscriber_create( + c"full".as_ptr(), ptr::null(), endpoint.as_ptr(), invalid_headers.as_ptr(), @@ -494,6 +552,7 @@ fn test_ffi_open_telemetry_subscriber_lifecycle_and_errors() { ); assert_eq!( nemo_relay_otel_subscriber_create( + c"full".as_ptr(), ptr::null(), endpoint.as_ptr(), headers.as_ptr(), @@ -509,6 +568,7 @@ fn test_ffi_open_telemetry_subscriber_lifecycle_and_errors() { ); assert_eq!( nemo_relay_otel_subscriber_create( + c"full".as_ptr(), grpc_transport.as_ptr(), endpoint.as_ptr(), headers.as_ptr(), @@ -527,6 +587,7 @@ fn test_ffi_open_telemetry_subscriber_lifecycle_and_errors() { subscriber = ptr::null_mut(); assert_eq!( nemo_relay_otel_subscriber_create( + c"full".as_ptr(), ptr::null(), endpoint.as_ptr(), headers.as_ptr(), @@ -580,13 +641,130 @@ fn test_ffi_open_telemetry_subscriber_lifecycle_and_errors() { } } +#[test] +fn test_ffi_open_telemetry_typed_required_fields_and_gen_ai_wire_output() { + let _lock = TEST_MUTEX.lock().unwrap_or_else(|e| e.into_inner()); + reset_globals(); + + unsafe { + let endpoint = cstring("http://localhost:4318/v1/traces"); + let blank = cstring(" \t"); + let unknown = cstring("unknown"); + let mut subscriber: *mut FfiOpenTelemetrySubscriber = ptr::null_mut(); + + for (otel_type, endpoint_ptr) in [ + (ptr::null(), endpoint.as_ptr()), + (c"".as_ptr(), endpoint.as_ptr()), + (unknown.as_ptr(), endpoint.as_ptr()), + (c"full".as_ptr(), ptr::null()), + (c"full".as_ptr(), blank.as_ptr()), + ] { + assert_eq!( + nemo_relay_otel_subscriber_create( + otel_type, + ptr::null(), + endpoint_ptr, + ptr::null(), + ptr::null(), + ptr::null(), + ptr::null(), + ptr::null(), + ptr::null(), + 0, + &mut subscriber, + ), + NemoRelayStatus::InvalidArg + ); + assert!(subscriber.is_null()); + } + + let (collector_endpoint, request, collector) = start_otlp_http_collector(); + let collector_endpoint = cstring(&collector_endpoint); + assert_eq!( + nemo_relay_otel_subscriber_create( + c"gen_ai".as_ptr(), + ptr::null(), + collector_endpoint.as_ptr(), + ptr::null(), + ptr::null(), + ptr::null(), + ptr::null(), + ptr::null(), + ptr::null(), + 0, + &mut subscriber, + ), + NemoRelayStatus::Ok + ); + let subscriber_name = cstring(&unique_name("ffi_gen_ai")); + assert_eq!( + nemo_relay_otel_subscriber_register(subscriber, subscriber_name.as_ptr()), + NemoRelayStatus::Ok + ); + + let stack = fresh_scope_stack(); + let scope_name = cstring("research-agent"); + let mut scope = ptr::null_mut(); + assert_eq!( + nemo_relay_push_scope( + scope_name.as_ptr(), + NemoRelayScopeType::Agent, + ptr::null(), + 0, + ptr::null(), + ptr::null(), + ptr::null(), + &mut scope, + ), + NemoRelayStatus::Ok + ); + assert_eq!( + nemo_relay_pop_scope(scope, ptr::null()), + NemoRelayStatus::Ok + ); + assert_eq!(nemo_relay_flush_subscribers(), NemoRelayStatus::Ok); + assert_eq!( + nemo_relay_otel_subscriber_force_flush(subscriber), + NemoRelayStatus::Ok + ); + + let body = request.recv_timeout(Duration::from_secs(5)).unwrap(); + assert!( + body.windows(b"invoke_agent research-agent".len()) + .any(|value| value == b"invoke_agent research-agent") + ); + assert!( + body.windows(b"gen_ai.operation.name".len()) + .any(|value| value == b"gen_ai.operation.name") + ); + assert!( + !body + .windows(b"nemo_relay.".len()) + .any(|value| value == b"nemo_relay.") + ); + + assert_eq!( + nemo_relay_otel_subscriber_deregister(subscriber_name.as_ptr()), + NemoRelayStatus::Ok + ); + assert_eq!( + nemo_relay_otel_subscriber_shutdown(subscriber), + NemoRelayStatus::Ok + ); + nemo_relay_otel_subscriber_free(subscriber); + nemo_relay_scope_handle_free(scope); + nemo_relay_scope_stack_free(stack); + collector.join().unwrap(); + } +} + #[test] fn test_ffi_open_inference_subscriber_lifecycle_and_errors() { let _lock = TEST_MUTEX.lock().unwrap_or_else(|e| e.into_inner()); reset_globals(); unsafe { - let mut subscriber: *mut FfiOpenInferenceSubscriber = ptr::null_mut(); + let mut subscriber: *mut FfiOpenTelemetrySubscriber = ptr::null_mut(); let endpoint = cstring("http://localhost:4318/v1/traces"); let headers = cstring(r#"{"authorization":"Bearer token"}"#); let resource_attributes = cstring(r#"{"deployment.environment":"test"}"#); @@ -600,7 +778,8 @@ fn test_ffi_open_inference_subscriber_lifecycle_and_errors() { let invalid_resource_attributes = cstring(r#"["not-an-object"]"#); assert_eq!( - nemo_relay_openinference_subscriber_create( + nemo_relay_otel_subscriber_create( + c"openinference".as_ptr(), ptr::null(), endpoint.as_ptr(), headers.as_ptr(), @@ -615,7 +794,8 @@ fn test_ffi_open_inference_subscriber_lifecycle_and_errors() { NemoRelayStatus::NullPointer ); assert_eq!( - nemo_relay_openinference_subscriber_create( + nemo_relay_otel_subscriber_create( + c"openinference".as_ptr(), invalid_transport.as_ptr(), endpoint.as_ptr(), headers.as_ptr(), @@ -630,7 +810,8 @@ fn test_ffi_open_inference_subscriber_lifecycle_and_errors() { NemoRelayStatus::InvalidArg ); assert_eq!( - nemo_relay_openinference_subscriber_create( + nemo_relay_otel_subscriber_create( + c"openinference".as_ptr(), ptr::null(), endpoint.as_ptr(), invalid_headers.as_ptr(), @@ -645,7 +826,8 @@ fn test_ffi_open_inference_subscriber_lifecycle_and_errors() { NemoRelayStatus::InvalidArg ); assert_eq!( - nemo_relay_openinference_subscriber_create( + nemo_relay_otel_subscriber_create( + c"openinference".as_ptr(), ptr::null(), endpoint.as_ptr(), headers.as_ptr(), @@ -660,7 +842,8 @@ fn test_ffi_open_inference_subscriber_lifecycle_and_errors() { NemoRelayStatus::InvalidArg ); assert_eq!( - nemo_relay_openinference_subscriber_create( + nemo_relay_otel_subscriber_create( + c"openinference".as_ptr(), grpc_transport.as_ptr(), endpoint.as_ptr(), headers.as_ptr(), @@ -675,10 +858,11 @@ fn test_ffi_open_inference_subscriber_lifecycle_and_errors() { NemoRelayStatus::Ok ); assert!(!subscriber.is_null()); - nemo_relay_openinference_subscriber_free(subscriber); + nemo_relay_otel_subscriber_free(subscriber); subscriber = ptr::null_mut(); assert_eq!( - nemo_relay_openinference_subscriber_create( + nemo_relay_otel_subscriber_create( + c"openinference".as_ptr(), ptr::null(), endpoint.as_ptr(), headers.as_ptr(), @@ -696,39 +880,39 @@ fn test_ffi_open_inference_subscriber_lifecycle_and_errors() { let name = cstring(&unique_name("ffi_openinference")); assert_eq!( - nemo_relay_openinference_subscriber_register(ptr::null(), name.as_ptr()), + nemo_relay_otel_subscriber_register(ptr::null(), name.as_ptr()), NemoRelayStatus::NullPointer ); assert_eq!( - nemo_relay_openinference_subscriber_force_flush(ptr::null()), + nemo_relay_otel_subscriber_force_flush(ptr::null()), NemoRelayStatus::NullPointer ); assert_eq!( - nemo_relay_openinference_subscriber_shutdown(ptr::null()), + nemo_relay_otel_subscriber_shutdown(ptr::null()), NemoRelayStatus::NullPointer ); assert_eq!( - nemo_relay_openinference_subscriber_register(subscriber, name.as_ptr()), + nemo_relay_otel_subscriber_register(subscriber, name.as_ptr()), NemoRelayStatus::Ok ); assert_eq!( - nemo_relay_openinference_subscriber_deregister(name.as_ptr()), + nemo_relay_otel_subscriber_deregister(name.as_ptr()), NemoRelayStatus::Ok ); assert_eq!( - nemo_relay_openinference_subscriber_deregister(name.as_ptr()), + nemo_relay_otel_subscriber_deregister(name.as_ptr()), NemoRelayStatus::Ok ); assert_eq!( - nemo_relay_openinference_subscriber_force_flush(subscriber), + nemo_relay_otel_subscriber_force_flush(subscriber), NemoRelayStatus::Ok ); assert_eq!( - nemo_relay_openinference_subscriber_shutdown(subscriber), + nemo_relay_otel_subscriber_shutdown(subscriber), NemoRelayStatus::Ok ); - nemo_relay_openinference_subscriber_free(subscriber); + nemo_relay_otel_subscriber_free(subscriber); } } diff --git a/crates/ffi/tests/unit/types_tests.rs b/crates/ffi/tests/unit/types_tests.rs index d8ef8bce7..9c9a008c2 100644 --- a/crates/ffi/tests/unit/types_tests.rs +++ b/crates/ffi/tests/unit/types_tests.rs @@ -261,7 +261,6 @@ fn test_llm_request_null_inputs_event_null_guards_and_free_nulls() { nemo_relay_scope_stack_free(std::ptr::null_mut()); nemo_relay_atif_exporter_free(std::ptr::null_mut()); nemo_relay_otel_subscriber_free(std::ptr::null_mut()); - nemo_relay_openinference_subscriber_free(std::ptr::null_mut()); nemo_relay_adaptive_runtime_free(std::ptr::null_mut()); } } diff --git a/crates/node/Cargo.toml b/crates/node/Cargo.toml index b8864f19b..6779eb837 100644 --- a/crates/node/Cargo.toml +++ b/crates/node/Cargo.toml @@ -18,7 +18,7 @@ crate-type = ["cdylib"] test = false [dependencies] -nemo-relay = { workspace = true, features = ["atof-streaming", "guardrails-remote", "object-store", "otel", "openinference", "worker-grpc"] } +nemo-relay = { workspace = true, features = ["atof-streaming", "guardrails-remote", "object-store", "worker-grpc"] } nemo-relay-adaptive = { workspace = true, features = ["redis-backend"] } nemo-relay-pii-redaction.workspace = true chrono = "0.4" diff --git a/crates/node/README.md b/crates/node/README.md index c47166d91..13d0ccda9 100644 --- a/crates/node/README.md +++ b/crates/node/README.md @@ -32,8 +32,8 @@ Use the Node.js binding for the following tasks: - **Put policy around callbacks**: Register guardrails and intercepts for request rewriting, blocking, sanitization, and execution wrapping. - **Emit one lifecycle stream**: Send runtime events to in-process - subscribers, Agent Trajectory Interchange Format (ATIF), OpenTelemetry, or - OpenInference workflows. + subscribers, Agent Trajectory Interchange Format (ATIF), or typed + OpenTelemetry workflows. - **Use package entry points by need**: Import the main runtime surface plus typed, plugin, adaptive, and observability helpers from npm. @@ -48,8 +48,10 @@ The Node.js package provides the following capabilities: - **Middleware APIs**: Guardrails and intercepts for tool and LLM boundaries, plus mark and scope event sanitizers for `data`, `categoryProfile`, and `metadata`. -- **Observability exporters**: Subscriber and exporter support for common - runtime telemetry flows. +- **Observability exporters**: `OpenTelemetrySubscriber` accepts one required + `full`, `gen_ai`, or `openinference` endpoint configuration. The + `nemo-relay-node/observability` helper configures plugin-owned endpoint + fan-out. - **Additional entry points**: `nemo-relay-node/typed`, `nemo-relay-node/plugin`, `nemo-relay-node/adaptive`, and `nemo-relay-node/observability`. diff --git a/crates/node/observability.d.ts b/crates/node/observability.d.ts index caddfb316..fc93c50a7 100644 --- a/crates/node/observability.d.ts +++ b/crates/node/observability.d.ts @@ -66,14 +66,12 @@ export interface AtifConfig { storage?: S3StorageConfig | HttpStorageConfig | Array; } -export interface OtlpConfig { - enabled?: boolean; - mark_projection?: 'inherit' | 'event' | 'tool'; - mark_exclude_names?: string[]; - attribute_mappings?: OtlpAttributeMapping[]; +export interface OpenTelemetryEndpointConfig { + type: 'full' | 'gen_ai' | 'openinference'; + endpoint: string; transport?: 'http_binary' | 'grpc' | string; - endpoint?: string; headers?: Record; + header_env?: Record; resource_attributes?: Record; service_name?: string; service_namespace?: string; @@ -82,18 +80,16 @@ export interface OtlpConfig { timeout_millis?: number; } -/** Copy a projected OTLP attribute to an additional attribute name. */ -export interface OtlpAttributeMapping { - key: string; - alias: string; +export interface OpenTelemetrySectionConfig { + enabled?: boolean; + endpoints?: OpenTelemetryEndpointConfig[]; } export interface Config { version?: number; atof?: AtofConfig; atif?: AtifConfig; - opentelemetry?: OtlpConfig; - openinference?: OtlpConfig; + opentelemetry?: OpenTelemetrySectionConfig; policy?: ConfigPolicy; } @@ -111,8 +107,12 @@ export declare function defaultConfig(): Config; export declare function atofConfig(config?: AtofConfig): AtofConfig; /** Create per-agent Agent Trajectory Interchange Format (ATIF) trajectory settings with defaults applied. */ export declare function atifConfig(config?: AtifConfig): AtifConfig; -/** Create OTLP exporter settings for OpenTelemetry or OpenInference. */ -export declare function otlpConfig(config?: OtlpConfig): OtlpConfig; +/** Create one typed OpenTelemetry endpoint. */ +export declare function openTelemetryEndpoint(config: OpenTelemetryEndpointConfig): OpenTelemetryEndpointConfig; +/** Create multi-endpoint OpenTelemetry settings. */ +export declare function openTelemetryConfig( + config?: OpenTelemetrySectionConfig, +): OpenTelemetrySectionConfig; /** Wrap observability config as a top-level plugin component. */ export declare function ComponentSpec( config: Config, diff --git a/crates/node/observability.js b/crates/node/observability.js index a43d69e9c..af083385a 100644 --- a/crates/node/observability.js +++ b/crates/node/observability.js @@ -10,11 +10,11 @@ const OBSERVABILITY_PLUGIN_KIND = 'observability'; /** * Create a default observability component config. * - * @returns {object} The minimal observability config with schema version 2. + * @returns {object} The minimal observability config with schema version 3. */ function defaultConfig() { return { - version: 2, + version: 3, }; } @@ -48,22 +48,43 @@ function atifConfig(config = {}) { } /** - * Create OTLP exporter settings for OpenTelemetry or OpenInference. + * Create one typed OpenTelemetry endpoint. * - * @param {object} [config={}] - Partial OTLP settings to override. - * @returns {object} A normalized OTLP config object. + * @param {object} config - Endpoint settings including required `type` and `endpoint`. + * @returns {object} A normalized endpoint config object. */ -function otlpConfig(config = {}) { +function openTelemetryEndpoint(config) { + if (!config || typeof config !== 'object') { + throw new TypeError('OpenTelemetry endpoint config is required'); + } + if (!['full', 'gen_ai', 'openinference'].includes(config.type)) { + throw new TypeError('OpenTelemetry endpoint type must be "full", "gen_ai", or "openinference"'); + } + if (typeof config.endpoint !== 'string' || config.endpoint.trim() === '') { + throw new TypeError('OpenTelemetry endpoint must be a nonblank string'); + } return { - enabled: false, - mark_projection: 'inherit', - mark_exclude_names: ['llm.chunk'], - attribute_mappings: [], transport: 'http_binary', + service_name: 'unknown_service', + instrumentation_scope: 'opentelemetry', + timeout_millis: 3000, headers: {}, + header_env: {}, resource_attributes: {}, - service_name: 'nemo-relay', - timeout_millis: 3000, + ...config, + }; +} + +/** + * Create multi-endpoint OpenTelemetry settings. + * + * @param {object} [config={}] - Partial section settings. + * @returns {object} A normalized OpenTelemetry section. + */ +function openTelemetryConfig(config = {}) { + return { + enabled: false, + endpoints: [], ...config, }; } @@ -86,6 +107,7 @@ module.exports = { defaultConfig, atofConfig, atifConfig, - otlpConfig, + openTelemetryEndpoint, + openTelemetryConfig, ComponentSpec, }; diff --git a/crates/node/src/api/mod.rs b/crates/node/src/api/mod.rs index 1f8384fae..38540ce31 100644 --- a/crates/node/src/api/mod.rs +++ b/crates/node/src/api/mod.rs @@ -130,22 +130,6 @@ fn parse_string_map( Ok(out) } -fn parse_attribute_mappings( - value: Option>, -) -> napi::Result> { - let mappings = value - .unwrap_or_default() - .into_iter() - .map(|mapping| nemo_relay::observability::OtlpAttributeMapping { - key: mapping.key, - alias: mapping.alias, - }) - .collect::>(); - nemo_relay::observability::validate_attribute_mappings(&mappings) - .map_err(napi::Error::from_reason)?; - Ok(mappings) -} - fn otel_status_metadata(status_code: &'static str, status_message: Option) -> Json { let mut metadata = serde_json::Map::new(); metadata.insert( @@ -161,38 +145,49 @@ fn otel_status_metadata(status_code: &'static str, status_message: Option napi::Result { + match value { + "full" => Ok(nemo_relay::observability::OpenTelemetryType::Full), + "gen_ai" => Ok(nemo_relay::observability::OpenTelemetryType::GenAi), + "openinference" => Ok(nemo_relay::observability::OpenTelemetryType::OpenInference), + other => Err(napi::Error::from_reason(format!( + "type must be 'full', 'gen_ai', or 'openinference', got {other:?}", + ))), + } +} + +fn parse_otel_transport( + value: Option, +) -> napi::Result { + match value.as_deref().unwrap_or("http_binary") { + "http_binary" => Ok(nemo_relay::observability::otel::OtlpTransport::HttpBinary), + "grpc" => Ok(nemo_relay::observability::otel::OtlpTransport::Grpc), + other => Err(napi::Error::from_reason(format!( + "transport must be 'http_binary' or 'grpc', got {other:?}", + ))), + } +} + fn build_otel_config( - options: Option, + options: OpenTelemetryConfig, ) -> napi::Result { - let options = options.unwrap_or_default(); - let transport = options - .transport - .unwrap_or_else(|| "http_binary".to_string()); + let otel_type = parse_otel_type(&options.r#type)?; + let endpoint = options.endpoint; + let transport = parse_otel_transport(options.transport)?; let service_name = options .service_name - .unwrap_or_else(|| "nemo-relay".to_string()); + .unwrap_or_else(|| "unknown_service".to_string()); let instrumentation_scope = options .instrumentation_scope - .unwrap_or_else(|| "nemo-relay-otel".to_string()); + .unwrap_or_else(|| "opentelemetry".to_string()); let timeout_millis = options.timeout_millis.unwrap_or(3_000); - let mut config = match transport.as_str() { - "http_binary" => { - nemo_relay::observability::otel::OpenTelemetryConfig::http_binary(service_name) - } - "grpc" => nemo_relay::observability::otel::OpenTelemetryConfig::grpc(service_name), - other => { - return Err(napi::Error::from_reason(format!( - "transport must be 'http_binary' or 'grpc', got {other:?}", - ))); - } - } - .with_instrumentation_scope(instrumentation_scope) - .with_timeout(std::time::Duration::from_millis(timeout_millis.into())); + let mut config = nemo_relay::observability::otel::OpenTelemetryConfig::new(otel_type, endpoint) + .with_transport(transport) + .with_service_name(service_name) + .with_instrumentation_scope(instrumentation_scope) + .with_timeout(std::time::Duration::from_millis(timeout_millis.into())); - if let Some(endpoint) = options.endpoint { - config = config.with_endpoint(endpoint); - } if let Some(namespace) = options.service_namespace { config = config.with_service_namespace(namespace); } @@ -205,8 +200,6 @@ fn build_otel_config( for (key, value) in parse_string_map(options.resource_attributes, "resourceAttributes")? { config = config.with_resource_attribute(key, value); } - config = config.with_attribute_mappings(parse_attribute_mappings(options.attribute_mappings)?); - Ok(config) } @@ -277,57 +270,6 @@ fn build_atof_config( } } -fn build_openinference_config( - options: Option, -) -> napi::Result { - let options = options.unwrap_or_default(); - let transport = options - .transport - .unwrap_or_else(|| "http_binary".to_string()); - let service_name = options - .service_name - .unwrap_or_else(|| "nemo-relay".to_string()); - let instrumentation_scope = options - .instrumentation_scope - .unwrap_or_else(|| "nemo-relay-openinference".to_string()); - let timeout_millis = options.timeout_millis.unwrap_or(3_000); - - let transport = match transport.as_str() { - "http_binary" => nemo_relay::observability::openinference::OtlpTransport::HttpBinary, - "grpc" => nemo_relay::observability::openinference::OtlpTransport::Grpc, - other => { - return Err(napi::Error::from_reason(format!( - "transport must be 'http_binary' or 'grpc', got {other:?}", - ))); - } - }; - - let mut config = nemo_relay::observability::openinference::OpenInferenceConfig::new() - .with_transport(transport) - .with_service_name(service_name) - .with_instrumentation_scope(instrumentation_scope) - .with_timeout(std::time::Duration::from_millis(timeout_millis.into())); - - if let Some(endpoint) = options.endpoint { - config = config.with_endpoint(endpoint); - } - if let Some(namespace) = options.service_namespace { - config = config.with_service_namespace(namespace); - } - if let Some(version) = options.service_version { - config = config.with_service_version(version); - } - for (key, value) in parse_string_map(options.headers, "headers")? { - config = config.with_header(key, value); - } - for (key, value) in parse_string_map(options.resource_attributes, "resourceAttributes")? { - config = config.with_resource_attribute(key, value); - } - config = config.with_attribute_mappings(parse_attribute_mappings(options.attribute_mappings)?); - - Ok(config) -} - // --------------------------------------------------------------------------- // Stream channel registry — enables JS async generators to push chunks to Rust // --------------------------------------------------------------------------- @@ -4024,61 +3966,27 @@ impl AtofExporter { #[napi(object)] #[derive(Default)] pub struct OpenTelemetryConfig { + /// `"full"`, `"gen_ai"`, or `"openinference"`. + #[napi(ts_type = "\"full\" | \"gen_ai\" | \"openinference\"")] + pub r#type: String, /// `"http_binary"` (default) or `"grpc"`. pub transport: Option, /// OTLP endpoint, such as `http://localhost:4318/v1/traces`. - pub endpoint: Option, + pub endpoint: String, /// Extra exporter headers/metadata as string key/value pairs. pub headers: Option, /// Extra OpenTelemetry resource attributes as string key/value pairs. pub resource_attributes: Option, - /// `service.name` resource attribute. Defaults to `"nemo-relay"`. - pub service_name: Option, - /// Optional `service.namespace` resource attribute. - pub service_namespace: Option, - /// Optional `service.version` resource attribute. - pub service_version: Option, - /// Instrumentation scope name. Defaults to `"nemo-relay-otel"`. - pub instrumentation_scope: Option, - /// Export timeout in milliseconds. Defaults to `3000`. - pub timeout_millis: Option, - /// Typed projected attributes copied to aliases. - pub attribute_mappings: Option>, -} - -/// Typed projected attribute copy configuration. -#[napi(object)] -pub struct OtlpAttributeMapping { - /// Fully-qualified projected attribute to copy. - pub key: String, - /// Additional attribute name receiving the copied value. - pub alias: String, -} - -/// Mutable configuration object for `OpenInferenceSubscriber`. -#[napi(object)] -#[derive(Default)] -pub struct OpenInferenceConfig { - /// `"http_binary"` (default) or `"grpc"`. - pub transport: Option, - /// OTLP endpoint, such as `http://localhost:4318/v1/traces`. - pub endpoint: Option, - /// Extra exporter headers/metadata as string key/value pairs. - pub headers: Option, - /// Extra OpenInference resource attributes as string key/value pairs. - pub resource_attributes: Option, - /// `service.name` resource attribute. Defaults to `"nemo-relay"`. + /// `service.name` resource attribute. Defaults to `"unknown_service"`. pub service_name: Option, /// Optional `service.namespace` resource attribute. pub service_namespace: Option, /// Optional `service.version` resource attribute. pub service_version: Option, - /// Instrumentation scope name. Defaults to `"nemo-relay-openinference"`. + /// Instrumentation scope name. Defaults to `"opentelemetry"`. pub instrumentation_scope: Option, /// Export timeout in milliseconds. Defaults to `3000`. pub timeout_millis: Option, - /// Typed projected attributes copied to aliases. - pub attribute_mappings: Option>, } /// OpenTelemetry-backed event subscriber. @@ -4091,7 +3999,7 @@ pub struct OpenTelemetrySubscriber { impl OpenTelemetrySubscriber { /// Create a new OpenTelemetry subscriber from a config object. #[napi(constructor)] - pub fn new(config: Option) -> napi::Result { + pub fn new(config: OpenTelemetryConfig) -> napi::Result { let inner = nemo_relay::observability::otel::OpenTelemetrySubscriber::new( build_otel_config(config)?, ) @@ -4132,57 +4040,6 @@ impl OpenTelemetrySubscriber { } } -/// OpenInference-backed event subscriber. -#[napi] -pub struct OpenInferenceSubscriber { - inner: nemo_relay::observability::openinference::OpenInferenceSubscriber, -} - -#[napi] -impl OpenInferenceSubscriber { - /// Create a new OpenInference subscriber from a config object. - #[napi(constructor)] - pub fn new(config: Option) -> napi::Result { - let inner = nemo_relay::observability::openinference::OpenInferenceSubscriber::new( - build_openinference_config(config)?, - ) - .map_err(|e| napi::Error::from_reason(e.to_string()))?; - Ok(Self { inner }) - } - - /// Register this subscriber globally with the given name. - #[napi] - pub fn register(&self, name: String) -> napi::Result<()> { - self.inner - .register(&name) - .map_err(|e| napi::Error::from_reason(e.to_string())) - } - - /// Deregister a subscriber by name. - #[napi] - pub fn deregister(&self, name: String) -> napi::Result { - self.inner - .deregister(&name) - .map_err(|e| napi::Error::from_reason(e.to_string())) - } - - /// Force a flush of finished spans through the exporter. - #[napi] - pub fn force_flush(&self) -> napi::Result<()> { - self.inner - .force_flush() - .map_err(|e| napi::Error::from_reason(e.to_string())) - } - - /// Shut down the underlying tracer provider. - #[napi] - pub fn shutdown(&self) -> napi::Result<()> { - self.inner - .shutdown() - .map_err(|e| napi::Error::from_reason(e.to_string())) - } -} - #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] struct CacheTelemetryOptions { diff --git a/crates/node/tests/observability_plugin_tests.mjs b/crates/node/tests/observability_plugin_tests.mjs index 99b8d9f84..59e5d477c 100644 --- a/crates/node/tests/observability_plugin_tests.mjs +++ b/crates/node/tests/observability_plugin_tests.mjs @@ -19,7 +19,7 @@ function tempDir(prefix) { describe('observability plugin helpers', () => { it('builds defaults and plugin component shape', () => { - assert.deepEqual(observability.defaultConfig(), { version: 2 }); + assert.deepEqual(observability.defaultConfig(), { version: 3 }); assert.deepEqual(observability.atofConfig(), { enabled: false }); assert.deepEqual(observability.atifConfig(), { enabled: false, @@ -27,31 +27,50 @@ describe('observability plugin helpers', () => { model_name: 'unknown', filename_template: 'nemo-relay-atif-{session_id}.json', }); - assert.deepEqual(observability.otlpConfig(), { + assert.deepEqual(observability.openTelemetryConfig(), { enabled: false, - mark_projection: 'inherit', - mark_exclude_names: ['llm.chunk'], - attribute_mappings: [], - transport: 'http_binary', - headers: {}, - resource_attributes: {}, - service_name: 'nemo-relay', - timeout_millis: 3000, + endpoints: [], }); - assert.equal(observability.otlpConfig({ mark_projection: 'tool' }).mark_projection, 'tool'); + assert.deepEqual( + observability.openTelemetryEndpoint({ + type: 'gen_ai', + endpoint: 'http://localhost:4318/v1/traces', + header_env: { authorization: 'OTEL_AUTHORIZATION' }, + }), + { + type: 'gen_ai', + endpoint: 'http://localhost:4318/v1/traces', + transport: 'http_binary', + headers: {}, + header_env: { authorization: 'OTEL_AUTHORIZATION' }, + resource_attributes: {}, + service_name: 'unknown_service', + instrumentation_scope: 'opentelemetry', + timeout_millis: 3000, + }, + ); - const component = observability.ComponentSpec({ version: 2, atof: observability.atofConfig() }); + const component = observability.ComponentSpec({ version: 3, atof: observability.atofConfig() }); assert.equal(component.kind, observability.OBSERVABILITY_PLUGIN_KIND); assert.equal(component.enabled, true); }); it('lists builtin observability kind and validates bad values', () => { + assert.throws(() => observability.openTelemetryEndpoint(), /config is required/); + assert.throws( + () => observability.openTelemetryEndpoint({ type: 'invalid', endpoint: 'http://localhost' }), + /type must be/, + ); + assert.throws( + () => observability.openTelemetryEndpoint({ type: 'full', endpoint: ' ' }), + /nonblank/, + ); assert.equal(plugin.listKinds().includes(observability.OBSERVABILITY_PLUGIN_KIND), true); const report = plugin.validate({ version: 1, components: [ observability.ComponentSpec({ - version: 2, + version: 3, atof: observability.atofConfig({ sinks: [{ type: 'file', mode: 'bad' }] }), atif: observability.atifConfig({ filename_template: 'missing-placeholder.json' }), }), @@ -114,7 +133,7 @@ describe('observability plugin helpers', () => { it('activates ATOF and ATIF file sinks', async () => { const outputDirectory = tempDir('node-observability-plugin'); const config = { - version: 2, + version: 3, atof: observability.atofConfig({ enabled: true, sinks: [{ type: 'file', output_directory: outputDirectory, filename: 'events.jsonl', mode: 'overwrite' }], @@ -166,7 +185,7 @@ describe('observability plugin helpers', () => { it('splits ATIF files for multiple top-level agent scopes', async () => { const outputDirectory = tempDir('node-observability-plugin-multi-agent'); const config = { - version: 2, + version: 3, atif: observability.atifConfig({ enabled: true, output_directory: outputDirectory, diff --git a/crates/node/tests/openinference_tests.mjs b/crates/node/tests/openinference_tests.mjs index a5f3d7f11..1b0797041 100644 --- a/crates/node/tests/openinference_tests.mjs +++ b/crates/node/tests/openinference_tests.mjs @@ -4,10 +4,10 @@ import { describe, it } from 'node:test'; import assert from 'node:assert/strict'; import { createRequire } from 'node:module'; -import { assertOtlpStringAttribute, startCollector } from '../../../scripts/test-support/otel_test_utils.mjs'; +import { startCollector } from '../../../scripts/test-support/otel_test_utils.mjs'; const require = createRequire(import.meta.url); -const { OpenInferenceSubscriber, ScopeType, pushScope, popScope, event } = require('../index.js'); +const { OpenTelemetrySubscriber, ScopeType, pushScope, popScope, event } = require('../index.js'); function unique(prefix) { return `${prefix}_${Date.now()}_${Math.random().toString(16).slice(2)}`; @@ -17,9 +17,10 @@ function assertBodyContains(body, text) { assert.equal(body.includes(Buffer.from(text, 'utf8')), true, `expected OTLP payload to contain ${text}`); } -describe('OpenInferenceSubscriber', () => { +describe('OpenTelemetrySubscriber openinference projection', () => { it('constructs from a mutable config object and supports lifecycle methods', () => { - const subscriber = new OpenInferenceSubscriber({ + const subscriber = new OpenTelemetrySubscriber({ + type: 'openinference', endpoint: 'http://localhost:4318/v1/traces', serviceName: 'node-agent', serviceNamespace: 'agents', @@ -32,7 +33,6 @@ describe('OpenInferenceSubscriber', () => { resourceAttributes: { 'deployment.environment': 'test', }, - attributeMappings: [{ key: 'openinference.metadata.tenant', alias: 'tenant.id' }], }); const name = unique('node_openinference'); @@ -46,14 +46,18 @@ describe('OpenInferenceSubscriber', () => { it('rejects invalid config values', () => { assert.throws( () => - new OpenInferenceSubscriber({ + new OpenTelemetrySubscriber({ + type: 'openinference', + endpoint: 'http://localhost:4318/v1/traces', transport: 'invalid', }), /transport must be/i, ); assert.throws( () => - new OpenInferenceSubscriber({ + new OpenTelemetrySubscriber({ + type: 'openinference', + endpoint: 'http://localhost:4318/v1/traces', headers: { authorization: 1, }, @@ -62,28 +66,23 @@ describe('OpenInferenceSubscriber', () => { ); assert.throws( () => - new OpenInferenceSubscriber({ + new OpenTelemetrySubscriber({ + type: 'openinference', + endpoint: 'http://localhost:4318/v1/traces', resourceAttributes: { env: 1, }, }), /resourceAttributes must be an object of string values/i, ); - assert.throws( - () => - new OpenInferenceSubscriber({ - attributeMappings: [{ key: '', alias: 'tenant.id' }], - }), - /attribute mapping key must not be blank/i, - ); }); it('exports scope push/pop and mark events end to end', async () => { const collector = await startCollector(); - const subscriber = new OpenInferenceSubscriber({ + const subscriber = new OpenTelemetrySubscriber({ + type: 'openinference', endpoint: collector.endpoint, serviceName: 'node-agent', - attributeMappings: [{ key: 'openinference.metadata.tenant', alias: 'tenant.id' }], }); const name = unique('node_openinference_e2e'); @@ -111,7 +110,6 @@ describe('OpenInferenceSubscriber', () => { assertBodyContains(request.body, 'AGENT'); assertBodyContains(request.body, 'metadata'); assertBodyContains(request.body, 'openinference_mark'); - assertOtlpStringAttribute(request.body, 'tenant.id', 'node'); } finally { subscriber.deregister(name); subscriber.shutdown(); diff --git a/crates/node/tests/otel_tests.mjs b/crates/node/tests/otel_tests.mjs index 9144178b6..f690129d8 100644 --- a/crates/node/tests/otel_tests.mjs +++ b/crates/node/tests/otel_tests.mjs @@ -4,7 +4,7 @@ import { describe, it } from 'node:test'; import assert from 'node:assert/strict'; import { createRequire } from 'node:module'; -import { assertOtlpStringAttribute, startCollector } from '../../../scripts/test-support/otel_test_utils.mjs'; +import { startCollector } from '../../../scripts/test-support/otel_test_utils.mjs'; const require = createRequire(import.meta.url); const { OpenTelemetrySubscriber, ScopeType, pushScope, popScope, event } = require('../index.js'); @@ -20,6 +20,7 @@ function assertBodyContains(body, text) { describe('OpenTelemetrySubscriber', () => { it('constructs from a mutable config object and supports lifecycle methods', () => { const subscriber = new OpenTelemetrySubscriber({ + type: 'full', endpoint: 'http://localhost:4318/v1/traces', serviceName: 'node-agent', serviceNamespace: 'agents', @@ -32,7 +33,6 @@ describe('OpenTelemetrySubscriber', () => { resourceAttributes: { 'deployment.environment': 'test', }, - attributeMappings: [{ key: 'nemo_relay.start.data.tenant', alias: 'tenant.id' }], }); const name = uniqueId('node_otel'); @@ -47,6 +47,8 @@ describe('OpenTelemetrySubscriber', () => { assert.throws( () => new OpenTelemetrySubscriber({ + type: 'full', + endpoint: 'http://localhost:4318/v1/traces', transport: 'invalid', }), /transport must be/i, @@ -54,6 +56,8 @@ describe('OpenTelemetrySubscriber', () => { assert.throws( () => new OpenTelemetrySubscriber({ + type: 'full', + endpoint: 'http://localhost:4318/v1/traces', headers: { authorization: 1, }, @@ -63,27 +67,42 @@ describe('OpenTelemetrySubscriber', () => { assert.throws( () => new OpenTelemetrySubscriber({ + type: 'full', + endpoint: 'http://localhost:4318/v1/traces', resourceAttributes: { env: 1, }, }), /resourceAttributes must be an object of string values/i, ); + assert.throws( + () => new OpenTelemetrySubscriber({ endpoint: 'http://localhost:4318' }), + /missing field `type`/i, + ); + assert.throws( + () => new OpenTelemetrySubscriber({ type: 'full' }), + /missing field `endpoint`/i, + ); assert.throws( () => new OpenTelemetrySubscriber({ - attributeMappings: [{ key: '', alias: 'tenant.id' }], + type: 'invalid', + endpoint: 'http://localhost:4318/v1/traces', }), - /attribute mapping key must not be blank/i, + /type must be/i, + ); + assert.throws( + () => new OpenTelemetrySubscriber({ type: 'full', endpoint: ' \t' }), + /endpoint must be a nonblank string/i, ); }); it('exports scope push/pop and mark events end to end', async () => { const collector = await startCollector(); const subscriber = new OpenTelemetrySubscriber({ + type: 'full', endpoint: collector.endpoint, serviceName: 'node-agent', - attributeMappings: [{ key: 'nemo_relay.mark.metadata.source', alias: 'tenant.id' }], }); const name = uniqueId('node_otel_e2e'); @@ -107,7 +126,33 @@ describe('OpenTelemetrySubscriber', () => { assert.equal(request.url, '/v1/traces'); assert.equal(request.headers['content-type'], 'application/x-protobuf'); assert.ok(request.body.length > 0); - assertOtlpStringAttribute(request.body, 'tenant.id', 'node'); + assertBodyContains(request.body, 'nemo_relay.mark.metadata.source'); + } finally { + subscriber.deregister(name); + subscriber.shutdown(); + await collector.close(); + } + }); + + it('exports the GenAI agent projection end to end', async () => { + const collector = await startCollector(); + const subscriber = new OpenTelemetrySubscriber({ + type: 'gen_ai', + endpoint: collector.endpoint, + }); + + const name = uniqueId('node_gen_ai_e2e'); + subscriber.register(name); + try { + const scope = pushScope('research-agent', ScopeType.Agent, null, null, null, null); + popScope(scope); + + subscriber.forceFlush(); + const request = await collector.nextRequest(); + assert.equal(request.url, '/v1/traces'); + assertBodyContains(request.body, 'invoke_agent research-agent'); + assertBodyContains(request.body, 'gen_ai.operation.name'); + assert.equal(request.body.includes(Buffer.from('nemo_relay.', 'utf8')), false); } finally { subscriber.deregister(name); subscriber.shutdown(); diff --git a/crates/pii-redaction/Cargo.toml b/crates/pii-redaction/Cargo.toml index 006a45b59..ce14ce3b3 100644 --- a/crates/pii-redaction/Cargo.toml +++ b/crates/pii-redaction/Cargo.toml @@ -27,7 +27,7 @@ sha2 = "0.11" schemars = { version = "0.8", optional = true } [dev-dependencies] -nemo-relay = { workspace = true, features = ["openinference", "otel"] } +nemo-relay.workspace = true futures = "0.3" tokio = { version = "1", features = ["rt", "macros", "sync", "test-util", "rt-multi-thread", "time"] } opentelemetry_sdk = { workspace = true, features = ["trace", "testing"] } diff --git a/crates/pii-redaction/tests/unit/component_tests.rs b/crates/pii-redaction/tests/unit/component_tests.rs index cd7ad4026..0c6e9041c 100644 --- a/crates/pii-redaction/tests/unit/component_tests.rs +++ b/crates/pii-redaction/tests/unit/component_tests.rs @@ -34,9 +34,9 @@ use crate::plugin::{ list_plugin_kinds, rollback_registrations, validate_plugin_config, }; use futures::StreamExt; +use nemo_relay::observability::OpenTelemetryType; use nemo_relay::observability::atif::{AtifAgentInfo, AtifExporter}; use nemo_relay::observability::atof::{AtofExporter, AtofExporterConfig}; -use nemo_relay::observability::openinference::OpenInferenceSubscriber; use nemo_relay::observability::otel::OpenTelemetrySubscriber; use opentelemetry_sdk::trace::{InMemorySpanExporterBuilder, SdkTracerProvider}; use serde_json::json; @@ -2060,8 +2060,11 @@ fn sanitized_trajectory_content_never_reaches_subscribers_or_exporters() { let openinference_provider = SdkTracerProvider::builder() .with_simple_exporter(openinference_exporter.clone()) .build(); - let openinference = - OpenInferenceSubscriber::from_tracer_provider(openinference_provider, "pii-regression"); + let openinference = OpenTelemetrySubscriber::from_tracer_provider_with_type( + openinference_provider, + "pii-regression", + OpenTelemetryType::OpenInference, + ); openinference .register("pii-regression-openinference") .unwrap(); diff --git a/crates/python/Cargo.toml b/crates/python/Cargo.toml index eda92b5fc..693ca3a99 100644 --- a/crates/python/Cargo.toml +++ b/crates/python/Cargo.toml @@ -18,7 +18,7 @@ name = "_native" crate-type = ["cdylib", "rlib"] [dependencies] -nemo-relay = { workspace = true, features = ["atof-streaming", "guardrails-remote", "object-store", "otel", "openinference", "worker-grpc"] } +nemo-relay = { workspace = true, features = ["atof-streaming", "guardrails-remote", "object-store", "worker-grpc"] } nemo-relay-adaptive = { workspace = true, features = ["redis-backend"] } nemo-relay-pii-redaction.workspace = true pyo3 = { version = "0.29.0", features = ["abi3", "abi3-py311", "experimental-inspect", "macros"] } diff --git a/crates/python/src/py_types/mod.rs b/crates/python/src/py_types/mod.rs index eb60374d9..cdeb39c29 100644 --- a/crates/python/src/py_types/mod.rs +++ b/crates/python/src/py_types/mod.rs @@ -177,8 +177,6 @@ fn register_observability_types(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_class::()?; m.add_class::()?; m.add_class::()?; - m.add_class::()?; - m.add_class::()?; Ok(()) } diff --git a/crates/python/src/py_types/observability.rs b/crates/python/src/py_types/observability.rs index f021f8e49..2a24673a5 100644 --- a/crates/python/src/py_types/observability.rs +++ b/crates/python/src/py_types/observability.rs @@ -14,21 +14,6 @@ use super::{ FORCE_ATIF_EXPORT_JSON_SERIALIZATION_ERROR, FORCE_ATIF_EXPORT_VALUE_SERIALIZATION_ERROR, }; -fn py_attribute_mappings( - value: &Bound<'_, PyAny>, -) -> PyResult> { - let value = py_to_json(value)?; - let mappings: Vec = - serde_json::from_value(value).map_err(|error| { - pyo3::exceptions::PyValueError::new_err(format!( - "attribute_mappings must be a list of {{key: str, alias: str}} objects: {error}" - )) - })?; - nemo_relay::observability::validate_attribute_mappings(&mappings) - .map_err(pyo3::exceptions::PyValueError::new_err)?; - Ok(mappings) -} - // --------------------------------------------------------------------------- // AtifExporter // --------------------------------------------------------------------------- @@ -425,17 +410,17 @@ impl PyAtofExporter { /// /// Example: /// ```python -/// config = OpenTelemetryConfig() -/// config.endpoint = "http://localhost:4318/v1/traces" +/// config = OpenTelemetryConfig("full", "http://localhost:4318/v1/traces") /// config.service_name = "demo-agent" -/// config.headers = {"authorization": "Bearer token"} /// ``` #[pyclass(name = "OpenTelemetryConfig")] pub struct PyOpenTelemetryConfig { + #[pyo3(get, set)] + pub(crate) otel_type: String, #[pyo3(get, set)] pub(crate) transport: String, #[pyo3(get, set)] - pub(crate) endpoint: Option, + pub(crate) endpoint: String, #[pyo3(get, set)] pub(crate) service_name: String, #[pyo3(get, set)] @@ -448,32 +433,45 @@ pub struct PyOpenTelemetryConfig { pub(crate) timeout_millis: u64, pub(crate) headers: HashMap, pub(crate) resource_attributes: HashMap, - pub(crate) attribute_mappings: Vec, } impl PyOpenTelemetryConfig { pub(crate) fn to_rust_config( &self, ) -> PyResult { - let mut config = match self.transport.as_str() { - "http_binary" => nemo_relay::observability::otel::OpenTelemetryConfig::http_binary( - self.service_name.clone(), - ), - "grpc" => nemo_relay::observability::otel::OpenTelemetryConfig::grpc( - self.service_name.clone(), - ), + let otel_type = match self.otel_type.as_str() { + "full" => nemo_relay::observability::OpenTelemetryType::Full, + "gen_ai" => nemo_relay::observability::OpenTelemetryType::GenAi, + "openinference" => nemo_relay::observability::OpenTelemetryType::OpenInference, other => { return Err(pyo3::exceptions::PyValueError::new_err(format!( - "transport must be 'http_binary' or 'grpc', got {other:?}" + "type must be 'full', 'gen_ai', or 'openinference', got {other:?}" ))); } + }; + if self.endpoint.trim().is_empty() { + return Err(pyo3::exceptions::PyValueError::new_err( + "endpoint is required and must be nonblank", + )); } + let transport = match self.transport.as_str() { + "http_binary" => nemo_relay::observability::otel::OtlpTransport::HttpBinary, + "grpc" => nemo_relay::observability::otel::OtlpTransport::Grpc, + other => { + return Err(pyo3::exceptions::PyValueError::new_err(format!( + "transport must be 'http_binary' or 'grpc', got {other:?}" + ))); + } + }; + let mut config = nemo_relay::observability::otel::OpenTelemetryConfig::new( + otel_type, + self.endpoint.clone(), + ) + .with_transport(transport) + .with_service_name(self.service_name.clone()) .with_instrumentation_scope(self.instrumentation_scope.clone()) .with_timeout(Duration::from_millis(self.timeout_millis)); - if let Some(endpoint) = &self.endpoint { - config = config.with_endpoint(endpoint.clone()); - } if let Some(namespace) = &self.service_namespace { config = config.with_service_namespace(namespace.clone()); } @@ -486,7 +484,6 @@ impl PyOpenTelemetryConfig { for (key, value) in &self.resource_attributes { config = config.with_resource_attribute(key.clone(), value.clone()); } - config = config.with_attribute_mappings(self.attribute_mappings.clone()); Ok(config) } } @@ -494,18 +491,18 @@ impl PyOpenTelemetryConfig { #[pymethods] impl PyOpenTelemetryConfig { #[new] - pub(crate) fn new() -> Self { + pub(crate) fn new(otel_type: String, endpoint: String) -> Self { Self { + otel_type, transport: "http_binary".to_string(), - endpoint: None, - service_name: "nemo-relay".to_string(), + endpoint, + service_name: "unknown_service".to_string(), service_namespace: None, service_version: None, - instrumentation_scope: "nemo-relay-otel".to_string(), + instrumentation_scope: "opentelemetry".to_string(), timeout_millis: 3_000, headers: HashMap::new(), resource_attributes: HashMap::new(), - attribute_mappings: Vec::new(), } } @@ -537,23 +534,6 @@ impl PyOpenTelemetryConfig { Ok(()) } - #[getter] - pub(crate) fn attribute_mappings(&self, py: Python<'_>) -> PyResult> { - json_to_py( - py, - &serde_json::to_value(&self.attribute_mappings).unwrap_or_default(), - ) - } - - #[setter] - pub(crate) fn set_attribute_mappings( - &mut self, - attribute_mappings: &Bound<'_, PyAny>, - ) -> PyResult<()> { - self.attribute_mappings = py_attribute_mappings(attribute_mappings)?; - Ok(()) - } - pub(crate) fn set_header(&mut self, key: String, value: String) { self.headers.insert(key, value); } @@ -577,229 +557,30 @@ impl PyOpenTelemetryConfig { #[pyclass(name = "OpenTelemetrySubscriber")] pub struct PyOpenTelemetrySubscriber { inner: nemo_relay::observability::otel::OpenTelemetrySubscriber, + owned_runtime: Option, } #[pymethods] impl PyOpenTelemetrySubscriber { #[new] pub(crate) fn new(config: PyRef<'_, PyOpenTelemetryConfig>) -> PyResult { - let inner = - nemo_relay::observability::otel::OpenTelemetrySubscriber::new(config.to_rust_config()?) - .map_err(|e| pyo3::exceptions::PyRuntimeError::new_err(e.to_string()))?; - Ok(Self { inner }) - } - - /// Register this subscriber globally with the given name. - pub(crate) fn register(&self, name: String) -> PyResult<()> { - self.inner - .register(&name) - .map_err(|e| pyo3::exceptions::PyRuntimeError::new_err(e.to_string())) - } - - /// Deregister a subscriber by name. Returns ``True`` if found. - pub(crate) fn deregister(&self, name: String) -> PyResult { - self.inner - .deregister(&name) - .map_err(|e| pyo3::exceptions::PyRuntimeError::new_err(e.to_string())) - } - - /// Force a flush of finished spans through the exporter. - pub(crate) fn force_flush(&self, py: Python<'_>) -> PyResult<()> { - py.detach(|| self.inner.force_flush()) - .map_err(|e| pyo3::exceptions::PyRuntimeError::new_err(e.to_string())) - } - - /// Shut down the underlying tracer provider. - pub(crate) fn shutdown(&self, py: Python<'_>) -> PyResult<()> { - py.detach(|| self.inner.shutdown()) - .map_err(|e| pyo3::exceptions::PyRuntimeError::new_err(e.to_string())) - } - - pub(crate) fn __repr__(&self) -> String { - "".to_string() - } -} - -/// Mutable config object for ``OpenInferenceSubscriber``. -/// -/// Example: -/// ```python -/// config = OpenInferenceConfig() -/// config.endpoint = "http://localhost:4318/v1/traces" -/// config.service_name = "demo-agent" -/// config.headers = {"authorization": "Bearer token"} -/// ``` -#[pyclass(name = "OpenInferenceConfig")] -pub struct PyOpenInferenceConfig { - #[pyo3(get, set)] - pub(crate) transport: String, - #[pyo3(get, set)] - pub(crate) endpoint: Option, - #[pyo3(get, set)] - pub(crate) service_name: String, - #[pyo3(get, set)] - pub(crate) service_namespace: Option, - #[pyo3(get, set)] - pub(crate) service_version: Option, - #[pyo3(get, set)] - pub(crate) instrumentation_scope: String, - #[pyo3(get, set)] - pub(crate) timeout_millis: u64, - pub(crate) headers: HashMap, - pub(crate) resource_attributes: HashMap, - pub(crate) attribute_mappings: Vec, -} - -impl PyOpenInferenceConfig { - pub(crate) fn to_rust_config( - &self, - ) -> PyResult { - let transport = match self.transport.as_str() { - "http_binary" => nemo_relay::observability::openinference::OtlpTransport::HttpBinary, - "grpc" => nemo_relay::observability::openinference::OtlpTransport::Grpc, - other => { - return Err(pyo3::exceptions::PyValueError::new_err(format!( - "transport must be 'http_binary' or 'grpc', got {other:?}" - ))); - } - }; - - let mut config = nemo_relay::observability::openinference::OpenInferenceConfig::new() - .with_transport(transport) - .with_service_name(self.service_name.clone()) - .with_instrumentation_scope(self.instrumentation_scope.clone()) - .with_timeout(Duration::from_millis(self.timeout_millis)); - - if let Some(endpoint) = &self.endpoint { - config = config.with_endpoint(endpoint.clone()); - } - if let Some(namespace) = &self.service_namespace { - config = config.with_service_namespace(namespace.clone()); - } - if let Some(version) = &self.service_version { - config = config.with_service_version(version.clone()); - } - for (key, value) in &self.headers { - config = config.with_header(key.clone(), value.clone()); - } - for (key, value) in &self.resource_attributes { - config = config.with_resource_attribute(key.clone(), value.clone()); - } - config = config.with_attribute_mappings(self.attribute_mappings.clone()); - Ok(config) - } -} - -#[pymethods] -impl PyOpenInferenceConfig { - #[new] - pub(crate) fn new() -> Self { - Self { - transport: "http_binary".to_string(), - endpoint: None, - service_name: "nemo-relay".to_string(), - service_namespace: None, - service_version: None, - instrumentation_scope: "nemo-relay-openinference".to_string(), - timeout_millis: 3_000, - headers: HashMap::new(), - resource_attributes: HashMap::new(), - attribute_mappings: Vec::new(), - } - } - - #[getter] - pub(crate) fn headers(&self, py: Python<'_>) -> PyResult> { - json_to_py(py, &serde_json::to_value(&self.headers).unwrap_or_default()) - } - - #[setter] - pub(crate) fn set_headers(&mut self, headers: &Bound<'_, PyAny>) -> PyResult<()> { - self.headers = py_string_map(headers, "headers")?; - Ok(()) - } - - #[getter] - pub(crate) fn resource_attributes(&self, py: Python<'_>) -> PyResult> { - json_to_py( - py, - &serde_json::to_value(&self.resource_attributes).unwrap_or_default(), - ) - } - - #[setter] - pub(crate) fn set_resource_attributes( - &mut self, - resource_attributes: &Bound<'_, PyAny>, - ) -> PyResult<()> { - self.resource_attributes = py_string_map(resource_attributes, "resource_attributes")?; - Ok(()) - } - - #[getter] - pub(crate) fn attribute_mappings(&self, py: Python<'_>) -> PyResult> { - json_to_py( - py, - &serde_json::to_value(&self.attribute_mappings).unwrap_or_default(), - ) - } - - #[setter] - pub(crate) fn set_attribute_mappings( - &mut self, - attribute_mappings: &Bound<'_, PyAny>, - ) -> PyResult<()> { - self.attribute_mappings = py_attribute_mappings(attribute_mappings)?; - Ok(()) - } - - pub(crate) fn set_header(&mut self, key: String, value: String) { - self.headers.insert(key, value); - } - - pub(crate) fn set_resource_attribute(&mut self, key: String, value: String) { - self.resource_attributes.insert(key, value); - } - - pub(crate) fn __repr__(&self) -> String { - format!( - "", - self.transport, self.endpoint - ) - } -} - -/// OpenInference-backed event subscriber. -#[pyclass(name = "OpenInferenceSubscriber")] -pub struct PyOpenInferenceSubscriber { - inner: nemo_relay::observability::openinference::OpenInferenceSubscriber, - owned_runtime: Option, -} - -#[pymethods] -impl PyOpenInferenceSubscriber { - #[new] - pub(crate) fn new(config: PyRef<'_, PyOpenInferenceConfig>) -> PyResult { let rust_config = config.to_rust_config()?; let needs_owned_runtime = config.transport == "grpc" && Handle::try_current().is_err(); - if needs_owned_runtime { let runtime = tokio::runtime::Builder::new_multi_thread() .enable_all() .build() .map_err(|e| pyo3::exceptions::PyRuntimeError::new_err(e.to_string()))?; let _guard = runtime.enter(); - let inner = - nemo_relay::observability::openinference::OpenInferenceSubscriber::new(rust_config) - .map_err(|e| pyo3::exceptions::PyRuntimeError::new_err(e.to_string()))?; + let inner = nemo_relay::observability::otel::OpenTelemetrySubscriber::new(rust_config) + .map_err(|e| pyo3::exceptions::PyRuntimeError::new_err(e.to_string()))?; Ok(Self { inner, owned_runtime: Some(runtime), }) } else { - let inner = - nemo_relay::observability::openinference::OpenInferenceSubscriber::new(rust_config) - .map_err(|e| pyo3::exceptions::PyRuntimeError::new_err(e.to_string()))?; + let inner = nemo_relay::observability::otel::OpenTelemetrySubscriber::new(rust_config) + .map_err(|e| pyo3::exceptions::PyRuntimeError::new_err(e.to_string()))?; Ok(Self { inner, owned_runtime: None, @@ -807,6 +588,7 @@ impl PyOpenInferenceSubscriber { } } + /// Register this subscriber globally with the given name. pub(crate) fn register(&self, name: String) -> PyResult<()> { self.with_runtime_context(|| { self.inner @@ -815,6 +597,7 @@ impl PyOpenInferenceSubscriber { }) } + /// Deregister a subscriber by name. Returns ``True`` if found. pub(crate) fn deregister(&self, name: String) -> PyResult { self.with_runtime_context(|| { self.inner @@ -823,6 +606,7 @@ impl PyOpenInferenceSubscriber { }) } + /// Force a flush of finished spans through the exporter. pub(crate) fn force_flush(&self, py: Python<'_>) -> PyResult<()> { py.detach(|| { self.with_runtime_context(|| { @@ -833,6 +617,7 @@ impl PyOpenInferenceSubscriber { }) } + /// Shut down the underlying tracer provider. pub(crate) fn shutdown(&self, py: Python<'_>) -> PyResult<()> { py.detach(|| { self.with_runtime_context(|| { @@ -844,11 +629,11 @@ impl PyOpenInferenceSubscriber { } pub(crate) fn __repr__(&self) -> String { - "".to_string() + "".to_string() } } -impl PyOpenInferenceSubscriber { +impl PyOpenTelemetrySubscriber { fn with_runtime_context(&self, f: impl FnOnce() -> PyResult) -> PyResult { if let Some(runtime) = &self.owned_runtime { let _guard = runtime.enter(); diff --git a/crates/python/tests/coverage/py_types_coverage_tests.rs b/crates/python/tests/coverage/py_types_coverage_tests.rs index 11d2fdd9d..038632356 100644 --- a/crates/python/tests/coverage/py_types_coverage_tests.rs +++ b/crates/python/tests/coverage/py_types_coverage_tests.rs @@ -74,8 +74,8 @@ fn test_register_exposes_all_type_bindings() { assert!(module.getattr("ScopeEvent").is_ok()); assert!(module.getattr("MarkEvent").is_ok()); assert!(module.getattr("AtifExporter").is_ok()); - assert!(module.getattr("OpenInferenceConfig").is_ok()); - assert!(module.getattr("OpenInferenceSubscriber").is_ok()); + assert!(module.getattr("OpenInferenceConfig").is_err()); + assert!(module.getattr("OpenInferenceSubscriber").is_err()); assert!(module.getattr("OpenTelemetryConfig").is_ok()); assert!(module.getattr("OpenTelemetrySubscriber").is_ok()); assert!(module.getattr("OpenAIChatCodec").is_ok()); @@ -382,8 +382,8 @@ fn test_atif_exporter_methods_cover_register_export_and_clear() { fn test_open_telemetry_config_and_subscriber_cover_lifecycle() { let _python = crate::test_support::init_python_test(); Python::attach(|py| { - let mut config = PyOpenTelemetryConfig::new(); - config.endpoint = Some("http://localhost:4318/v1/traces".into()); + let mut config = + PyOpenTelemetryConfig::new("full".into(), "http://localhost:4318/v1/traces".into()); config.service_name = "py-agent".into(); config.service_namespace = Some("agents".into()); config.service_version = Some("1.0.0".into()); @@ -418,13 +418,24 @@ fn test_open_telemetry_config_and_subscriber_cover_lifecycle() { fn test_open_telemetry_config_rejects_invalid_inputs() { let _python = crate::test_support::init_python_test(); Python::attach(|py| { - let mut config = PyOpenTelemetryConfig::new(); + let mut config = + PyOpenTelemetryConfig::new("full".into(), "http://localhost:4318/v1/traces".into()); let bad_headers = PyList::empty(py); assert!(config.set_headers(&bad_headers.into_any()).is_err()); let bad_attrs = json_to_py(py, &json!({"env": 1})).unwrap(); assert!(config.set_resource_attributes(bad_attrs.bind(py)).is_err()); + config.otel_type = "invalid".into(); + let err = config.to_rust_config().unwrap_err(); + assert!(err.to_string().contains("type must be")); + + config.otel_type = "full".into(); + config.endpoint = " ".into(); + let err = config.to_rust_config().unwrap_err(); + assert!(err.to_string().contains("endpoint is required")); + + config.endpoint = "http://localhost:4318/v1/traces".into(); config.transport = "invalid".into(); let err = config.to_rust_config().unwrap_err(); assert!(err.to_string().contains("transport must be")); @@ -432,11 +443,13 @@ fn test_open_telemetry_config_rejects_invalid_inputs() { } #[test] -fn test_open_inference_config_and_subscriber_cover_lifecycle() { +fn test_openinference_typed_otel_config_and_subscriber_cover_lifecycle() { let _python = crate::test_support::init_python_test(); Python::attach(|py| { - let mut config = PyOpenInferenceConfig::new(); - config.endpoint = Some("http://localhost:4318/v1/traces".into()); + let mut config = PyOpenTelemetryConfig::new( + "openinference".into(), + "http://localhost:4318/v1/traces".into(), + ); config.service_name = "py-agent".into(); config.service_namespace = Some("agents".into()); config.service_version = Some("1.0.0".into()); @@ -445,7 +458,7 @@ fn test_open_inference_config_and_subscriber_cover_lifecycle() { config.set_header("authorization".into(), "Bearer token".into()); config.set_resource_attribute("deployment.environment".into(), "test".into()); - assert!(config.__repr__().contains("OpenInferenceConfig")); + assert!(config.__repr__().contains("OpenTelemetryConfig")); assert_eq!( py_to_json(config.headers(py).unwrap().bind(py)).unwrap(), json!({"authorization": "Bearer token"}) @@ -456,22 +469,25 @@ fn test_open_inference_config_and_subscriber_cover_lifecycle() { ); let config = pyo3::Py::new(py, config).unwrap(); - let subscriber = PyOpenInferenceSubscriber::new(config.bind(py).borrow()).unwrap(); + let subscriber = PyOpenTelemetrySubscriber::new(config.bind(py).borrow()).unwrap(); let subscriber_name = format!("py_openinference_{}", Uuid::now_v7().simple()); subscriber.register(subscriber_name.clone()).unwrap(); assert!(subscriber.deregister(subscriber_name.clone()).unwrap()); assert!(!subscriber.deregister(subscriber_name).unwrap()); subscriber.force_flush(py).unwrap(); subscriber.shutdown(py).unwrap(); - assert_eq!(subscriber.__repr__(), ""); + assert_eq!(subscriber.__repr__(), ""); }); } #[test] -fn test_open_inference_config_rejects_invalid_inputs() { +fn test_openinference_typed_otel_config_rejects_invalid_inputs() { let _python = crate::test_support::init_python_test(); Python::attach(|py| { - let mut config = PyOpenInferenceConfig::new(); + let mut config = PyOpenTelemetryConfig::new( + "openinference".into(), + "http://localhost:4318/v1/traces".into(), + ); let bad_headers = PyList::empty(py); assert!(config.set_headers(&bad_headers.into_any()).is_err()); @@ -1723,9 +1739,8 @@ def run(types): _ = repr(exporter) _ = exporter.deregister("missing-exporter") - otel = types.OpenTelemetryConfig() + otel = types.OpenTelemetryConfig("full", "http://127.0.0.1:4317") otel.transport = "grpc" - otel.endpoint = "http://127.0.0.1:4317" otel_grpc_error = None try: otel_subscriber = types.OpenTelemetrySubscriber(otel) @@ -1734,12 +1749,11 @@ def run(types): except RuntimeError as err: otel_grpc_error = str(err) - oi = types.OpenInferenceConfig() + oi = types.OpenTelemetryConfig("openinference", "http://127.0.0.1:4317") oi.transport = "grpc" - oi.endpoint = "http://127.0.0.1:4317" oi_grpc_error = None try: - oi_subscriber = types.OpenInferenceSubscriber(oi) + oi_subscriber = types.OpenTelemetrySubscriber(oi) _ = repr(oi_subscriber) oi_subscriber.shutdown() except RuntimeError as err: @@ -1877,7 +1891,7 @@ def run(types): let result_json = py_to_json(&result).unwrap(); assert!(result_json["request_error"].as_str().is_some()); - assert!(result_json["otel_grpc_error"].as_str().is_some()); + assert!(result_json["otel_grpc_error"].is_null()); assert!(result_json["oi_grpc_error"].is_null()); assert_eq!(result_json["params_is_none"], json!(true)); assert_eq!(result_json["tools_is_none"], json!(true)); @@ -1993,14 +2007,14 @@ def run(types, api): _ = la & types.LLMAttributes(types.LLMAttributes.STREAMING) _ = repr(la) - otel = types.OpenTelemetryConfig() + otel = types.OpenTelemetryConfig("full", "http://localhost:4318/v1/traces") otel.headers = {"authorization": "Bearer token"} otel.resource_attributes = {"env": "test"} _ = otel.headers _ = otel.resource_attributes _ = repr(otel) - oi = types.OpenInferenceConfig() + oi = types.OpenTelemetryConfig("openinference", "http://localhost:4318/v1/traces") oi.headers = {"authorization": "Bearer token"} oi.resource_attributes = {"env": "test"} _ = oi.headers diff --git a/deny.toml b/deny.toml index a2c287d35..da362d144 100644 --- a/deny.toml +++ b/deny.toml @@ -1,12 +1,6 @@ # SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. # SPDX-License-Identifier: Apache-2.0 -[advisories] -ignore = [ - { id = "RUSTSEC-2026-0194", reason = "The released object_store versions still depend on quick-xml before 0.41.0; remove this exception when object_store publishes the fixed dependency." }, - { id = "RUSTSEC-2026-0195", reason = "The released object_store versions still depend on quick-xml before 0.41.0; remove this exception when object_store publishes the fixed dependency." }, -] - [bans] skip = [ { crate = "getrandom@0.4.2", reason = "build-only duplicate internal to cbindgen's tempfile stack" }, @@ -20,6 +14,7 @@ allow = [ "Apache-2.0", "BSD-3-Clause", # required by redis crate "BSL-1.0", # Boost Software License, required by xxhash-rust + "CDLA-Permissive-2.0", # Mozilla root certificate data used by object_store's Rustls transport "ISC", "MIT", "MIT-0", # required by borrow-or-share through jsonschema/referencing diff --git a/docs/about-nemo-relay/agent-runtime-primer.mdx b/docs/about-nemo-relay/agent-runtime-primer.mdx index b70cef34a..2209a16fa 100644 --- a/docs/about-nemo-relay/agent-runtime-primer.mdx +++ b/docs/about-nemo-relay/agent-runtime-primer.mdx @@ -43,8 +43,8 @@ as paths through that model rather than separate model layers: Observability Format (ATOF) lifecycle records that subscribers and exporters can consume. - **Subscribers and exporters** consume events in process, write raw ATOF - events, or project events into ATIF, OpenTelemetry, OpenInference, or other - downstream formats. + events, or project events into ATIF, typed OpenTelemetry output such as the + OpenInference projection, or other downstream formats. Managed tool and LLM calls are the main application-owned API path through that model: they attach work to the active scope, run middleware in a consistent diff --git a/docs/about-nemo-relay/concepts/codecs.mdx b/docs/about-nemo-relay/concepts/codecs.mdx index 312e9d11c..0049d840e 100644 --- a/docs/about-nemo-relay/concepts/codecs.mdx +++ b/docs/about-nemo-relay/concepts/codecs.mdx @@ -104,8 +104,8 @@ Normalized codec output is applicable to several runtime layers: - Request intercepts or request-side middleware that need stable request meaning - Lifecycle events that should expose consistent semantic payloads - Subscribers that inspect runtime activity in process -- Exporters that write raw ATOF events or project them into ATIF, - OpenTelemetry, or OpenInference +- Exporters that write raw ATOF events or project them into ATIF or typed + OpenTelemetry output Codecs do not replace scopes, middleware, subscribers, or plugins. They make those layers easier to apply consistently across heterogeneous inputs. @@ -189,10 +189,10 @@ grade provider data. ### Exporter Projection -Exporter projection is the final step. ATIF, OpenTelemetry, and OpenInference -may project the same normalized facts into different output schemas, but generic -extraction should stay outside exporter-specific formatting where possible. -ATIF-specific trajectory shaping, OpenTelemetry attributes, and OpenInference +Exporter projection is the final step. ATIF and the typed OpenTelemetry +projections can map the same normalized facts into different output schemas, +but generic extraction should stay outside exporter-specific formatting where +possible. ATIF-specific trajectory shaping and each OpenTelemetry projection's semantic attributes remain exporter-local. ## Codec Decision Limitations diff --git a/docs/about-nemo-relay/concepts/events.mdx b/docs/about-nemo-relay/concepts/events.mdx index f3ae6a864..a6b7678ea 100644 --- a/docs/about-nemo-relay/concepts/events.mdx +++ b/docs/about-nemo-relay/concepts/events.mdx @@ -277,8 +277,8 @@ Exporters handle the mark as follows: - ATOF preserves the canonical mark event. - ATIF omits marks because it models trajectory steps rather than independent point-in-time events. -- OpenTelemetry and OpenInference apply their configured `mark_projection` to - parented marks. +- The `full` and `openinference` OpenTelemetry projections use their fixed + native mark handling. The `gen_ai` projection omits marks. ## How Events Are Produced @@ -289,5 +289,5 @@ the runtime record important state transitions even when there is no full nested callback to wrap. Subscriber delivery is downstream from event construction and does not block the emitting call on native bindings. -ATOF export writes this raw canonical event stream. ATIF, OpenTelemetry, and -OpenInference are downstream projections over the same events. +ATOF export writes this raw canonical event stream. ATIF and the typed +OpenTelemetry formats are downstream projections over the same events. diff --git a/docs/about-nemo-relay/concepts/plugins.mdx b/docs/about-nemo-relay/concepts/plugins.mdx index 0f9b0e445..bb5f06528 100644 --- a/docs/about-nemo-relay/concepts/plugins.mdx +++ b/docs/about-nemo-relay/concepts/plugins.mdx @@ -181,9 +181,9 @@ Detailed adaptive configuration belongs in The core crate ships a built-in `observability` plugin component for Agent Trajectory Observability Format (ATOF), Agent Trajectory Interchange Format -(ATIF), OpenTelemetry, and OpenInference exporters. Each exporter section is -disabled unless its section sets `enabled = true`, and subscriber names are -inferred from the plugin namespace instead of exposed in public config. +(ATIF), and typed OpenTelemetry exporters. Each exporter section is disabled +unless its section sets `enabled = true`, and subscriber names are inferred +from the plugin namespace instead of exposed in public config. Detailed observability plugin configuration belongs in [Observability Configuration](/configure-plugins/observability/configuration). diff --git a/docs/about-nemo-relay/concepts/subscribers.mdx b/docs/about-nemo-relay/concepts/subscribers.mdx index 6fdc12bff..8ac477ca2 100644 --- a/docs/about-nemo-relay/concepts/subscribers.mdx +++ b/docs/about-nemo-relay/concepts/subscribers.mdx @@ -207,19 +207,16 @@ event per line. ### OpenTelemetry Subscriber The OpenTelemetry subscriber maps runtime events into OTLP traces for tracing -backends. +backends. Each subscriber uses one `full`, `gen_ai`, or `openinference` +projection. Select `openinference` for model-centric OpenInference semantics; +there is no separate OpenInference subscriber. -### OpenInference Subscriber - -The OpenInference subscriber maps runtime events into OTLP traces using -OpenInference semantics for model-centric observability. - -Detailed setup, configuration, and API shape for these subscribers belongs in +Detailed setup, configuration, and API shape for this subscriber belongs in [Observability](/configure-plugins/observability/about). For configuration-driven setup, use the built-in [`observability` plugin](/configure-plugins/observability/configuration) -to install ATOF, ATIF, OpenTelemetry, and OpenInference subscribers from one -plugin component. +to install ATOF, ATIF, and typed OpenTelemetry exporters from one plugin +component. ## Practical Guidance diff --git a/docs/about-nemo-relay/ecosystem.mdx b/docs/about-nemo-relay/ecosystem.mdx index 3db5c47fa..afabe2329 100644 --- a/docs/about-nemo-relay/ecosystem.mdx +++ b/docs/about-nemo-relay/ecosystem.mdx @@ -35,7 +35,7 @@ systems can call when actual work crosses a scope, tool, or model boundary. | NeMo Agent Toolkit and agent application frameworks | Build, run, profile, and optimize agent workflows across tools, data sources, and framework choices. | NeMo Relay can sit below these systems as the shared runtime contract for scopes, middleware, lifecycle events, subscribers, and plugins. | | NeMo Guardrails and policy systems | Define safety, control, and compliance behavior for LLM applications. | NeMo Relay can host runtime guardrails and intercepts around managed tool and LLM calls, while higher-level guardrail systems can still own policy authoring and orchestration. | | Application harnesses and workflow code | Decide the agent pattern, planner, memory, retries, scheduling, and user-facing behavior. | NeMo Relay instruments the execution boundaries that the harness already owns. | -| Observability and evaluation backends | Store traces, trajectories, metrics, and analysis data. | NeMo Relay emits lifecycle events and exports them to in-process subscribers, Agent Trajectory Observability Format (ATOF), Agent Trajectory Interchange Format (ATIF), OpenTelemetry, OpenInference-compatible traces, or other backends. | +| Observability and evaluation backends | Store traces, trajectories, metrics, and analysis data. | NeMo Relay emits lifecycle events and exports them to in-process subscribers, Agent Trajectory Observability Format (ATOF), Agent Trajectory Interchange Format (ATIF), typed OpenTelemetry projections including OpenInference-compatible traces, or other backends. | In practical terms, NeMo Relay answers a different question than higher-level agent products. A framework asks, "What should the agent do next?" NeMo Relay diff --git a/docs/about-nemo-relay/overview.mdx b/docs/about-nemo-relay/overview.mdx index 5f6a23b9c..7d93fcefb 100644 --- a/docs/about-nemo-relay/overview.mdx +++ b/docs/about-nemo-relay/overview.mdx @@ -64,14 +64,14 @@ Start with [Agent Trajectory Observability Format (ATOF) JSONL](/configure-plugi the raw canonical event stream. It shows the lifecycle events Relay actually captured before anything is translated into [Agent Trajectory Interchange Format (ATIF)](/configure-plugins/observability/atif), -OpenTelemetry, or OpenInference output. +or a typed OpenTelemetry projection. A good first integration process workflow is as follows: 1. Create or identify one scope boundary. 2. Capture one LLM, tool, session, or turn boundary. 3. Export ATOF JSONL and inspect the raw event stream. -4. Add ATIF, OpenTelemetry, or OpenInference when the raw events are trustworthy. +4. Add ATIF or a typed OpenTelemetry projection when the raw events are trustworthy. 5. Add middleware only when Relay must block, sanitize, rewrite, route, or replace real execution. @@ -87,8 +87,8 @@ NeMo Relay offers the following features when you use it with your agent stacks: route, retry, or replace execution. - **Plugins** so reusable observability, guardrail, adaptive, and exporter behavior can be turned on from configuration. -- **Events and subscribers** so raw ATOF, normalized ATIF, OpenTelemetry, and - OpenInference output all come from the same runtime stream. +- **Events and subscribers** so raw ATOF, normalized ATIF, and typed + OpenTelemetry output all come from the same runtime stream. Use [Concepts](/about-nemo-relay/concepts) when you want the deeper model for scopes, events, middleware, subscribers, and plugins. diff --git a/docs/about-nemo-relay/release-notes/index.mdx b/docs/about-nemo-relay/release-notes/index.mdx index a87eb2176..f0e65cc22 100644 --- a/docs/about-nemo-relay/release-notes/index.mdx +++ b/docs/about-nemo-relay/release-notes/index.mdx @@ -42,6 +42,19 @@ compatibility information applies to the current 0.7 prerelease. - Native and worker plugins can resolve invocation-scoped codec capabilities. Request sanitizers can decode and encode requests, and response sanitizers can decode responses. +- The Observability plugin now uses one typed, multi-endpoint OpenTelemetry + section for `full`, `gen_ai`, and `openinference` trace projections. +- The `gen_ai` projection implements the pinned + [OpenTelemetry GenAI semantic-conventions v1.42-era snapshot](https://github.com/open-telemetry/semantic-conventions-genai/tree/43633a68ef8f8ed87a1d5eb205990311ca708bf1). +- OpenTelemetry exporter dependencies, including OpenInference semantic + support, are always enabled instead of being controlled by Cargo features. +- OpenTelemetry Rust is upgraded to `0.32`. +- Top-level plugin component `config` lists and the observability destination + lists `atof.sinks`, `opentelemetry.endpoints`, and `atif.storage` + concatenate across configuration layers, with higher-precedence entries + first. +- `object_store` is upgraded to `0.14.1`, which removes the temporary + `RUSTSEC-2026-0194` and `RUSTSEC-2026-0195` advisory exceptions. ### Support Matrix and Compatibility Updates @@ -64,6 +77,20 @@ Before upgrading from 0.6, follow the For the new callback contract and codec operations, refer to [Codec-Aware LLM Sanitizers](/about-nemo-relay/concepts/middleware#codec-aware-llm-sanitizers). +Observability configuration version 3 is a breaking change. It removes the +standalone `openinference` section and standalone OpenInference subscriber APIs, +requires a type and endpoint for every OpenTelemetry exporter, and removes +configurable mark and attribute-alias controls. Refer to +[Migration Guides](/reference/migration-guides#observability-configuration-version-3) +for before-and-after configuration and binding API changes. + +Each `opentelemetry.endpoints` entry can resolve sensitive header values from +environment variables through `header_env`. NeMo Relay validates the variable +and snapshots its value when the plugin activates. +Process-global `OTEL_EXPORTER_OTLP_HEADERS` and +`OTEL_EXPORTER_OTLP_TRACES_HEADERS` now fail construction or activation because +their values cannot be isolated between endpoints. + ### Fixed Known Issues in 0.7 - LLM payload redaction now follows the codec active for each call instead of a @@ -105,8 +132,8 @@ For the new callback contract and codec operations, refer to configured destinations. A failed stream sink does not stop file output or other active sinks. - ATIF omits point-in-time marks. Use ATOF for the canonical mark stream; - OpenTelemetry and OpenInference tool-style mark projection is only a - visualization aid. + the `gen_ai` OpenTelemetry projection also omits marks. The `full` and + `openinference` projections retain their fixed native mark handling. - Native dynamic plugins run in the Relay process and are not sandboxed. A `grpc-v1` worker runs in a separate process, but that process is not a security sandbox. diff --git a/docs/build-plugins/language-binding/code-examples.mdx b/docs/build-plugins/language-binding/code-examples.mdx index 84346dc69..5ebe2edca 100644 --- a/docs/build-plugins/language-binding/code-examples.mdx +++ b/docs/build-plugins/language-binding/code-examples.mdx @@ -180,10 +180,11 @@ This pattern is useful for: Use a subscriber-oriented plugin when the component should watch the full lifecycle rather than rewrite requests. The following examples log each event -in Python and Node.js. They do not transform events into OpenInference spans. +in Python and Node.js. They do not transform events into the `openinference` +OpenTelemetry projection. Refer to [OpenInference](/configure-plugins/observability/openinference) for the -built-in OpenInference exporter. +built-in `openinference` projection of the typed OpenTelemetry exporter. diff --git a/docs/configure-plugins/about.mdx b/docs/configure-plugins/about.mdx index 054e11189..b96315a2f 100644 --- a/docs/configure-plugins/about.mdx +++ b/docs/configure-plugins/about.mdx @@ -26,7 +26,7 @@ Relay ships these first-party components. Configure them as `[[components]]` entries in `plugins.toml`. - [Observability](/configure-plugins/observability/about) exports ATOF, ATIF, - OpenTelemetry, or OpenInference data. + or typed OpenTelemetry data. - [Adaptive](/configure-plugins/adaptive/about) configures adaptive runtime behavior. - [NeMo Guardrails](/configure-plugins/nemo-guardrails/about) installs diff --git a/docs/configure-plugins/observability/about.mdx b/docs/configure-plugins/observability/about.mdx index bb2bef277..7fcde0eb6 100644 --- a/docs/configure-plugins/observability/about.mdx +++ b/docs/configure-plugins/observability/about.mdx @@ -27,7 +27,7 @@ calls, managed LLM calls, middleware, and manual lifecycle APIs emit the canonical Agent Trajectory Observability Format (ATOF) event stream. Subscribers consume that stream in process, and exporter-oriented subscribers write raw ATOF JSONL or translate events into Agent Trajectory Interchange -Format (ATIF), OpenTelemetry, or OpenInference. +Format (ATIF) or a typed OpenTelemetry projection. That makes observability downstream from the runtime contract: @@ -53,8 +53,8 @@ The first-party plugin component has kind `observability`. It can install: - Agent Trajectory Observability Format (ATOF) JSONL export for raw lifecycle events. - Agent Trajectory Interchange Format (ATIF) trajectory export for each top-level Agent scope or supported coding-agent turn scope. -- OpenTelemetry OTLP trace export. -- OpenInference-oriented OTLP trace export. +- Typed OpenTelemetry OTLP trace export using the `full`, `gen_ai`, or + `openinference` projection. ## Plugin-Managed Versus Manual Export @@ -113,8 +113,8 @@ Choose the exporter based on the downstream system: |---|---| | Raw canonical event stream | [Agent Trajectory Observability Format (ATOF)](/configure-plugins/observability/atof) | | Offline analysis, replay, or evaluation trajectories | [Agent Trajectory Interchange Format (ATIF)](/configure-plugins/observability/atif) | -| Generic OTLP traces | [OpenTelemetry](/configure-plugins/observability/opentelemetry) | -| OpenInference-oriented agent and LLM spans | [OpenInference](/configure-plugins/observability/openinference) | +| Complete NeMo Relay or standardized GenAI OTLP traces | [OpenTelemetry](/configure-plugins/observability/opentelemetry) | +| OpenInference-oriented agent and LLM spans | [OpenInference Projection](/configure-plugins/observability/openinference) | Start with in-process event inspection before exporting externally. Add sanitize guardrails before exporters receive sensitive payloads. @@ -144,20 +144,22 @@ trajectory root scope UUID as the trajectory `session_id`. ATIF step lineage sto event UUID as `step.extra.ancestry.function_id` and the parent UUID as `step.extra.ancestry.parent_id`. -OpenTelemetry and OpenInference spans carry the same values as -`nemo_relay.uuid` and `nemo_relay.parent_uuid` span attributes. Mark events use -`nemo_relay.mark.uuid` and `nemo_relay.mark.parent_uuid`. Native backend -`trace_id` and `span_id` values are still generated by the tracing backend and -are not written into ATIF. +The `full` and `openinference` OpenTelemetry projections carry the same values +as `nemo_relay.uuid` and `nemo_relay.parent_uuid` span attributes. Mark events +use `nemo_relay.mark.uuid` and `nemo_relay.mark.parent_uuid`. The `gen_ai` +projection intentionally omits `nemo_relay.*` attributes. Native backend +`trace_id` and `span_id` values are not written into ATIF. -For coding-agent sessions, OTLP trace roots additionally carry the logical -`session.id`, optional `user.id`, and Relay-owned +For coding-agent sessions, `full` and `openinference` OTLP trace roots +additionally carry the logical `session.id`, optional `user.id`, and Relay-owned `nemo_relay.session.instance_id`. The instance value is the existing root scope UUID and is shared across trace roots created by the same runtime session. -OpenTelemetry and OpenInference generate independent native trace IDs, so use -the Relay instance ID for cross-exporter or cross-trace correlation and use -each backend's `trace_id` to join child rows. ATIF keeps its existing artifact -IDs and exposes the same logical values under `extra.nemo_relay`. +The `gen_ai` projection uses the standard `gen_ai.conversation.id` when the +event supplies a conversation, session, or thread identifier. Typed endpoints +derive the same native trace and span IDs from the same Relay lifecycle UUIDs, +so the backend IDs also correlate across exporters. ATIF keeps its existing +artifact IDs and exposes the logical coding-session values under +`extra.nemo_relay`. ## Pages @@ -167,6 +169,7 @@ IDs and exposes the same logical values under `extra.nemo_relay`. - [Agent Trajectory Interchange Format (ATIF)](/configure-plugins/observability/atif) covers trajectory export for top-level Agent scopes and supported coding-agent turn scopes. -- [OpenTelemetry](/configure-plugins/observability/opentelemetry) covers generic OTLP trace export. -- [OpenInference](/configure-plugins/observability/openinference) covers OpenInference-oriented OTLP trace - export. +- [OpenTelemetry](/configure-plugins/observability/opentelemetry) covers typed + OTLP trace export. +- [OpenInference Projection](/configure-plugins/observability/openinference) + covers OpenInference-oriented OTLP trace export. diff --git a/docs/configure-plugins/observability/atif.mdx b/docs/configure-plugins/observability/atif.mdx index c358404aa..b8e071656 100644 --- a/docs/configure-plugins/observability/atif.mdx +++ b/docs/configure-plugins/observability/atif.mdx @@ -28,7 +28,7 @@ kind = "observability" enabled = true [components.config] -version = 2 +version = 3 [components.config.atif] enabled = true @@ -259,7 +259,7 @@ writes the partial trajectory. Terminating the process before root-scope closure or plugin teardown completes can leave the trajectory absent or incomplete. -To correlate ATIF with OpenTelemetry or OpenInference traces from the same run, +To correlate ATIF with typed OpenTelemetry traces from the same run, join on NeMo Relay UUIDs. The plugin-managed ATIF `session_id` is the top-level trajectory root scope UUID. Each step's `extra.ancestry.function_id` is the event UUID, and `extra.ancestry.parent_id` is the parent event UUID. Trace spans expose the @@ -340,7 +340,7 @@ void (async () => { version: 1, components: [ observability.ComponentSpec({ - version: 2, + version: 3, atif: observability.atifConfig({ enabled: true, agent_name: "Planner", diff --git a/docs/configure-plugins/observability/atof.mdx b/docs/configure-plugins/observability/atof.mdx index b37447fca..c91b4749e 100644 --- a/docs/configure-plugins/observability/atof.mdx +++ b/docs/configure-plugins/observability/atof.mdx @@ -27,7 +27,7 @@ kind = "observability" enabled = true [components.config] -version = 2 +version = 3 [components.config.atof] enabled = true @@ -154,7 +154,7 @@ worker which timed out drained or closed. ## Migrate From Version 1 -Observability component configuration now requires `version = 2`. NeMo Relay +Observability component configuration now requires `version = 3`. NeMo Relay does not translate the removed ATOF fields from version 1. Make the following changes when you migrate a plugin configuration: @@ -274,7 +274,7 @@ void (async () => { version: 1, components: [ observability.ComponentSpec({ - version: 2, + version: 3, atof: observability.atofConfig({ enabled: true, sinks: [ diff --git a/docs/configure-plugins/observability/configuration.mdx b/docs/configure-plugins/observability/configuration.mdx index 44e90bb17..747e875e6 100644 --- a/docs/configure-plugins/observability/configuration.mdx +++ b/docs/configure-plugins/observability/configuration.mdx @@ -1,60 +1,23 @@ --- -title: "Observability Configuration" -sidebar-title: "Configuration" -description: "Configure ATOF, ATIF, OpenTelemetry, and OpenInference exporters together." +title: "Configuration" +description: "Configure the built-in NeMo Relay observability plugin." position: 2 --- {/* SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. SPDX-License-Identifier: Apache-2.0 */} +The observability plugin consumes the canonical NeMo Relay event stream and +can install ATOF, ATIF, and OpenTelemetry exporters. -Use this page when an application should install standard observability -exporters from one plugin configuration document instead of manually registering -each subscriber. - -The plugin kind is `observability`. The core runtime registers it, so -applications do not need to register a plugin implementation before validation -or initialization. - -For plugin file discovery, precedence, merge behavior, editor controls, and -gateway conflict rules, refer to -[Plugin Configuration Files](/configure-plugins/plugin-configuration-files). - - -Observability plugin configuration uses the generic NeMo Relay plugin document -shape, so field names are `snake_case` in every binding. This differs from -Node.js runtime classes such as `OpenTelemetrySubscriber`, which use -Node-native `camelCase` option names outside the plugin system. - - - -## What It Installs - -Every exporter section is optional and defaults to disabled. A section is active -only when it includes `enabled = true`. - -The following table lists the runtime behavior that each section installs: - -| Section | Runtime Behavior | +| Section | Purpose | |---|---| -| `atof` | Registers a global Agent Trajectory Observability Format (ATOF) exporter with file and stream sinks for raw lifecycle events. | -| `atif` | Registers one Agent Trajectory Interchange Format (ATIF) dispatcher that writes one trajectory file for each top-level Agent scope or supported coding-agent turn scope. | -| `opentelemetry` | Registers a global OpenTelemetry OTLP subscriber. | -| `openinference` | Registers a global OpenInference OTLP subscriber. | - -`subscriber_name` is not part of this config. The runtime infers -component-local subscriber names and registers them under the observability -plugin namespace: - -- Agent Trajectory Observability Format (ATOF): `__nemo_relay_plugin__observability__atof` -- Agent Trajectory Interchange Format (ATIF) dispatcher: `__nemo_relay_plugin__observability__atif` -- Per-trajectory-root ATIF scope subscriber: `__nemo_relay_plugin__observability__atif-{root_scope_uuid}` -- OpenTelemetry: `__nemo_relay_plugin__observability__opentelemetry` -- OpenInference: `__nemo_relay_plugin__observability__openinference` +| `atof` | Writes or streams raw ATOF lifecycle events. | +| `atif` | Writes completed ATIF agent trajectories. | +| `opentelemetry` | Fans out events to typed `full`, `gen_ai`, or `openinference` OTLP endpoints. | -## `plugins.toml` Example +Observability component configuration uses `version = 3`. -Add the following observability component configuration to `plugins.toml`: +## Complete Example ```toml version = 1 @@ -64,396 +27,171 @@ kind = "observability" enabled = true [components.config] -version = 2 +version = 3 [components.config.atof] enabled = true [[components.config.atof.sinks]] type = "file" -output_directory = "logs" +output_directory = "./observability" filename = "events.jsonl" -mode = "overwrite" - -[[components.config.atof.sinks]] -type = "stream" -name = "archive" -url = "http://localhost:8080/events" -transport = "http_post" -timeout_millis = 3000 - -[components.config.atof.sinks.header_env] -authorization = "NEMO_RELAY_ATOF_AUTH_HEADER" +mode = "append" [components.config.atif] enabled = true -output_directory = "logs" +agent_name = "NeMo Relay" +model_name = "unknown" +output_directory = "./observability" filename_template = "trajectory-{session_id}.json" [components.config.opentelemetry] enabled = true -transport = "http_binary" -endpoint = "http://localhost:4318/v1/traces" -service_name = "nemo-relay" -service_namespace = "agent" -service_version = "0.7.0" -instrumentation_scope = "nemo-relay-observability" -timeout_millis = 3000 -[components.config.opentelemetry.headers] -authorization = "Bearer " +[[components.config.opentelemetry.endpoints]] +type = "full" +endpoint = "http://localhost:4318/v1/traces" +service_name = "agent-service" -[components.config.opentelemetry.resource_attributes] -"deployment.environment" = "dev" -"service.instance.id" = "local" +[[components.config.opentelemetry.endpoints]] +type = "gen_ai" +endpoint = "http://localhost:4318/v1/traces" +service_name = "agent-service" -[components.config.openinference] -enabled = true -transport = "http_binary" +[[components.config.opentelemetry.endpoints]] +type = "openinference" endpoint = "http://localhost:6006/v1/traces" -service_name = "nemo-relay" -service_namespace = "agent" -service_version = "0.7.0" -instrumentation_scope = "nemo-relay-openinference" -timeout_millis = 3000 - -[components.config.openinference.headers] -authorization = "Bearer " - -[components.config.openinference.resource_attributes] -"deployment.environment" = "dev" -"service.instance.id" = "local" - -[components.config.policy] -unknown_component = "warn" -unknown_field = "warn" -unsupported_value = "error" +service_name = "agent-service" ``` -Observability component configuration requires `version = 2`. To update an -older ATOF configuration, follow [Migrate From Version 1](/configure-plugins/observability/atof#migrate-from-version-1). +When OpenTelemetry is enabled, `endpoints` must contain at least one entry. +Endpoint types can be combined or repeated with independent destinations. All +endpoints are constructed before the plugin registers its fan-out subscriber. -This example reads its ATOF authorization header from -`NEMO_RELAY_ATOF_AUTH_HEADER`. Set that variable to the complete header value -before validation or activation; NeMo Relay rejects missing or blank values. +## Multi-Endpoint Lifecycle -Include only the sections you want to configure. In layered `plugins.toml` -files, omission inherits lower-precedence values; write `enabled = false` to -disable an inherited section. +OpenTelemetry endpoint construction is transactional. If validation or +construction fails for any endpoint, plugin activation fails before the +fan-out subscriber is registered. A previous active plugin configuration is +preserved when possible; the plugin host attempts to restore it if replacement +fails after teardown begins. -## Failure Behavior +After activation, each event is delivered to every endpoint. A runtime delivery +failure in one exporter does not stop application work or delivery to the other +exporters. During teardown, NeMo Relay attempts to shut down every endpoint and +returns the first teardown error after all attempts finish. Clear the plugin +during graceful shutdown so queued subscriber work can drain and every +exporter receives a teardown attempt. -NeMo Relay treats exporter configuration and exporter delivery failures -differently. Configuration and activation failures are fail-closed for the -observability setup: validation or initialization returns an error before the -new plugin configuration becomes active. Runtime delivery failures are -fail-open for application work: the tool, LLM, or agent run continues while the -affected exporter records, logs, or reports the delivery problem. +Top-level component `config` lists concatenate across configuration layers, +with higher-precedence entries first. The observability destination lists +`atof.sinks`, `opentelemetry.endpoints`, and `atif.storage` follow the same +rule, so system, project, user, and programmatic layers can contribute +destinations. Arbitrary lists nested inside structured values retain +replacement semantics. List entries are not merged item by item. +To change or remove an inherited endpoint, edit the layer that declares it. +For complete layering rules, refer to +[Plugin Configuration Files](/configure-plugins/plugin-configuration-files#precedence-and-merge-behavior). -The following table describes how each failure affects application work: +For exporter-specific fields and behavior, refer to: -| Failure | Behavior | -|---|---| -| Invalid `plugins.toml`, duplicate component kinds, malformed component shapes, unsupported values, unavailable exporter features, ATOF file-open failures, invalid ATOF stream sink configuration, unavailable ATOF streaming support, or ATOF stream worker startup failures | Validation or initialization fails. If a previous plugin configuration was active, NeMo Relay attempts to restore it after a failed replacement. | -| ATOF event serialization or file write/flush failure after activation | Application work continues. The exporter stores the failure, stops accepting later events for that file, and returns the stored error from `force_flush()` or `shutdown()`. | -| ATOF stream sink connection or send failure after activation | File output and other already-started sinks continue. Stream sink failures are logged with the sink index; flush and close timeouts are logged instead of blocking shutdown indefinitely. | -| ATIF local file write, HTTP storage, or S3-compatible storage failure | Application work continues. The ATIF exporter records the failed sink as unhealthy and skips it for later trajectories. Other configured sinks continue to receive writes. | -| ATIF dispatcher serialization or subscriber-management failure | The ATIF dispatcher records a fatal exporter error and stops observing later ATIF events. Other observability sections continue to run. | -| OpenTelemetry or OpenInference construction failure | Plugin initialization fails before the subscriber is registered. | -| OpenTelemetry or OpenInference export failure after registration | Application work continues. The OTLP exporter reports failures through its runtime logging and flush or shutdown path. | -| Process termination before plugin teardown completes | The output can omit events that were still in the subscriber queue or an exporter-owned worker. NeMo Relay does not backfill those events after restart, and the process can end before an exporter reports an error. | - -Missing or delayed telemetry is represented as absence of exporter output, not -as synthetic success or failure events. NeMo Relay does not backfill events for -subscribers that register late. If the plugin is cleared while an Agent scope -or supported coding-agent turn scope is still open, the ATIF dispatcher writes -the partial trajectory it has already observed. - -Use `nemo-relay doctor` to validate local ATOF and ATIF output directories, -OTLP HTTP endpoints, and ATOF stream sinks. Validate ATIF remote storage -destinations, including HTTP storage and S3-compatible storage, with exporter -logs and backend-side checks because `nemo-relay doctor` does not probe -`atif.storage`. For local artifact paths, verify that the running process can -create the output directory and that teardown calls `plugin.clear()` or -`clear_plugin_configuration()` before the process exits. - -## Per-Language Plugin Configuration - -The following examples configure and activate the observability component -through each supported language binding: - -`validate()` checks only the supplied in-memory object. `initialize()` also -layers discovered `plugins.toml` configuration. For effective file-backed -validation, refer to [Plugin Configuration Files](/configure-plugins/plugin-configuration-files) -and run the gateway with the same configuration path that production uses. +- [ATOF](/configure-plugins/observability/atof) +- [ATIF](/configure-plugins/observability/atif) +- [OpenTelemetry](/configure-plugins/observability/opentelemetry) +- [OpenInference](/configure-plugins/observability/openinference) + +## Programmatic Configuration ```python -import asyncio - -from nemo_relay import plugin, scope, ScopeType +from nemo_relay import plugin from nemo_relay.observability import ( - AtifConfig, - AtofConfig, - AtofFileSinkConfig, - AtofStreamSinkConfig, ComponentSpec, ObservabilityConfig, - OtlpConfig, + OpenTelemetrySectionConfig, + OpenTelemetryEndpointConfig, ) config = plugin.PluginConfig( components=[ ComponentSpec( ObservabilityConfig( - atof=AtofConfig( + opentelemetry=OpenTelemetrySectionConfig( enabled=True, - sinks=[ - AtofFileSinkConfig( - output_directory="logs", - filename="events.jsonl", - mode="overwrite", - ), - AtofStreamSinkConfig( - name="archive", - url="http://localhost:8080/events", - transport="http_post", - header_env={ - "authorization": "NEMO_RELAY_ATOF_AUTH_HEADER" - }, - ), + endpoints=[ + OpenTelemetryEndpointConfig( + type="gen_ai", + endpoint="http://localhost:4318/v1/traces", + service_name="agent-service", + ) ], - ), - atif=AtifConfig( - enabled=True, - output_directory="logs", - filename_template="trajectory-{session_id}.json", - ), - opentelemetry=OtlpConfig( - enabled=True, - endpoint="http://localhost:4318/v1/traces", - service_name="nemo-relay", - service_namespace="agent", - service_version="0.7.0", - instrumentation_scope="nemo-relay-observability", - resource_attributes={"deployment.environment": "dev"}, - ), - openinference=OtlpConfig( - enabled=True, - endpoint="http://localhost:6006/v1/traces", - service_name="nemo-relay", - service_namespace="agent", - service_version="0.7.0", - instrumentation_scope="nemo-relay-openinference", - resource_attributes={"deployment.environment": "dev"}, - ), + ) ) ) ] ) - -report = plugin.validate(config) -if any(diagnostic["level"] == "error" for diagnostic in report["diagnostics"]): - raise RuntimeError(report["diagnostics"]) - -async def arun(): - async with plugin.plugin(config): - with scope.scope("agent", ScopeType.Agent): - pass - -asyncio.run(arun()) ``` - - - -```js -const plugin = require("nemo-relay-node/plugin"); + +```javascript const observability = require("nemo-relay-node/observability"); -void (async () => { - await plugin.initialize({ - version: 1, - components: [ - observability.ComponentSpec({ - version: 2, - atof: observability.atofConfig({ - enabled: true, - sinks: [ - { - type: "file", - output_directory: "logs", - filename: "events.jsonl", - mode: "overwrite", - }, - { - type: "stream", - name: "archive", - url: "http://localhost:8080/events", - transport: "http_post", - header_env: { - authorization: "NEMO_RELAY_ATOF_AUTH_HEADER", - }, - }, - ], - }), - atif: observability.atifConfig({ - enabled: true, - output_directory: "logs", - filename_template: "trajectory-{session_id}.json", - }), - opentelemetry: observability.otlpConfig({ - enabled: true, - endpoint: "http://localhost:4318/v1/traces", - service_name: "nemo-relay", - service_namespace: "agent", - service_version: "0.7.0", - instrumentation_scope: "nemo-relay-observability", - resource_attributes: { - "deployment.environment": "dev", - }, - }), - openinference: observability.otlpConfig({ - enabled: true, - endpoint: "http://localhost:6006/v1/traces", - service_name: "nemo-relay", - service_namespace: "agent", - service_version: "0.7.0", - instrumentation_scope: "nemo-relay-openinference", - resource_attributes: { - "deployment.environment": "dev", - }, - }), +const component = observability.ComponentSpec({ + version: 3, + opentelemetry: observability.openTelemetryConfig({ + enabled: true, + endpoints: [ + observability.openTelemetryEndpoint({ + type: "gen_ai", + endpoint: "http://localhost:4318/v1/traces", + service_name: "agent-service", }), ], - }); - - try { - // Run instrumented application work here. - } finally { - plugin.clear(); - } -})().catch((error) => { - console.error(error); - process.exitCode = 1; + }), }); ``` - - - -```rust -use nemo_relay::observability::plugin_component::{ - AtifSectionConfig, AtofFileSinkSectionConfig, AtofSectionConfig, - AtofSinkSectionConfig, AtofStreamSinkSectionConfig, ComponentSpec, - ObservabilityConfig, OtlpSectionConfig, -}; -use nemo_relay::plugin::{ - clear_plugin_configuration, initialize_plugins, validate_plugin_config, PluginConfig, -}; - -#[tokio::main] -async fn main() -> Result<(), Box> { - let component = ComponentSpec::new(ObservabilityConfig { - atof: Some(AtofSectionConfig { - enabled: true, - sinks: vec![ - AtofSinkSectionConfig::File(AtofFileSinkSectionConfig { - output_directory: Some("logs".into()), - filename: Some("events.jsonl".into()), - mode: "overwrite".into(), - }), - AtofSinkSectionConfig::Stream(AtofStreamSinkSectionConfig { - url: "http://localhost:8080/events".into(), - transport: "http_post".into(), - headers: Default::default(), - header_env: [( - "authorization".into(), - "NEMO_RELAY_ATOF_AUTH_HEADER".into(), - )] - .into(), - timeout_millis: 3000, - field_name_policy: "preserve".into(), - name: Some("archive".into()), - }), - ], - }), - atif: Some(AtifSectionConfig { - enabled: true, - output_directory: Some("logs".into()), - filename_template: "trajectory-{session_id}.json".into(), - ..AtifSectionConfig::default() - }), - opentelemetry: Some(OtlpSectionConfig { - enabled: true, - endpoint: Some("http://localhost:4318/v1/traces".into()), - service_name: "nemo-relay".into(), - service_namespace: Some("agent".into()), - service_version: Some("0.7.0".into()), - instrumentation_scope: Some("nemo-relay-observability".into()), - resource_attributes: [("deployment.environment".into(), "dev".into())].into(), - ..OtlpSectionConfig::default() - }), - openinference: Some(OtlpSectionConfig { - enabled: true, - endpoint: Some("http://localhost:6006/v1/traces".into()), - service_name: "nemo-relay".into(), - service_namespace: Some("agent".into()), - service_version: Some("0.7.0".into()), - instrumentation_scope: Some("nemo-relay-openinference".into()), - resource_attributes: [("deployment.environment".into(), "dev".into())].into(), - ..OtlpSectionConfig::default() - }), - ..ObservabilityConfig::default() - }); - - let config = PluginConfig { - version: 1, - components: vec![component.into()], - policy: Default::default(), - }; - - let report = validate_plugin_config(&config); - assert!(!report.has_errors()); - - let _active = initialize_plugins(config).await?; - - // Run instrumented application work here. - - clear_plugin_configuration()?; - Ok(()) + +```go +config := nemo_relay.NewObservabilityConfig() +otel := nemo_relay.NewObservabilityOpenTelemetryConfig() +otel.Enabled = true +otel.Endpoints = []nemo_relay.ObservabilityOpenTelemetryEndpointConfig{ + nemo_relay.NewObservabilityOpenTelemetryEndpointConfig( + nemo_relay.OpenTelemetryTypeGenAI, + "http://localhost:4318/v1/traces", + ), } +config.OpenTelemetry = &otel +component := nemo_relay.NewObservabilityComponentSpec(config) ``` - - -## Validation and Teardown - -Validate plugin configuration before activating it. The plugin reports -unsupported transports, unsupported ATOF modes, invalid ATOF stream sink URLs, -non-string stream sink headers, non-positive stream sink timeouts, unsafe ATIF -filename templates, unknown fields according to policy, and enabled exporters -that are unavailable in the current build or target. - -Call `plugin.clear()` or `clear_plugin_configuration()` during teardown. -Clearing the plugin configuration waits for previously queued subscriber -callbacks, runs exporter-specific shutdown work, and removes plugin-owned -registrations. That work flushes file exporters, asks ATOF stream sink workers -to drain and close within their configured timeout, writes any eligible partial -ATIF trajectories, and shuts down owned OTLP subscribers. If an ATOF stream -worker times out, NeMo Relay logs a warning and continues teardown; clearing -the plugin can still return successfully without confirming that worker drained -or closed. - -This is a graceful teardown barrier, not a crash-durability guarantee. If the -process terminates before clearing begins or finishes, the output can omit -telemetry for application work that completed successfully. Telemetry delivery -failures remain fail-open and do not retroactively change the application -result. - -Use manual subscriber/exporter APIs instead of the plugin when you need custom -subscriber names, explicit per-run exporter objects, or direct control over the -collection window. +Validate programmatic configuration before initialization. Clear the plugin +during graceful shutdown so every exporter gets a teardown attempt. + +## Migrating from Version 2 + +Version 2 used independent `opentelemetry` and `openinference` sections. +Version 3 replaces them with typed endpoints: + +- Convert the old `opentelemetry` section to a `full` endpoint. +- Convert the old `openinference` section to an `openinference` endpoint. +- Add a `gen_ai` endpoint for the standardized GenAI projection. + +Remove `mark_projection`, `mark_exclude_names`, `attribute_mappings`, +`semantic_selector`, and `capture_content`. Their behavior is fixed by the +selected projection. Version-2 OTLP shapes are rejected under version 3. + +The version change also makes `type` and `endpoint` required for every +OpenTelemetry endpoint. The default `service_name` changes from `nemo-relay` +to `unknown_service`, and the default instrumentation scope becomes +`opentelemetry`. Move each old section's `headers` and `resource_attributes` +maps into its new endpoint. Use `header_env` when a header value comes from an +environment variable. + +For before-and-after TOML and Rust, Python, Node.js, Go, and C API changes, +refer to +[Migration Guides](/reference/migration-guides#observability-configuration-version-3). diff --git a/docs/configure-plugins/observability/openinference.mdx b/docs/configure-plugins/observability/openinference.mdx index 0a5ff9688..5b22e8e23 100644 --- a/docs/configure-plugins/observability/openinference.mdx +++ b/docs/configure-plugins/observability/openinference.mdx @@ -1,408 +1,97 @@ --- title: "OpenInference" -description: "Configure OpenInference-oriented OTLP tracing for NeMo Relay events." +description: "Export OpenInference-compatible traces through an OpenTelemetry endpoint." position: 6 --- {/* SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. SPDX-License-Identifier: Apache-2.0 */} +OpenInference is a fixed projection of the unified OpenTelemetry exporter. It +is always available and no longer has a separate configuration section, +subscriber class, or Cargo feature. -Use the `openinference` section when you want NeMo Relay lifecycle events -exported as OTLP trace spans with OpenInference-oriented semantics. - -OpenInference export maps model-centric payloads directly into trace -attributes. Scope, tool, and LLM start inputs become `input.value`. End outputs -become `output.value`. LLM usage metadata maps to token-count attributes when -provider responses include usage information. For LLM spans, NeMo Relay emits -flattened request and response message attributes from typed codec annotations -and supported replay request/response payloads. Typed codec annotations also -provide tool schema, finish-reason, and invocation-parameter attributes when -those fields are available. - -## `plugins.toml` Example +## Plugin Configuration -Add the following OpenInference exporter configuration to `plugins.toml`: +Select `openinference` on an endpoint in the `opentelemetry` section: ```toml -version = 1 - -[[components]] -kind = "observability" -enabled = true - [components.config] -version = 2 +version = 3 -[components.config.openinference] +[components.config.opentelemetry] enabled = true -transport = "http_binary" + +[[components.config.opentelemetry.endpoints]] +type = "openinference" endpoint = "http://localhost:6006/v1/traces" +transport = "http_binary" service_name = "agent-service" -service_namespace = "nemo" -service_version = "1.0.0" -instrumentation_scope = "nemo-relay-openinference" +instrumentation_scope = "opentelemetry" timeout_millis = 3000 -[components.config.openinference.headers] -authorization = "Bearer " +[components.config.opentelemetry.endpoints.header_env] +authorization = "OTEL_AUTHORIZATION" -[components.config.openinference.resource_attributes] +[components.config.opentelemetry.endpoints.resource_attributes] "deployment.environment" = "dev" ``` -This configuration registers a plugin-owned OpenInference subscriber and sends -OpenInference-style OTLP spans to Phoenix or another compatible backend. - -## Fields - -OpenInference uses the same OTLP section shape as -[OpenTelemetry](/configure-plugins/observability/opentelemetry): - -| Field | Default | Notes | -|---|---|---| -| `enabled` | `false` | Must be `true` to construct and register the subscriber. | -| `mark_projection` | `inherit` | `inherit` uses exporter-native handling; `event` forces span events; `tool` emits zero-duration OpenInference `TOOL` spans, parented as children when context is available. | -| `mark_exclude_names` | `["llm.chunk"]` | Mark names excluded from `tool` projection; excluded marks retain exporter-native handling. Metadata `hook_event_name` aliases are also matched. | -| `attribute_mappings` | `[]` | Copies each fully qualified projected `key` to its `alias` without changing the OTLP type. Set both values to nonblank strings, and use each alias only once. | -| `transport` | `http_binary` | `http_binary` or `grpc`. | -| `endpoint` | Exporter default | OTLP endpoint. | -| `headers` | `{}` | String-to-string exporter headers. | -| `resource_attributes` | `{}` | String-to-string OTLP resource attributes. | -| `service_name` | `nemo-relay` | `service.name` resource attribute. | -| `service_namespace` | Omitted | Optional `service.namespace`. | -| `service_version` | Omitted | Optional `service.version`. | -| `instrumentation_scope` | Omitted | Optional instrumentation scope name. | -| `timeout_millis` | `3000` | Export timeout. | - -## Expected Output - -The backend should show OpenInference-oriented spans for scopes, tools, and LLM -calls grouped by root scope. LLM usage metadata appears as token counters when -provider responses include usage information. LLM request and response -messages, system prompts, and model-emitted tool calls are emitted as -flattened OpenInference attributes when available from codec annotations or -supported replay request/response payloads. Tool schemas, finish reasons, -and invocation parameters are emitted when typed codec annotations supply -them. Exported LLM attributes exclude request headers and other non-observable -transport metadata. - -The default `inherit` projection preserves exporter-native mark handling: a -mark with an active parent span is a span event, while an orphan mark is a -standalone zero-duration mark span. `mark_projection = "event"` explicitly -selects that representation. With `mark_projection = "tool"`, each eligible -mark becomes a zero-duration span (a child span when parent context is -available) with `openinference.span.kind = "TOOL"` and the original mark -payload, category, profile, timestamp, and parent identifiers retained as -attributes. High-volume `llm.chunk` marks retain exporter-native handling by -default and when excluded from tool projection. - -Add other event names to `mark_exclude_names` for a backend to keep those -marks in exporter-native form rather than visible tool children. The exclusion -list affects only tool projection; it does not remove mark payload or metadata. -Set `mark_exclude_names = []` to disable the default `llm.chunk` exclusion. - -Each lifecycle span includes `nemo_relay.uuid` and `nemo_relay.parent_uuid` -attributes. These values match ATIF `step.extra.ancestry.function_id` and -`step.extra.ancestry.parent_id` for the same events. For plugin-managed ATIF, -the trajectory-root span's `nemo_relay.uuid` also matches the ATIF `session_id`. -Backend-native `trace_id` and `span_id` values are not written into ATIF. - -Coding-agent trace roots also carry `session.id`, optional `user.id`, and -`nemo_relay.session.instance_id`. The first value is the logical harness -session ID, while the Relay instance ID is the existing root scope UUID shared -by trace roots from one runtime session instance. These fields are root-only: -filter matching roots first, then use the OpenInference backend's `trace_id` to -select child rows. OpenInference and generic OpenTelemetry export generate -independent trace and span IDs, but retain the same Relay instance ID and -`nemo_relay.uuid` values. The `session.start` mark carries the same correlation -fields whether represented as a span event or an orphan zero-duration span. - -LLM token counts appear as `llm.token_count.prompt`, `llm.token_count.completion`, -`llm.token_count.total`, and `llm.token_count.prompt_details.cache_read`/`cache_write`. -Cost appears as USD-denominated `llm.cost.total`. Refer to -[Token and Cost Field Semantics](/integrate-into-frameworks/provider-response-codecs#token-and-cost-field-semantics) -for the full mapping. - -NeMo Relay projects top-level lifecycle payload fields to typed OTLP attributes -with dotted names. Non-LLM start metadata and all end metadata use the -`openinference.metadata` prefix, so `metadata = { tenant = "acme" }` becomes -`openinference.metadata.tenant = "acme"`. Non-LLM start events use -`nemo_relay.start.data`, `nemo_relay.start.input`, and -`nemo_relay.handle_attributes`. End events use `nemo_relay.end.data` and -`nemo_relay.end.output`. LLM start events use OpenInference semantic input -attributes instead of those generic start projections, and their final metadata -comes from the end event. Mark data, metadata, attributes, and category-profile -fields use the corresponding `nemo_relay.mark.*` prefixes. - -Scalar strings, booleans, and numbers that fit an OTLP numeric type keep their -types. NeMo Relay emits larger unsigned integers as strings. When a top-level -field contains an object or array, NeMo Relay emits its value as a JSON string -at that field's dotted name. Nested `null` values remain in that string, but a -top-level field whose value is `null` is omitted. NeMo Relay no longer emits the -old aggregate `*_json` payload attributes. The exporter still keeps the -OpenInference `metadata` JSON-string attribute for backend compatibility. - -Configure an alias when a backend expects a different attribute name: - -```toml -[components.config.openinference] -attribute_mappings = [ - { key = "openinference.metadata.tenant", alias = "tenant.id" }, -] -``` - -The source attribute remains in the span. If the span already contains -`tenant.id`, NeMo Relay keeps the existing value instead of replacing it with -the alias. - -Redact sensitive event payloads with sanitize guardrails before production -export. +The endpoint emits the existing OpenInference scope, tool, LLM, and mark +projection with its fixed default behavior. Mark and attribute-alias controls +are not configurable. -Register the plugin before the first instrumented request and clear it during -graceful shutdown. Calling subscriber flush delivers queued events to the -tracing subscriber, but it does not necessarily drain the tracer provider's -export processor. +Set `OTEL_AUTHORIZATION` to the complete authorization header value before +activation. NeMo Relay snapshots the value when the plugin +activates. The variable must be set and nonblank. A header name cannot appear +in both `headers` and `header_env`, including names that differ only by ASCII +case. The resolved value cannot have surrounding whitespace. -## Plugin Configuration +For the complete endpoint field table, multi-endpoint behavior, and version-2 +migration, refer to +[OpenTelemetry](/configure-plugins/observability/opentelemetry). -Use plugin configuration when the application should let NeMo Relay own the -OpenInference subscriber lifecycle. The following examples configure and -activate the OpenInference exporter through each supported language binding. +## Direct Subscriber -`validate()` checks only the supplied in-memory object. `initialize()` also -layers discovered `plugins.toml` configuration. For effective file-backed -validation, refer to [Plugin Configuration Files](/configure-plugins/plugin-configuration-files) -and run the gateway with the same configuration path that production uses. +Use `OpenTelemetrySubscriber` with the OpenInference discriminator: ```python -import asyncio +from nemo_relay import OpenTelemetryConfig, OpenTelemetrySubscriber -from nemo_relay import plugin -from nemo_relay.observability import ComponentSpec, ObservabilityConfig, OtlpConfig - -config = plugin.PluginConfig( - components=[ - ComponentSpec( - ObservabilityConfig( - openinference=OtlpConfig( - enabled=True, - transport="http_binary", - endpoint="http://localhost:6006/v1/traces", - service_name="agent-service", - service_namespace="nemo", - service_version="1.0.0", - instrumentation_scope="nemo-relay-openinference", - resource_attributes={"deployment.environment": "dev"}, - headers={"authorization": "Bearer "}, - ) - ) - ) - ] +config = OpenTelemetryConfig( + "openinference", + "http://localhost:6006/v1/traces", ) - -report = plugin.validate(config) -if any(diagnostic["level"] == "error" for diagnostic in report["diagnostics"]): - raise RuntimeError(report["diagnostics"]) - -async def main(): - await plugin.initialize(config) - try: - # Run instrumented application work here. - pass - finally: - plugin.clear() - -asyncio.run(main()) -``` - - - - -```js -const plugin = require("nemo-relay-node/plugin"); -const observability = require("nemo-relay-node/observability"); - -void (async () => { - await plugin.initialize({ - version: 1, - components: [ - observability.ComponentSpec({ - version: 2, - openinference: observability.otlpConfig({ - enabled: true, - transport: "http_binary", - endpoint: "http://localhost:6006/v1/traces", - service_name: "agent-service", - service_namespace: "nemo", - service_version: "1.0.0", - instrumentation_scope: "nemo-relay-openinference", - resource_attributes: { - "deployment.environment": "dev", - }, - headers: { - authorization: "Bearer ", - }, - }), - }), - ], - }); - - try { - // Run instrumented application work here. - } finally { - plugin.clear(); - } -})().catch((error) => { - console.error(error); - process.exitCode = 1; -}); -``` - - - - -```rust -#[tokio::main] -async fn main() -> Result<(), Box> { -use nemo_relay::observability::plugin_component::{ - ComponentSpec, ObservabilityConfig, OtlpSectionConfig, -}; -use nemo_relay::plugin::{ - clear_plugin_configuration, initialize_plugins, validate_plugin_config, PluginConfig, -}; - -let component = ComponentSpec::new(ObservabilityConfig { - openinference: Some(OtlpSectionConfig { - enabled: true, - transport: "http_binary".into(), - endpoint: Some("http://localhost:6006/v1/traces".into()), - service_name: "agent-service".into(), - service_namespace: Some("nemo".into()), - service_version: Some("1.0.0".into()), - instrumentation_scope: Some("nemo-relay-openinference".into()), - resource_attributes: [("deployment.environment".into(), "dev".into())].into(), - headers: [("authorization".into(), "Bearer ".into())].into(), - ..OtlpSectionConfig::default() - }), - ..ObservabilityConfig::default() -}); - -let config = PluginConfig { - version: 1, - components: vec![component.into()], - policy: Default::default(), -}; - -let report = validate_plugin_config(&config); -assert!(!report.has_errors()); - -let _active = initialize_plugins(config).await?; - -// Run instrumented application work here. - -clear_plugin_configuration()?; -Ok(()) -} -``` - - - - - -## Manual API - -Use the manual subscriber API when you need an explicit subscriber name or -direct control over when spans are exported. `force_flush()` first waits for -shared subscriber delivery and then asks the tracer provider to export finished -spans. `shutdown()` waits for shared subscriber work and then shuts down the -provider. During plugin teardown, `plugin.clear()` or -`clear_plugin_configuration()` invokes the owned subscriber shutdown path. - - - -```python -from nemo_relay import OpenInferenceConfig, OpenInferenceSubscriber - -config = OpenInferenceConfig() -config.transport = "http_binary" -config.endpoint = "http://localhost:6006/v1/traces" config.service_name = "agent-service" -config.set_resource_attribute("deployment.environment", "dev") - -subscriber = OpenInferenceSubscriber(config) -subscriber.register("openinference-exporter") - -# Run instrumented application work here. - -subscriber.force_flush() -subscriber.deregister("openinference-exporter") -subscriber.shutdown() +subscriber = OpenTelemetrySubscriber(config) ``` - + +```javascript +const { OpenTelemetrySubscriber } = require("nemo-relay-node"); - -```js -const { OpenInferenceSubscriber } = require("nemo-relay-node"); - -const subscriber = new OpenInferenceSubscriber({ - transport: "http_binary", +const subscriber = new OpenTelemetrySubscriber({ + type: "openinference", endpoint: "http://localhost:6006/v1/traces", serviceName: "agent-service", - resourceAttributes: { - "deployment.environment": "dev", - }, }); -subscriber.register("openinference-exporter"); - -try { - // Run instrumented application work here. - - subscriber.forceFlush(); -} finally { - subscriber.deregister("openinference-exporter"); - subscriber.shutdown(); -} ``` - - ```rust -use nemo_relay::observability::openinference::{ - OpenInferenceConfig, OpenInferenceSubscriber, -}; - -fn main() -> Result<(), Box> { - let config = OpenInferenceConfig::new() - .with_service_name("agent-service") - .with_endpoint("http://localhost:6006/v1/traces") - .with_resource_attribute("deployment.environment", "dev"); - let subscriber = OpenInferenceSubscriber::new(config)?; - subscriber.register("openinference-exporter")?; - - // Run instrumented application work here. +use nemo_relay::observability::OpenTelemetryType; +use nemo_relay::observability::otel::{OpenTelemetryConfig, OpenTelemetrySubscriber}; - subscriber.force_flush()?; - let _ = subscriber.deregister("openinference-exporter")?; - subscriber.shutdown()?; - Ok(()) -} +let config = OpenTelemetryConfig::new( + OpenTelemetryType::OpenInference, + "http://localhost:6006/v1/traces", +) +.with_service_name("agent-service"); +let subscriber = OpenTelemetrySubscriber::new(config)?; ``` - - -## Common Configuration and Runtime Issues - -- `transport` is not `http_binary` or `grpc`. -- Headers or resource attributes are not string-to-string maps. -- The OpenInference feature is unavailable in the current build or target. -- Tool and LLM calls do not use managed helpers, so spans contain only scope - lifecycle data. -- Abrupt termination can discard events that are still in the shared dispatcher - or spans that are still in the provider queue. Backend visibility also - depends on transport success, timeouts, and backend processing. +Register the subscriber before instrumented work. During graceful teardown, +deregister it, flush it, and then shut it down. diff --git a/docs/configure-plugins/observability/opentelemetry.mdx b/docs/configure-plugins/observability/opentelemetry.mdx index 48ed44383..8daeea9fb 100644 --- a/docs/configure-plugins/observability/opentelemetry.mdx +++ b/docs/configure-plugins/observability/opentelemetry.mdx @@ -1,22 +1,36 @@ --- title: "OpenTelemetry" -description: "Configure OpenTelemetry Protocol trace export for NeMo Relay events." +description: "Export NeMo Relay traces through typed OpenTelemetry endpoints." position: 5 --- {/* SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. SPDX-License-Identifier: Apache-2.0 */} +Use the `opentelemetry` section to export traces to one or more OpenTelemetry +Protocol (OTLP) destinations. OpenTelemetry support is always included; no +Cargo feature enables or disables it. -Use the `opentelemetry` section when you want NeMo Relay lifecycle events -exported as generic OpenTelemetry Protocol (OTLP) trace spans. +Each endpoint selects one fixed semantic projection: -OpenTelemetry export is a good fit when your tracing backend already expects -OTLP spans and you want NeMo Relay scopes, tool calls, LLM calls, and marks to -appear in the same tracing pipeline as the rest of the application. +| Type | Projection | +|---|---| +| `full` | Complete NeMo Relay projection, including `nemo_relay.*` attributes and native mark handling. | +| `gen_ai` | OpenTelemetry GenAI semantic conventions only. | +| `openinference` | OpenInference-compatible spans with the existing default mark handling. | -## `plugins.toml` Example +You can repeat a type or combine types. Each endpoint owns an independent exporter +and can use a different endpoint. + +The `gen_ai` projection targets the +[OpenTelemetry GenAI semantic-conventions v1.42-era snapshot](https://github.com/open-telemetry/semantic-conventions-genai/tree/43633a68ef8f8ed87a1d5eb205990311ca708bf1). +Use that pinned snapshot when comparing emitted operation and attribute names +with collector or backend schemas. + +NeMo Relay uses OpenTelemetry Rust `0.32`. It deterministically derives +compliant trace and span IDs from Relay lifecycle UUIDs, so endpoints that +receive the same event stream use the same identifiers and parentage. -Add the following OpenTelemetry exporter configuration to `plugins.toml`: +## `plugins.toml` Example ```toml version = 1 @@ -26,370 +40,139 @@ kind = "observability" enabled = true [components.config] -version = 2 +version = 3 [components.config.opentelemetry] enabled = true -transport = "http_binary" + +[[components.config.opentelemetry.endpoints]] +type = "gen_ai" endpoint = "http://localhost:4318/v1/traces" +transport = "http_binary" service_name = "agent-service" -service_namespace = "nemo" -service_version = "1.0.0" -instrumentation_scope = "nemo-relay-otel" -timeout_millis = 3000 -[components.config.opentelemetry.headers] -authorization = "Bearer " +[components.config.opentelemetry.endpoints.header_env] +authorization = "OTEL_AUTHORIZATION" -[components.config.opentelemetry.resource_attributes] -"deployment.environment" = "dev" +[[components.config.opentelemetry.endpoints]] +type = "openinference" +endpoint = "http://localhost:6006/v1/traces" +service_name = "agent-service" ``` -This configuration registers a plugin-owned OpenTelemetry subscriber and sends -NeMo Relay trace spans to the configured OTLP endpoint. - -## Fields +When `enabled = true`, configure at least one endpoint. NeMo Relay constructs every +endpoint before registering the fan-out subscriber. An invalid endpoint prevents +activation, and a delivery failure from one exporter does not stop application +work or delivery to the other exporters. -The following table describes OpenTelemetry exporter settings: +## Endpoint Fields | Field | Default | Notes | |---|---|---| -| `enabled` | `false` | Must be `true` to construct and register the subscriber. | -| `mark_projection` | `inherit` | `inherit` uses exporter-native handling; `event` forces span events; `tool` emits zero-duration spans, parented as children when context is available, for trace-tree visibility. | -| `mark_exclude_names` | `["llm.chunk"]` | Mark names excluded from `tool` projection; excluded marks retain exporter-native handling. Metadata `hook_event_name` aliases are also matched. | -| `attribute_mappings` | `[]` | Copies each fully qualified projected `key` to its `alias` without changing the OTLP type. Set both values to nonblank strings, and use each alias only once. | +| `type` | Required | `full`, `gen_ai`, or `openinference`. | +| `endpoint` | Required | Nonblank OTLP endpoint. | | `transport` | `http_binary` | `http_binary` or `grpc`. | -| `endpoint` | Exporter default | OTLP endpoint. | -| `headers` | `{}` | String-to-string exporter headers. | -| `resource_attributes` | `{}` | String-to-string OTLP resource attributes. | -| `service_name` | `nemo-relay` | `service.name` resource attribute. | +| `service_name` | `unknown_service` | `service.name` resource attribute. | | `service_namespace` | Omitted | Optional `service.namespace`. | | `service_version` | Omitted | Optional `service.version`. | -| `instrumentation_scope` | Omitted | Optional instrumentation scope name. | +| `instrumentation_scope` | `opentelemetry` | Instrumentation scope name. | | `timeout_millis` | `3000` | Export timeout. | +| `headers` | `{}` | String-to-string exporter headers. | +| `header_env` | `{}` | Header names mapped to environment variable names containing secret values. | +| `resource_attributes` | `{}` | String-to-string resource attributes. | -## Expected Output - -The collector should receive OTLP trace export requests. The tracing backend -should show spans for NeMo Relay scopes, tools, LLM calls, and marks grouped by -root scope. - -The default `inherit` projection follows exporter-native handling: a mark with -an active parent span is a span event, while an orphan mark is a standalone -zero-duration `mark:` span. `mark_projection = "event"` explicitly selects -that representation. Set `mark_projection = "tool"` only when the target -backend needs eligible marks represented as visible child spans. Projected -marks use `SpanKind::Internal`, carry -`nemo_relay.mark.projection = "tool"`, and retain mark UUID, parentage, -category/profile, and payload attributes. High-volume `llm.chunk` marks retain -exporter-native handling by default and when excluded from tool projection. - -Add other event names to `mark_exclude_names` for a backend to keep those -marks in exporter-native form rather than visible tool children. The exclusion -list affects only tool projection; it does not remove mark payload or metadata. -Set `mark_exclude_names = []` to disable the default `llm.chunk` exclusion. - -Each lifecycle span includes `nemo_relay.uuid` and `nemo_relay.parent_uuid` -attributes. These values match ATIF `step.extra.ancestry.function_id` and -`step.extra.ancestry.parent_id` for the same events. For plugin-managed ATIF, -the trajectory-root span's `nemo_relay.uuid` also matches the ATIF `session_id`. -Backend-native `trace_id` and `span_id` values are not written into ATIF. - -NeMo Relay projects top-level lifecycle payload fields to typed OTLP attributes -with dotted names. For example, `metadata = { tenant = "acme" }` becomes -`nemo_relay.start.metadata.tenant = "acme"`. -- Start events use the -`nemo_relay.start.data`, `nemo_relay.start.metadata`, and -`nemo_relay.start.input` prefixes. -- End events use `nemo_relay.end.data`, -`nemo_relay.end.metadata`, and `nemo_relay.end.output`. -- Handle attributes use -`nemo_relay.handle_attributes`. Mark data, metadata, attributes, and -category-profile fields use the corresponding `nemo_relay.mark.*` prefixes. - -Scalar strings, booleans, and numbers that fit an OTLP numeric type keep their -types. NeMo Relay emits larger unsigned integers as strings. When a top-level -field contains an object or array, NeMo Relay emits its value as a JSON string -at that field's dotted name. Nested `null` values remain in that string, but a -top-level field whose value is `null` is omitted. NeMo Relay no longer emits the -old aggregate `*_json` payload attributes. - -Configure an alias when a backend expects a different attribute name: - -```toml -[components.config.opentelemetry] -attribute_mappings = [ - { key = "nemo_relay.start.metadata.tenant", alias = "tenant.id" }, -] -``` - -The source attribute remains in the span. If the span already contains -`tenant.id`, NeMo Relay keeps the existing value instead of replacing it with -the alias. - -Coding-agent trace roots also carry these correlation attributes: - -| Attribute | Meaning | -|---|---| -| `session.id` | Logical harness session ID. | -| `user.id` | Optional top-level string `user_id` from session metadata. | -| `nemo_relay.session.instance_id` | Relay-owned root scope UUID shared by trace roots from the same runtime session instance. | - -These canonical fields are emitted on trace roots rather than repeated on -every child span. Filter roots by `session.id`, `user.id`, or -`nemo_relay.session.instance_id`, then use the backend `trace_id` to select the -remaining rows in each trace. A `session.start` mark carries the same fields: -it is a span event when a parent is active and a zero-duration root span when -it is orphaned. - -For LLM end spans, cost is emitted as `nemo_relay.llm.cost.total` and -`nemo_relay.llm.cost.currency` (any currency). Token counts are not emitted as -discrete attributes. Refer to -[Token and Cost Field Semantics](/integrate-into-frameworks/provider-response-codecs#token-and-cost-field-semantics) -for the full mapping. - -Register the plugin before the first instrumented request, use stable service -identity fields, keep credentials outside source code, and clear the plugin -during graceful shutdown. Calling subscriber flush delivers queued events to -the tracing subscriber, but it does not necessarily drain the tracer provider's -export processor. - -## Plugin Configuration - -Use plugin configuration when the application should let NeMo Relay own the -OpenTelemetry subscriber lifecycle. The following examples configure and -activate the OpenTelemetry exporter through each supported language binding. - -`validate()` checks only the supplied in-memory object. `initialize()` also -layers discovered `plugins.toml` configuration. For effective file-backed -validation, refer to [Plugin Configuration Files](/configure-plugins/plugin-configuration-files) -and run the gateway with the same configuration path that production uses. - - - -```python -import asyncio - -from nemo_relay import plugin -from nemo_relay.observability import ComponentSpec, ObservabilityConfig, OtlpConfig - -config = plugin.PluginConfig( - components=[ - ComponentSpec( - ObservabilityConfig( - opentelemetry=OtlpConfig( - enabled=True, - transport="http_binary", - endpoint="http://localhost:4318/v1/traces", - service_name="agent-service", - service_namespace="nemo", - service_version="1.0.0", - instrumentation_scope="nemo-relay-otel", - resource_attributes={"deployment.environment": "dev"}, - headers={"authorization": "Bearer "}, - ) - ) - ) - ] -) - -report = plugin.validate(config) -if any(diagnostic["level"] == "error" for diagnostic in report["diagnostics"]): - raise RuntimeError(report["diagnostics"]) - -async def main(): - await plugin.initialize(config) - try: - # Run instrumented application work here. - pass - finally: - plugin.clear() - -asyncio.run(main()) -``` - - - - -```js -const plugin = require("nemo-relay-node/plugin"); -const observability = require("nemo-relay-node/observability"); - -void (async () => { - await plugin.initialize({ - version: 1, - components: [ - observability.ComponentSpec({ - version: 2, - opentelemetry: observability.otlpConfig({ - enabled: true, - transport: "http_binary", - endpoint: "http://localhost:4318/v1/traces", - service_name: "agent-service", - service_namespace: "nemo", - service_version: "1.0.0", - instrumentation_scope: "nemo-relay-otel", - resource_attributes: { - "deployment.environment": "dev", - }, - headers: { - authorization: "Bearer ", - }, - }), - }), - ], - }); - - try { - // Run instrumented application work here. - } finally { - plugin.clear(); - } -})().catch((error) => { - console.error(error); - process.exitCode = 1; -}); -``` - - - - -```rust -#[tokio::main] -async fn main() -> Result<(), Box> { -use nemo_relay::observability::plugin_component::{ - ComponentSpec, ObservabilityConfig, OtlpSectionConfig, -}; -use nemo_relay::plugin::{ - clear_plugin_configuration, initialize_plugins, validate_plugin_config, PluginConfig, -}; - -let component = ComponentSpec::new(ObservabilityConfig { - opentelemetry: Some(OtlpSectionConfig { - enabled: true, - transport: "http_binary".into(), - endpoint: Some("http://localhost:4318/v1/traces".into()), - service_name: "agent-service".into(), - service_namespace: Some("nemo".into()), - service_version: Some("1.0.0".into()), - instrumentation_scope: Some("nemo-relay-otel".into()), - resource_attributes: [("deployment.environment".into(), "dev".into())].into(), - headers: [("authorization".into(), "Bearer ".into())].into(), - ..OtlpSectionConfig::default() - }), - ..ObservabilityConfig::default() -}); - -let config = PluginConfig { - version: 1, - components: vec![component.into()], - policy: Default::default(), -}; - -let report = validate_plugin_config(&config); -assert!(!report.has_errors()); +Use `header_env` for secrets so configuration files contain only environment +variable names. Each variable contains the complete header value. NeMo Relay +validates variable names without reading their values, then resolves and +snapshots the values when the plugin activates. Every referenced variable name +must be nonblank and have no surrounding whitespace. Its value must be set and +nonblank, with no surrounding whitespace, when the component activates. A header name +cannot appear in both `headers` and `header_env`, including names that differ +only by ASCII case. Reactivate the plugin to pick up a changed environment +value. -let _active = initialize_plugins(config).await?; +Process-global `OTEL_EXPORTER_OTLP_HEADERS` and +`OTEL_EXPORTER_OTLP_TRACES_HEADERS` are rejected because they cannot be +isolated between endpoints. Put non-secret values in each endpoint's `headers` +map and secret variable references in `header_env`. -// Run instrumented application work here. +Projection behavior is fixed. The configuration does not expose +`mark_projection`, `mark_exclude_names`, `attribute_mappings`, +`semantic_selector`, or `capture_content`. -clear_plugin_configuration()?; -Ok(()) -} -``` +## GenAI Projection - +The `gen_ai` endpoint uses these operation names: - +| Relay scope | OpenTelemetry operation | +|---|---| +| Agent | `invoke_agent` | +| LLM | `chat`, `generate_content`, or `text_completion` | +| Tool | `execute_tool` | +| Embedder | `embeddings` | +| Retriever | `retrieval` | -## Manual API +Rerankers, marks, and unsupported scope types are omitted. Supported +descendants remain attached to their nearest exported ancestor. This +projection never emits `nemo_relay.*` fields and does not export message +content, tool payloads, or retrieval content. -Use the manual subscriber API when you need an explicit subscriber name or -direct control over when spans are exported. `force_flush()` first waits for -shared subscriber delivery and then asks the tracer provider to export finished -spans. `shutdown()` waits for shared subscriber work and then shuts down the -provider. During plugin teardown, `plugin.clear()` or -`clear_plugin_configuration()` invokes the owned subscriber shutdown path. +## Direct Subscriber ```python from nemo_relay import OpenTelemetryConfig, OpenTelemetrySubscriber -config = OpenTelemetryConfig() -config.transport = "http_binary" -config.endpoint = "http://localhost:4318/v1/traces" +config = OpenTelemetryConfig( + "gen_ai", + "http://localhost:4318/v1/traces", +) config.service_name = "agent-service" -config.set_resource_attribute("deployment.environment", "dev") - subscriber = OpenTelemetrySubscriber(config) -subscriber.register("otel-exporter") - -# Run instrumented application work here. - -subscriber.force_flush() -subscriber.deregister("otel-exporter") -subscriber.shutdown() ``` - - - -```js + +```javascript const { OpenTelemetrySubscriber } = require("nemo-relay-node"); const subscriber = new OpenTelemetrySubscriber({ - transport: "http_binary", + type: "gen_ai", endpoint: "http://localhost:4318/v1/traces", serviceName: "agent-service", - resourceAttributes: { - "deployment.environment": "dev", - }, }); -subscriber.register("otel-exporter"); - -try { - // Run instrumented application work here. - - subscriber.forceFlush(); -} finally { - subscriber.deregister("otel-exporter"); - subscriber.shutdown(); -} ``` - - ```rust +use nemo_relay::observability::OpenTelemetryType; use nemo_relay::observability::otel::{OpenTelemetryConfig, OpenTelemetrySubscriber}; -fn main() -> Result<(), Box> { - let config = OpenTelemetryConfig::http_binary("agent-service") - .with_endpoint("http://localhost:4318/v1/traces") - .with_resource_attribute("deployment.environment", "dev"); - let subscriber = OpenTelemetrySubscriber::new(config)?; - subscriber.register("otel-exporter")?; - - // Run instrumented application work here. - - subscriber.force_flush()?; - let _ = subscriber.deregister("otel-exporter")?; - subscriber.shutdown()?; - Ok(()) -} +let config = OpenTelemetryConfig::new( + OpenTelemetryType::GenAi, + "http://localhost:4318/v1/traces", +) +.with_service_name("agent-service"); +let subscriber = OpenTelemetrySubscriber::new(config)?; ``` - - -## Common Configuration and Runtime Issues +Direct construction creates one independently managed exporter. Register the +subscriber before instrumented work. During graceful teardown, deregister it, +call the binding's force-flush method (`force_flush()` or `forceFlush()`), and +then call `shutdown()`. + +## Version 2 to Version 3 + +Version 3 replaces the separate version-2 sections: + +- Move the old `opentelemetry` fields into one endpoint with `type = "full"`. +- Move the old `openinference` fields into the same section with + `type = "openinference"`. +- Use `type = "gen_ai"` for standardized GenAI-only output. -- `transport` is not `http_binary` or `grpc`. -- Headers or resource attributes are not string-to-string maps. -- The exporter feature is unavailable in the current build or target. -- The endpoint is unreachable at runtime. -- Abrupt termination can discard events that are still in the shared dispatcher - or spans that are still in the provider queue. Backend visibility also - depends on transport success, timeouts, and backend processing. +Version-2 OTLP section shapes are rejected when `version = 3`; NeMo Relay does +not silently normalize them. For complete before-and-after configuration and +binding API changes, refer to +[Migration Guides](/reference/migration-guides#observability-configuration-version-3). diff --git a/docs/configure-plugins/pii-redaction/configuration.mdx b/docs/configure-plugins/pii-redaction/configuration.mdx index d10f84813..911a3f587 100644 --- a/docs/configure-plugins/pii-redaction/configuration.mdx +++ b/docs/configure-plugins/pii-redaction/configuration.mdx @@ -87,8 +87,8 @@ Use either the legacy single-policy fields (`mode`, surface flags, `priority`, In profile-array mode, profiles execute by ascending priority and use array order to break ties. Relay assigns internal names such as `profile_0`, so profiles do not require IDs. Disabled profiles are validated but do not -register callbacks. The complete array is replaced as one value during config -layering. +register callbacks. Profile lists concatenate during config layering, with +higher-precedence profiles placed before lower-precedence profiles. ### Mixed-Provider Gateway Example diff --git a/docs/configure-plugins/plugin-configuration-files.mdx b/docs/configure-plugins/plugin-configuration-files.mdx index 3dbafbea3..37c05df70 100644 --- a/docs/configure-plugins/plugin-configuration-files.mdx +++ b/docs/configure-plugins/plugin-configuration-files.mdx @@ -39,7 +39,7 @@ kind = "observability" enabled = true [components.config] -version = 2 +version = 3 [components.config.atof] enabled = true @@ -100,7 +100,7 @@ kind = "observability" enabled = true [components.config] -version = 2 +version = 3 [components.config.atof] enabled = true @@ -260,9 +260,11 @@ When more than one `plugins.toml` file is discovered, later files have higher precedence. User config overrides project config, and project config overrides system config. -TOML tables merge recursively, while a higher-precedence array replaces the -lower-precedence array. For example, the following system configuration enables -one ATOF file sink: +TOML tables merge recursively. Top-level lists inside a component's `config` +concatenate, as do the declared observability destination lists. Entries from +the higher-precedence layer are placed before entries from the lower-precedence +layer. Other nested lists replace. For example, the following system +configuration enables one ATOF file sink: ```toml # system plugins.toml @@ -270,7 +272,7 @@ one ATOF file sink: kind = "observability" [components.config] -version = 2 +version = 3 [components.config.atof] enabled = true @@ -281,8 +283,7 @@ output_directory = "/var/log/nemo-relay" mode = "append" ``` -To change the file mode at user scope, repeat the complete sink because -`sinks` is an array: +The user scope can add another sink without repeating the system sink: ```toml # user plugins.toml @@ -293,32 +294,37 @@ kind = "observability" [[components.config.atof.sinks]] type = "file" -output_directory = "/var/log/nemo-relay" +output_directory = "~/.local/state/nemo-relay" mode = "overwrite" ``` The effective Agent Trajectory Observability Format (ATOF) configuration keeps -`version` and `enabled` from the system file. The user file replaces the -complete `sinks` array with the file sink that uses `mode = "overwrite"`. +`version` and `enabled` from the system file. Its `sinks` list contains the user +sink first, followed by the system sink. The top-level `components` array is special. Relay matches components by `kind` across files. A higher-precedence component with the same `kind` merges into the lower-precedence component. Relay adds a component with a different `kind` to the effective configuration. -Most components follow the general merge rules above. The built-in `pricing` -component has one additional merge rule: when both lower and -higher-precedence layers define `components.config.sources`, the -higher-precedence sources are placed before lower-precedence sources instead of -replacing them. This lets a user or project file override one model while still -falling back to fleet-managed model pricing from `/etc/nemo-relay/plugins.toml`. +This behavior applies to list fields declared at the top level of a component's +`config`. It also applies to the observability destination lists +`atof.sinks`, `opentelemetry.endpoints`, and `atif.storage`. For example, +`pricing.sources` and PII redaction `profiles` are top-level component config +lists and concatenate across layers. +Higher-precedence pricing sources can therefore override one model while still +falling back to fleet-managed model pricing from +`/etc/nemo-relay/plugins.toml`. + +Lists nested inside arbitrary structured values are not treated as top-level +plugin lists; a higher-precedence value replaces those lists. Declare each `kind` at most once inside one `plugins.toml` file. Duplicate component kinds in the same file fail before merge. Duplicate singleton components that reach plugin validation also fail validation. -Higher-precedence values replace arrays inside component config. Higher-precedence -tables merge recursively inside component config. +Outside component `config` objects, higher-precedence arrays and scalar values +replace lower-precedence values. Tables continue to merge recursively. ## Configuration Layering @@ -368,10 +374,11 @@ enabled = false The merged configuration can still contain an inherited ATOF `sinks` array, but the runtime ignores the section because `enabled = false`. -To override an inherited non-default field with its default value, write the -default explicitly in the higher-precedence file. For a field inside an array, -repeat the complete array entry. For example, repeat an inherited file sink and -set its `mode` to `append`. +To override an inherited non-default scalar field with its default value, write +the default explicitly in the higher-precedence file. List entries are not +merged item by item: higher-precedence entries are added before inherited +entries. To change or remove an inherited sink, profile, source, or other list +entry, edit the layer that declares it. There is no tombstone syntax for deleting an inherited nested field while keeping the rest of the lower-precedence component. To remove inherited settings diff --git a/docs/configure-plugins/switchyard/configuration.mdx b/docs/configure-plugins/switchyard/configuration.mdx index 54bce55c0..2b09b555e 100644 --- a/docs/configure-plugins/switchyard/configuration.mdx +++ b/docs/configure-plugins/switchyard/configuration.mdx @@ -114,7 +114,7 @@ kind = "observability" enabled = true [components.config] -version = 2 +version = 3 [components.config.atof] enabled = true @@ -273,7 +273,7 @@ kind = "observability" enabled = true [components.config] -version = 2 +version = 3 [components.config.atof] enabled = true diff --git a/docs/contribute/runtime-contract-docs.mdx b/docs/contribute/runtime-contract-docs.mdx index 8c0040c43..39679fffd 100644 --- a/docs/contribute/runtime-contract-docs.mdx +++ b/docs/contribute/runtime-contract-docs.mdx @@ -64,7 +64,7 @@ says otherwise. ### ATOF Versus Projections -ATOF is the canonical event stream. ATIF, OpenTelemetry, and OpenInference are +ATOF is the canonical event stream. ATIF and typed OpenTelemetry output are downstream projections over those events. Projection docs should not redefine scope ownership, middleware ordering, provider payload decoding, replay policy, or cost policy. @@ -114,8 +114,8 @@ Before landing a change that touches shared runtime wording, check: - Sanitize guardrails are described as emitted-payload changes, not real callback argument or return-value changes. - Subscriber and exporter work remains downstream from event construction. -- ATOF remains the raw canonical event format, while ATIF, OpenTelemetry, and - OpenInference remain projections. +- ATOF remains the raw canonical event format, while ATIF and typed + OpenTelemetry output remain projections. - Examples consume shared terminology instead of defining new support or contract language locally. - The [Support Matrix](/reference/support-matrix) is the canonical source for diff --git a/docs/getting-started/configuration.mdx b/docs/getting-started/configuration.mdx index 1745dfbb5..dc0252f6d 100644 --- a/docs/getting-started/configuration.mdx +++ b/docs/getting-started/configuration.mdx @@ -47,10 +47,11 @@ rules. ## Observability Setup Agent Trajectory Observability Format (ATOF) exporters, Agent Trajectory -Interchange Format (ATIF) exporters, OpenTelemetry subscribers, and -OpenInference subscribers can be configured directly through binding-native -config objects. Use the built-in `observability` plugin when you want one -plugin component to own standard exporter setup and teardown. Refer to +Interchange Format (ATIF) exporters, and typed OpenTelemetry subscribers can +be configured directly through binding-native config objects. Select the +`full`, `gen_ai`, or `openinference` projection when constructing each +OpenTelemetry subscriber. Use the built-in `observability` plugin when you +want one plugin component to own standard exporter setup and teardown. Refer to [Observability Configuration](/configure-plugins/observability/configuration) and [Observability](/configure-plugins/observability/about) for the supported export paths. @@ -59,9 +60,10 @@ Outside operational logging, NeMo Relay does not require application-level environment variables for normal runtime use. Configure most behavior through API objects, registration calls, or plugin configuration. -`OTEL_*` variables are only relevant when the underlying OpenTelemetry exporter -reads endpoint settings from the environment. Prefer explicit config objects in -application code so the active export settings are visible in docs, tests, and +Every OpenTelemetry config requires an explicit nonblank endpoint. For plugin +configuration, use an endpoint's `header_env` map when a header value must come +from an environment variable. Keep endpoint addresses and other export settings +explicit so the active configuration remains visible in docs, tests, and deployment manifests. ## Adaptive Setup diff --git a/docs/integrate-into-frameworks/provider-response-codecs.mdx b/docs/integrate-into-frameworks/provider-response-codecs.mdx index 5111e201e..a2974d6e6 100644 --- a/docs/integrate-into-frameworks/provider-response-codecs.mdx +++ b/docs/integrate-into-frameworks/provider-response-codecs.mdx @@ -326,7 +326,7 @@ Every token and cost value is **per LLM call** (one provider completion) unless it is an explicit aggregate: - `AnnotatedLlmResponse.usage` — The single LLM end event it is attached to. -- OpenTelemetry and OpenInference attributes — The single LLM span they appear on; +- OpenTelemetry projection attributes — The single LLM span they appear on; spans are never summed across calls. - ATIF steps — An exported LLM call typically yields a `user` start step (no metrics) and an `agent` end step that carries the call's `metrics`. @@ -389,18 +389,20 @@ currencies. Each exporter projects `usage`/`cost` differently. Projections do not change the canonical fields above. -| | ATOF | ATIF step / `final_metrics` | OpenInference | OpenTelemetry | -|---|---|---|---|---| -| Prompt tokens | full `usage` preserved | `prompt_tokens` / `total_prompt_tokens` | `llm.token_count.prompt` | not emitted | -| Completion tokens | preserved | `completion_tokens` / `total_completion_tokens` | `llm.token_count.completion` | not emitted | -| Total tokens | preserved | no first-class field | `llm.token_count.total` | not emitted | -| Cache read / write | preserved | summed into `cached_tokens` / `total_cached_tokens` | `llm.token_count.prompt_details.cache_read` / `…cache_write` | not emitted | -| Cost | full `cost` preserved | `cost_usd` / `total_cost_usd` (USD only) | `llm.cost.total` (USD only) | `nemo_relay.llm.cost.total` + `nemo_relay.llm.cost.currency` (any currency) | - -OpenTelemetry carries cost in any currency, while ATIF and OpenInference report cost -only when it is USD-denominated and otherwise omit it. ATIF derives metrics from -codec-normalized usage where available and fills missing supported fields from the -raw payload. `metrics.extra` holds only unmapped keys from the raw +| | ATOF | ATIF step / `final_metrics` | `openinference` | `full` | `gen_ai` | +|---|---|---|---|---|---| +| Prompt tokens | full `usage` preserved | `prompt_tokens` / `total_prompt_tokens` | `llm.token_count.prompt` | not emitted | `gen_ai.usage.input_tokens` | +| Completion tokens | preserved | `completion_tokens` / `total_completion_tokens` | `llm.token_count.completion` | not emitted | `gen_ai.usage.output_tokens` | +| Total tokens | preserved | no first-class field | `llm.token_count.total` | not emitted | not emitted | +| Cache read / write | preserved | summed into `cached_tokens` / `total_cached_tokens` | `llm.token_count.prompt_details.cache_read` / `…cache_write` | not emitted | `gen_ai.usage.cache_read.input_tokens` / `gen_ai.usage.cache_creation.input_tokens` | +| Cost | full `cost` preserved | `cost_usd` / `total_cost_usd` (USD only) | `llm.cost.total` (USD only) | `nemo_relay.llm.cost.total` + `nemo_relay.llm.cost.currency` (any currency) | not emitted | + +The `full` OpenTelemetry projection carries cost in any currency, while ATIF +and the `openinference` projection report cost only when it is USD-denominated +and otherwise omit it. The `gen_ai` projection emits standardized token +attributes but no cost attributes. ATIF derives metrics from codec-normalized +usage where available and fills missing supported fields from the raw payload. +`metrics.extra` holds only unmapped keys from the raw `usage`/`token_usage` object (for example reasoning token counts, or a raw `total_tokens`), and only when the step already has a recognized metric. Normalized-only or total-only values are not projected. @@ -421,8 +423,9 @@ consumers. The following behaviors are intentional in this release but can change later: -- OpenTelemetry emits cost only, not token counts. -- ATIF and OpenInference report cost only in USD. +- The `full` OpenTelemetry projection emits cost only, not token counts. +- The `gen_ai` OpenTelemetry projection emits token counts but not cost. +- ATIF and the `openinference` projection report cost only in USD. - Reasoning tokens are not a first-class `Usage` field. - Bindings expose `usage`/`cost` as snake_case JSON rather than typed objects. diff --git a/docs/nemo-relay-cli/claude-code.mdx b/docs/nemo-relay-cli/claude-code.mdx index e49c7c861..f3f5f1a7a 100644 --- a/docs/nemo-relay-cli/claude-code.mdx +++ b/docs/nemo-relay-cli/claude-code.mdx @@ -121,12 +121,18 @@ version = 1 kind = "observability" enabled = true +[components.config] +version = 3 + [components.config.atif] enabled = true output_directory = ".nemo-relay/atif" -[components.config.openinference] +[components.config.opentelemetry] enabled = true + +[[components.config.opentelemetry.endpoints]] +type = "openinference" endpoint = "http://127.0.0.1:4318/v1/traces" ``` @@ -198,8 +204,8 @@ printf '{"session_id":"smoke-claude","hook_event_name":"SessionStart"}' \ The response should be valid Claude Code hook JSON. For most lifecycle events it is an allow/continue response. A full observability smoke fixture should produce -expected OpenInference spans, raw ATOF events, and ATIF trajectories for at -least one user turn, one LLM call, and one tool call. +expected `openinference` OpenTelemetry spans, raw ATOF events, and ATIF +trajectories for at least one user turn, one LLM call, and one tool call. ## Verify Export diff --git a/docs/reference/migration-guides.mdx b/docs/reference/migration-guides.mdx index edfeada6f..5f5b6aca3 100644 --- a/docs/reference/migration-guides.mdx +++ b/docs/reference/migration-guides.mdx @@ -299,6 +299,131 @@ Before deployment: 7. Remove fixed PII `codec` values from mixed-provider configurations. 8. Test buffered and streaming calls for every provider and custom codec that your deployment uses. +### Observability Configuration Version 3 + +Observability configuration version 3 replaces the two version-2 OTLP sections +with one typed, multi-endpoint `opentelemetry` section. OpenTelemetry and +OpenInference support is always built in and no longer uses the `otel` or +`openinference` Cargo features. + + +Version 3 does not normalize version-2 OTLP fields. Migrate the complete +configuration before changing `components.config.version` to `3`. + + +The following example shows the version-2 shape: + +```toml +[components.config] +version = 2 + +[components.config.opentelemetry] +enabled = true +endpoint = "http://localhost:4318/v1/traces" +transport = "http_binary" +service_name = "relay-service" + +[components.config.opentelemetry.headers] +x-tenant-id = "demo" + +[components.config.openinference] +enabled = true +endpoint = "http://localhost:6006/v1/traces" +transport = "http_binary" +service_name = "relay-service" +``` + +Replace it with typed endpoints: + +```toml +[components.config] +version = 3 + +[components.config.opentelemetry] +enabled = true + +[[components.config.opentelemetry.endpoints]] +type = "full" +endpoint = "http://localhost:4318/v1/traces" +transport = "http_binary" +service_name = "relay-service" + +[components.config.opentelemetry.endpoints.headers] +x-tenant-id = "demo" + +[components.config.opentelemetry.endpoints.header_env] +authorization = "OTEL_AUTHORIZATION" + +[[components.config.opentelemetry.endpoints]] +type = "openinference" +endpoint = "http://localhost:6006/v1/traces" +transport = "http_binary" +service_name = "relay-service" +``` + +Set `OTEL_AUTHORIZATION` to the complete authorization header value before +activation. Process-global `OTEL_EXPORTER_OTLP_HEADERS` and +`OTEL_EXPORTER_OTLP_TRACES_HEADERS` are no longer accepted because their values +cannot be isolated between multiple exporters. Move non-sensitive version-2 headers to the +endpoint's `headers` map. Move `resource_attributes` and all service, +transport, instrumentation-scope, and timeout settings into the corresponding +endpoint. + +Use the following endpoint type for each projection: + +| Version-2 Source | Version-3 Endpoint Type | +|---|---| +| `opentelemetry` | `full` | +| `openinference` | `openinference` | +| New standardized GenAI-only export | `gen_ai` | + +Every endpoint requires a nonblank `endpoint` and explicit `type`. The defaults +also change: + +| Field | Version 2 | Version 3 | +|---|---|---| +| `service_name` | `nemo-relay` | `unknown_service` | +| `instrumentation_scope` | Exporter-specific or omitted | `opentelemetry` | +| `endpoint` | Exporter or environment default when omitted | Required | + +Remove `mark_projection`, `mark_exclude_names`, `attribute_mappings`, +`semantic_selector`, and `capture_content`. Projection behavior is fixed. The +`full` and `openinference` types retain their previous default mark behavior. +The `gen_ai` type omits marks, rerankers, and unsupported scope types, and does +not emit `nemo_relay.*` or opt-in content attributes. It targets the +[OpenTelemetry GenAI semantic-conventions v1.42-era snapshot](https://github.com/open-telemetry/semantic-conventions-genai/tree/43633a68ef8f8ed87a1d5eb205990311ca708bf1). + +NeMo Relay also upgrades to OpenTelemetry Rust `0.32`. + +Top-level component `config` lists now concatenate across layers, with +higher-precedence entries first. The observability destination lists +`atof.sinks`, `opentelemetry.endpoints`, and `atif.storage` follow the same +rule. Arbitrary lists nested inside structured values continue to use +replacement semantics. Edit the layer that declares an inherited entry when +you need to change or remove it. + +#### Binding API Changes + +The standalone OpenInference config and subscriber APIs are removed. Construct +one independently managed OpenTelemetry subscriber from one typed endpoint. + +| Surface | Version-2 API | Version-3 API | +|---|---|---| +| Rust | `OpenInferenceConfig`, `OpenInferenceSubscriber`, or untyped `OpenTelemetryConfig` constructors | `OpenTelemetryConfig::new(OpenTelemetryType::OpenInference, endpoint)` and `OpenTelemetrySubscriber` | +| Python | `OpenInferenceConfig`, `OpenInferenceSubscriber`, or `OpenTelemetryConfig()` | `OpenTelemetryConfig("openinference", endpoint)` and `OpenTelemetrySubscriber` | +| Node.js | `OpenInferenceSubscriber` or an OpenTelemetry config without a type | `new OpenTelemetrySubscriber({ type: "openinference", endpoint })` | +| Go | `NewOpenInferenceConfig`, `NewOpenInferenceSubscriber`, or `NewOpenTelemetryConfig()` | `NewOpenTelemetryConfig(OpenTelemetryTypeOpenInference, endpoint)` and `NewOpenTelemetrySubscriber` | +| C FFI | `nemo_relay_openinference_subscriber_*`, the untyped `nemo_relay_otel_subscriber_create`, and attribute-mapping constructors | `nemo_relay_otel_subscriber_create(otel_type, ..., endpoint, ...)` and `nemo_relay_otel_subscriber_*` lifecycle functions | + +For plugin-owned multi-endpoint configuration, use +`OpenTelemetryEndpointConfig` and `OpenTelemetrySectionConfig` in Python, +`openTelemetryEndpoint` and `openTelemetryConfig` in Node.js, or +`ObservabilityOpenTelemetryEndpointConfig` and +`ObservabilityOpenTelemetryConfig` in Go. + +Direct subscribers still own one tracer provider each. Register the subscriber +before instrumented work, then deregister, flush, and shut it down during +graceful teardown. ## Related Release Information diff --git a/docs/resources/glossary.mdx b/docs/resources/glossary.mdx index 9dfb2fed1..73088a36d 100644 --- a/docs/resources/glossary.mdx +++ b/docs/resources/glossary.mdx @@ -83,7 +83,7 @@ the rest of the documentation can use them consistently. : Agent Trajectory Observability Format (ATOF) is the canonical event format NeMo Relay emits for scope lifecycle events and mark events. Subscribers and exporters consume ATOF events before translating compatible scope data into - ATIF trajectories and trace data into OpenTelemetry or OpenInference. + ATIF trajectories and trace data into typed OpenTelemetry projections. **Annotated Request And Response Data** : Annotated request and response data is normalized provider information @@ -341,9 +341,9 @@ the rest of the documentation can use them consistently. **OpenInference** : OpenInference is an AI-observability semantic convention layered on trace - spans. NeMo Relay's OpenInference subscriber maps lifecycle payloads to - OpenInference-oriented attributes such as model inputs, outputs, and token - usage. + spans. NeMo Relay's `openinference` OpenTelemetry projection maps lifecycle + payloads to OpenInference-oriented attributes such as model inputs, outputs, + and token usage. **OpenTelemetry** : OpenTelemetry is a vendor-neutral observability ecosystem. NeMo Relay can @@ -351,8 +351,8 @@ the rest of the documentation can use them consistently. **OpenTelemetry Protocol (OTLP)** : OpenTelemetry Protocol (OTLP) is the transport protocol used by the - OpenTelemetry and OpenInference subscribers to send trace data to a collector - or backend. + OpenTelemetry subscriber to send typed trace projections to a collector or + backend. ## P @@ -404,9 +404,10 @@ the rest of the documentation can use them consistently. **Projection** : A projection translates canonical NeMo Relay events into a downstream format - such as ATIF, OpenTelemetry, or OpenInference. A projection should preserve - the meaning of the runtime event stream without redefining ownership, - middleware ordering, or provider-specific codec policy. + such as ATIF or one of the `full`, `gen_ai`, and `openinference` + OpenTelemetry formats. A projection should preserve the meaning of the + runtime event stream without redefining ownership, middleware ordering, or + provider-specific codec policy. **Prompt IR** : Prompt IR is the internal representation ACG uses to model an LLM request as @@ -507,8 +508,8 @@ the rest of the documentation can use them consistently. : A subscriber is a consumer of emitted events. Subscribers receive the runtime event stream and can use it for in-process analytics, forwarding, or export. - Examples include custom event consumers, ATIF export, OpenTelemetry export, - and OpenInference export. + Examples include custom event consumers, ATIF export, and typed + OpenTelemetry export. ## T @@ -526,7 +527,8 @@ the rest of the documentation can use them consistently. **Trace Span** : A trace span is a timed observability record in a tracing backend. Exported NeMo Relay scopes, tool calls, LLM calls, and marks appear as spans when using - OpenTelemetry or OpenInference export. + a compatible OpenTelemetry projection. The `gen_ai` projection omits marks + and unsupported scope types. **Trajectory** : A trajectory is an ordered record of an agent run. In ATIF export, LLM events diff --git a/docs/resources/troubleshooting/trace-incident-runbook.mdx b/docs/resources/troubleshooting/trace-incident-runbook.mdx index 9a89f4366..5f5aa8b68 100644 --- a/docs/resources/troubleshooting/trace-incident-runbook.mdx +++ b/docs/resources/troubleshooting/trace-incident-runbook.mdx @@ -149,10 +149,11 @@ For ATOF streaming endpoints, confirm these settings: - A failed streaming endpoint is isolated from file output and from other configured endpoints. -For OpenTelemetry or OpenInference export, confirm these settings: +For typed OpenTelemetry export, confirm these settings: -- The OpenTelemetry Protocol (OTLP) endpoint, headers, credentials, and network - egress are available in the target environment. +- Each endpoint has the intended `full`, `gen_ai`, or `openinference` type. +- The OpenTelemetry Protocol (OTLP) endpoint, headers, `header_env` variables, + credentials, and network egress are available in the target environment. - The exporter is enabled in the active configuration file or plugin document. - The backend receives spans with `nemo_relay.uuid` and `nemo_relay.parent_uuid` attributes. @@ -162,7 +163,7 @@ For OpenTelemetry or OpenInference export, confirm these settings: Refer to [Agent Trajectory Observability Format (ATOF)](/configure-plugins/observability/atof), [Agent Trajectory Interchange Format (ATIF)](/configure-plugins/observability/atif), [OpenTelemetry](/configure-plugins/observability/opentelemetry), and -[OpenInference](/configure-plugins/observability/openinference). +[OpenInference Projection](/configure-plugins/observability/openinference). ## Check For Duplicate Event Sources diff --git a/docs/supported-integrations/openclaw-plugin.mdx b/docs/supported-integrations/openclaw-plugin.mdx index 5c079ab3b..ad1a33672 100644 --- a/docs/supported-integrations/openclaw-plugin.mdx +++ b/docs/supported-integrations/openclaw-plugin.mdx @@ -10,8 +10,9 @@ Use the OpenClaw plugin when OpenClaw owns the agent, tool, and LLM lifecycle that needs NeMo Relay observability. The plugin observes supported OpenClaw plugin hooks and converts them into NeMo Relay sessions, LLM spans, tool spans, and marks that the generic NeMo Relay observability component can export as -Agent Trajectory Interchange Format (ATIF) JSON, OpenTelemetry spans, -OpenInference/Phoenix spans, and adaptive telemetry inputs. +Agent Trajectory Interchange Format (ATIF) JSON, typed OpenTelemetry spans +including the OpenInference projection for Phoenix, and adaptive telemetry +inputs. This public OpenClaw plugin uses OpenClaw public hooks. It can initialize generic NeMo Relay plugin components such as `observability` and `adaptive`, and @@ -87,7 +88,7 @@ access, and place the OpenClaw plugin configuration under "kind": "observability", "enabled": true, "config": { - "version": 1, + "version": 3, "atif": { "enabled": true, "agent_name": "openclaw", @@ -95,15 +96,20 @@ access, and place the OpenClaw plugin configuration under }, "opentelemetry": { "enabled": false, - "transport": "http_binary", - "endpoint": "http://localhost:4318/v1/traces", - "service_name": "openclaw-nemo-relay" - }, - "openinference": { - "enabled": false, - "transport": "http_binary", - "endpoint": "http://localhost:6006/v1/traces", - "service_name": "openclaw-nemo-relay" + "endpoints": [ + { + "type": "full", + "transport": "http_binary", + "endpoint": "http://localhost:4318/v1/traces", + "service_name": "openclaw-nemo-relay" + }, + { + "type": "openinference", + "transport": "http_binary", + "endpoint": "http://localhost:6006/v1/traces", + "service_name": "openclaw-nemo-relay" + } + ] } } }, @@ -162,11 +168,10 @@ do not use, or set their `enabled` fields to `false`. `adaptive`. - `config.plugins.components[].config.atif` writes ATIF trajectory JSON files. Set `output_directory` to the directory where OpenClaw should write files. -- `config.plugins.components[].config.opentelemetry` sends generic OTLP spans to - an OpenTelemetry collector when `enabled` is `true`. -- `config.plugins.components[].config.openinference` sends OpenInference OTLP - spans to Phoenix or another OpenInference-compatible collector when `enabled` - is `true`. +- `config.plugins.components[].config.opentelemetry.endpoints` sends typed OTLP + spans when the OpenTelemetry section is enabled. Use `full` for the complete + NeMo Relay projection, `gen_ai` for standardized GenAI conventions, or + `openinference` for Phoenix and other OpenInference-compatible collectors. - `config.plugins.components[]` entries with `kind: "adaptive"` initialize the Adaptive plugin. In hook-backed OpenClaw mode, adaptive telemetry can consume replayed NeMo Relay events, while request-rewrite features such as adaptive @@ -222,9 +227,9 @@ sink: - ATIF: confirm JSON files appear in the configured `config.plugins.components[].config.atif.output_directory`. -- OpenTelemetry: confirm spans arrive at the configured OTLP collector. -- OpenInference: confirm spans arrive at the configured OpenInference/Phoenix - endpoint. +- Typed OpenTelemetry: confirm spans arrive at every configured OTLP endpoint; + for an `openinference` endpoint, confirm the projected spans appear in + Phoenix or another OpenInference-compatible backend. The plugin also registers the `operator.admin` scoped gateway method `nemoRelay.status`. If your CLI is already paired with admin-capable gateway @@ -311,8 +316,8 @@ If tool spans exist but LLM spans are incomplete: If no export output appears: - verify `config.plugins.components[].config.atif.output_directory`, - `config.plugins.components[].config.opentelemetry.endpoint`, or - `config.plugins.components[].config.openinference.endpoint` + or each + `config.plugins.components[].config.opentelemetry.endpoints[].endpoint` - verify the configured collector or output directory is reachable - verify session end or gateway stop hooks fired so pending replay state can drain diff --git a/examples/switchyard/hermes-ollama-plugins.toml b/examples/switchyard/hermes-ollama-plugins.toml index f562e2c72..4878a09ae 100644 --- a/examples/switchyard/hermes-ollama-plugins.toml +++ b/examples/switchyard/hermes-ollama-plugins.toml @@ -54,6 +54,9 @@ base_url = "http://127.0.0.1:11434" kind = "observability" enabled = true +[components.config] +version = 3 + [components.config.atof] enabled = true @@ -84,6 +87,9 @@ filename_template = "trajectory-{session_id}.atif.json" [components.config.opentelemetry] enabled = true + +[[components.config.opentelemetry.endpoints]] +type = "full" transport = "http_binary" endpoint = "http://127.0.0.1:4318/v1/traces" service_name = "nemo-relay-switchyard-e2e" @@ -91,6 +97,6 @@ service_namespace = "switchyard-integration" instrumentation_scope = "nemo-relay-switchyard" timeout_millis = 5000 -[components.config.opentelemetry.resource_attributes] +[components.config.opentelemetry.endpoints.resource_attributes] "deployment.environment.name" = "local-e2e" "switchyard.profile.id" = "hermes-ollama-stage-router" diff --git a/go/nemo_relay/README.md b/go/nemo_relay/README.md index 813b7f45e..7df389c52 100644 --- a/go/nemo_relay/README.md +++ b/go/nemo_relay/README.md @@ -53,6 +53,9 @@ The Go package provides the following capabilities: event sanitizers at global, scope-local, and plugin-context levels. - **Event subscribers**: Runtime lifecycle callbacks for observability and diagnostics. +- **Typed OpenTelemetry export**: `NewOpenTelemetryConfig` and + `NewOpenTelemetrySubscriber` construct one independently managed `full`, + `gen_ai`, or `openinference` endpoint exporter. - **Convenience subpackages**: Short imports for scopes, tools, LLM calls, guardrails, intercepts, subscribers, plugins, and adaptive helpers. - **Local source-first workflow**: Build the FFI library locally, then test or diff --git a/go/nemo_relay/coverage_gap_test.go b/go/nemo_relay/coverage_gap_test.go index 4d26d6576..66767e4b7 100644 --- a/go/nemo_relay/coverage_gap_test.go +++ b/go/nemo_relay/coverage_gap_test.go @@ -153,17 +153,9 @@ func assertClosedExporterFails(t *testing.T) { func assertZeroSubscriberConfigs(t *testing.T) { t.Helper() - otel, err := NewOpenTelemetrySubscriber(OpenTelemetryConfig{}) - if err != nil { - t.Fatalf("NewOpenTelemetrySubscriber with zero config failed: %v", err) - } - otel.Close() - - openInference, err := NewOpenInferenceSubscriber(OpenInferenceConfig{}) - if err != nil { - t.Fatalf("NewOpenInferenceSubscriber with zero config failed: %v", err) + if _, err := NewOpenTelemetrySubscriber(OpenTelemetryConfig{}); err == nil { + t.Fatal("expected a required endpoint error") } - openInference.Close() } func TestWrapperAndCodecFinalizersRun(t *testing.T) { diff --git a/go/nemo_relay/nemo_relay.go b/go/nemo_relay/nemo_relay.go index 937427e5d..3f694d283 100644 --- a/go/nemo_relay/nemo_relay.go +++ b/go/nemo_relay/nemo_relay.go @@ -254,23 +254,13 @@ extern int32_t nemo_relay_atof_exporter_path(const void*, char**); extern void nemo_relay_atof_exporter_free(void*); // OpenTelemetry subscriber -extern int32_t nemo_relay_otel_subscriber_create(const char*, const char*, const char*, const char*, const char*, const char*, const char*, const char*, uint64_t, void**); -extern int32_t nemo_relay_otel_subscriber_create_with_attribute_mappings(const char*, const char*, const char*, const char*, const char*, const char*, const char*, const char*, uint64_t, const char*, void**); +extern int32_t nemo_relay_otel_subscriber_create(const char*, const char*, const char*, const char*, const char*, const char*, const char*, const char*, const char*, uint64_t, void**); extern int32_t nemo_relay_otel_subscriber_register(const void*, const char*); extern int32_t nemo_relay_otel_subscriber_deregister(const char*); extern int32_t nemo_relay_otel_subscriber_force_flush(const void*); extern int32_t nemo_relay_otel_subscriber_shutdown(const void*); extern void nemo_relay_otel_subscriber_free(void*); -// OpenInference subscriber -extern int32_t nemo_relay_openinference_subscriber_create(const char*, const char*, const char*, const char*, const char*, const char*, const char*, const char*, uint64_t, void**); -extern int32_t nemo_relay_openinference_subscriber_create_with_attribute_mappings(const char*, const char*, const char*, const char*, const char*, const char*, const char*, const char*, uint64_t, const char*, void**); -extern int32_t nemo_relay_openinference_subscriber_register(const void*, const char*); -extern int32_t nemo_relay_openinference_subscriber_deregister(const char*); -extern int32_t nemo_relay_openinference_subscriber_force_flush(const void*); -extern int32_t nemo_relay_openinference_subscriber_shutdown(const void*); -extern void nemo_relay_openinference_subscriber_free(void*); - // Go trampoline forward declarations (defined via //export in callbacks.go) extern char* goToolSanitizeTrampoline(void*, const char*, const char*); extern char* goEventSanitizeTrampoline(void*, const FfiEvent*, const char*); @@ -296,6 +286,7 @@ import "C" import ( "encoding/json" "errors" + "fmt" "runtime" "time" "unsafe" @@ -1870,11 +1861,21 @@ const ( OpenTelemetryTransportGrpc OpenTelemetryTransport = "grpc" ) +// OpenTelemetryType selects the semantic projection emitted by an exporter. +type OpenTelemetryType string + +const ( + OpenTelemetryTypeFull OpenTelemetryType = "full" + OpenTelemetryTypeGenAI OpenTelemetryType = "gen_ai" + OpenTelemetryTypeOpenInference OpenTelemetryType = "openinference" +) + // OpenTelemetryConfig configures the OpenTelemetry subscriber. // // Create it with [NewOpenTelemetryConfig], then mutate fields as needed before // passing it to [NewOpenTelemetrySubscriber]. type OpenTelemetryConfig struct { + Type OpenTelemetryType Transport OpenTelemetryTransport Endpoint string Headers map[string]string @@ -1884,23 +1885,18 @@ type OpenTelemetryConfig struct { ServiceVersion string InstrumentationScope string Timeout time.Duration - AttributeMappings []OtlpAttributeMapping } -// OtlpAttributeMapping copies a projected OTLP attribute to an alias. -type OtlpAttributeMapping struct { - Key string `json:"key"` - Alias string `json:"alias"` -} - -// NewOpenTelemetryConfig returns a config initialized with sensible defaults. -func NewOpenTelemetryConfig() OpenTelemetryConfig { +// NewOpenTelemetryConfig returns a typed config for the required endpoint. +func NewOpenTelemetryConfig(otelType OpenTelemetryType, endpoint string) OpenTelemetryConfig { return OpenTelemetryConfig{ + Type: otelType, Transport: OpenTelemetryTransportHTTPBinary, + Endpoint: endpoint, Headers: map[string]string{}, ResourceAttributes: map[string]string{}, - ServiceName: defaultServiceName, - InstrumentationScope: "nemo-relay-otel", + ServiceName: "unknown_service", + InstrumentationScope: "opentelemetry", Timeout: 3 * time.Second, } } @@ -1915,11 +1911,17 @@ func NewOpenTelemetrySubscriber(config OpenTelemetryConfig) (*OpenTelemetrySubsc if config.Transport == "" { config.Transport = OpenTelemetryTransportHTTPBinary } + if config.Type == "" { + return nil, fmt.Errorf("type is required") + } + if config.Endpoint == "" { + return nil, fmt.Errorf("endpoint is required") + } if config.ServiceName == "" { - config.ServiceName = defaultServiceName + config.ServiceName = "unknown_service" } if config.InstrumentationScope == "" { - config.InstrumentationScope = "nemo-relay-otel" + config.InstrumentationScope = "opentelemetry" } if config.Timeout == 0 { config.Timeout = 3 * time.Second @@ -1933,6 +1935,8 @@ func NewOpenTelemetrySubscriber(config OpenTelemetryConfig) (*OpenTelemetrySubsc cTransport := C.CString(string(config.Transport)) defer C.free(unsafe.Pointer(cTransport)) + cType := C.CString(string(config.Type)) + defer C.free(unsafe.Pointer(cType)) var cEndpoint *C.char if config.Endpoint != "" { @@ -1954,16 +1958,6 @@ func NewOpenTelemetrySubscriber(config OpenTelemetryConfig) (*OpenTelemetrySubsc cResourceAttrsJSON := C.CString(string(resourceAttrsJSON)) defer C.free(unsafe.Pointer(cResourceAttrsJSON)) - var cAttributeMappingsJSON *C.char - if config.AttributeMappings != nil { - attributeMappingsJSON, err := jsonMarshal(config.AttributeMappings) - if err != nil { - return nil, err - } - cAttributeMappingsJSON = C.CString(string(attributeMappingsJSON)) - defer C.free(unsafe.Pointer(cAttributeMappingsJSON)) - } - cServiceName := C.CString(config.ServiceName) defer C.free(unsafe.Pointer(cServiceName)) @@ -1983,7 +1977,8 @@ func NewOpenTelemetrySubscriber(config OpenTelemetryConfig) (*OpenTelemetrySubsc defer C.free(unsafe.Pointer(cInstrumentationScope)) var ptr unsafe.Pointer - status := C.nemo_relay_otel_subscriber_create_with_attribute_mappings( + status := C.nemo_relay_otel_subscriber_create( + cType, cTransport, cEndpoint, cHeadersJSON, @@ -1993,7 +1988,6 @@ func NewOpenTelemetrySubscriber(config OpenTelemetryConfig) (*OpenTelemetrySubsc cServiceVersion, cInstrumentationScope, C.uint64_t(config.Timeout/time.Millisecond), - cAttributeMappingsJSON, &ptr, ) if err := checkStatus(status); err != nil { @@ -2038,182 +2032,6 @@ func (s *OpenTelemetrySubscriber) Close() { } } -// --------------------------------------------------------------------------- -// OpenInference subscriber -// --------------------------------------------------------------------------- - -// OpenInferenceTransport configures which OTLP transport to use. -type OpenInferenceTransport string - -const ( - // OpenInferenceTransportHTTPBinary uses OTLP/HTTP protobuf export. - OpenInferenceTransportHTTPBinary OpenInferenceTransport = "http_binary" - // OpenInferenceTransportGrpc uses OTLP/gRPC export. - OpenInferenceTransportGrpc OpenInferenceTransport = "grpc" -) - -// OpenInferenceConfig configures the OpenInference subscriber. -// -// Create it with [NewOpenInferenceConfig], then mutate fields as needed before -// passing it to [NewOpenInferenceSubscriber]. -type OpenInferenceConfig struct { - Transport OpenInferenceTransport - Endpoint string - Headers map[string]string - ResourceAttributes map[string]string - ServiceName string - ServiceNamespace string - ServiceVersion string - InstrumentationScope string - Timeout time.Duration - AttributeMappings []OtlpAttributeMapping -} - -// NewOpenInferenceConfig returns a config initialized with sensible defaults. -func NewOpenInferenceConfig() OpenInferenceConfig { - return OpenInferenceConfig{ - Transport: OpenInferenceTransportHTTPBinary, - Headers: map[string]string{}, - ResourceAttributes: map[string]string{}, - ServiceName: defaultServiceName, - InstrumentationScope: "nemo-relay-openinference", - Timeout: 3 * time.Second, - } -} - -// OpenInferenceSubscriber exports NeMo Relay lifecycle events with OpenInference semantics. -type OpenInferenceSubscriber struct { - ptr unsafe.Pointer -} - -// NewOpenInferenceSubscriber creates a new OpenInference subscriber from config. -func NewOpenInferenceSubscriber(config OpenInferenceConfig) (*OpenInferenceSubscriber, error) { - if config.Transport == "" { - config.Transport = OpenInferenceTransportHTTPBinary - } - if config.ServiceName == "" { - config.ServiceName = defaultServiceName - } - if config.InstrumentationScope == "" { - config.InstrumentationScope = "nemo-relay-openinference" - } - if config.Timeout == 0 { - config.Timeout = 3 * time.Second - } - if config.Headers == nil { - config.Headers = map[string]string{} - } - if config.ResourceAttributes == nil { - config.ResourceAttributes = map[string]string{} - } - - cTransport := C.CString(string(config.Transport)) - defer C.free(unsafe.Pointer(cTransport)) - - var cEndpoint *C.char - if config.Endpoint != "" { - cEndpoint = C.CString(config.Endpoint) - defer C.free(unsafe.Pointer(cEndpoint)) - } - - headersJSON, err := jsonMarshal(config.Headers) - if err != nil { - return nil, err - } - cHeadersJSON := C.CString(string(headersJSON)) - defer C.free(unsafe.Pointer(cHeadersJSON)) - - resourceAttrsJSON, err := jsonMarshal(config.ResourceAttributes) - if err != nil { - return nil, err - } - cResourceAttrsJSON := C.CString(string(resourceAttrsJSON)) - defer C.free(unsafe.Pointer(cResourceAttrsJSON)) - - var cAttributeMappingsJSON *C.char - if config.AttributeMappings != nil { - attributeMappingsJSON, err := jsonMarshal(config.AttributeMappings) - if err != nil { - return nil, err - } - cAttributeMappingsJSON = C.CString(string(attributeMappingsJSON)) - defer C.free(unsafe.Pointer(cAttributeMappingsJSON)) - } - - cServiceName := C.CString(config.ServiceName) - defer C.free(unsafe.Pointer(cServiceName)) - - var cServiceNamespace *C.char - if config.ServiceNamespace != "" { - cServiceNamespace = C.CString(config.ServiceNamespace) - defer C.free(unsafe.Pointer(cServiceNamespace)) - } - - var cServiceVersion *C.char - if config.ServiceVersion != "" { - cServiceVersion = C.CString(config.ServiceVersion) - defer C.free(unsafe.Pointer(cServiceVersion)) - } - - cInstrumentationScope := C.CString(config.InstrumentationScope) - defer C.free(unsafe.Pointer(cInstrumentationScope)) - - var ptr unsafe.Pointer - status := C.nemo_relay_openinference_subscriber_create_with_attribute_mappings( - cTransport, - cEndpoint, - cHeadersJSON, - cResourceAttrsJSON, - cServiceName, - cServiceNamespace, - cServiceVersion, - cInstrumentationScope, - C.uint64_t(config.Timeout/time.Millisecond), - cAttributeMappingsJSON, - &ptr, - ) - if err := checkStatus(status); err != nil { - return nil, err - } - return &OpenInferenceSubscriber{ptr: ptr}, nil -} - -// Register registers the subscriber globally with the given name. -func (s *OpenInferenceSubscriber) Register(name string) error { - cName := C.CString(name) - defer C.free(unsafe.Pointer(cName)) - status := C.nemo_relay_openinference_subscriber_register(s.ptr, cName) - return checkStatus(status) -} - -// Deregister removes the subscriber by name. -func (s *OpenInferenceSubscriber) Deregister(name string) error { - cName := C.CString(name) - defer C.free(unsafe.Pointer(cName)) - status := C.nemo_relay_openinference_subscriber_deregister(cName) - return checkStatus(status) -} - -// ForceFlush flushes finished spans through the underlying exporter. -func (s *OpenInferenceSubscriber) ForceFlush() error { - status := C.nemo_relay_openinference_subscriber_force_flush(s.ptr) - return checkStatus(status) -} - -// Shutdown shuts down the underlying tracer provider. -func (s *OpenInferenceSubscriber) Shutdown() error { - status := C.nemo_relay_openinference_subscriber_shutdown(s.ptr) - return checkStatus(status) -} - -// Close frees the subscriber handle. -func (s *OpenInferenceSubscriber) Close() { - if s.ptr != nil { - C.nemo_relay_openinference_subscriber_free(s.ptr) - s.ptr = nil - } -} - // --------------------------------------------------------------------------- // Scope-local guardrail/intercept registration (Tool) // --------------------------------------------------------------------------- diff --git a/go/nemo_relay/observability_plugin.go b/go/nemo_relay/observability_plugin.go index 0fb179114..51ecf45ba 100644 --- a/go/nemo_relay/observability_plugin.go +++ b/go/nemo_relay/observability_plugin.go @@ -8,26 +8,34 @@ import "encoding/json" // ObservabilityPluginKind is the top-level plugin kind used by the core observability component. const ObservabilityPluginKind = "observability" -// ObservabilityMarkProjection controls how point-in-time marks are exported. -type ObservabilityMarkProjection string - -const ( - // ObservabilityMarkProjectionInherit preserves exporter-native mark handling. - ObservabilityMarkProjectionInherit ObservabilityMarkProjection = "inherit" - // ObservabilityMarkProjectionEvent preserves marks as events. - ObservabilityMarkProjectionEvent ObservabilityMarkProjection = "event" - // ObservabilityMarkProjectionTool emits visible tool projections. - ObservabilityMarkProjectionTool ObservabilityMarkProjection = "tool" -) - // ObservabilityConfig is the canonical Go shape for the observability plugin config document. type ObservabilityConfig struct { - Version uint32 `json:"version,omitempty"` - Atof *ObservabilityAtofConfig `json:"atof,omitempty"` - Atif *ObservabilityAtifConfig `json:"atif,omitempty"` - OpenTelemetry *ObservabilityOtlpConfig `json:"opentelemetry,omitempty"` - OpenInference *ObservabilityOtlpConfig `json:"openinference,omitempty"` - Policy *ConfigPolicy `json:"policy,omitempty"` + Version uint32 `json:"version,omitempty"` + Atof *ObservabilityAtofConfig `json:"atof,omitempty"` + Atif *ObservabilityAtifConfig `json:"atif,omitempty"` + OpenTelemetry *ObservabilityOpenTelemetryConfig `json:"opentelemetry,omitempty"` + Policy *ConfigPolicy `json:"policy,omitempty"` +} + +// ObservabilityOpenTelemetryConfig configures multiple typed OTLP endpoints. +type ObservabilityOpenTelemetryConfig struct { + Enabled bool `json:"enabled,omitempty"` + Endpoints []ObservabilityOpenTelemetryEndpointConfig `json:"endpoints,omitempty"` +} + +// ObservabilityOpenTelemetryEndpointConfig configures one typed OTLP destination. +type ObservabilityOpenTelemetryEndpointConfig struct { + Type OpenTelemetryType `json:"type"` + Endpoint string `json:"endpoint"` + Transport string `json:"transport,omitempty"` + Headers map[string]string `json:"headers,omitempty"` + HeaderEnv map[string]string `json:"header_env,omitempty"` + ResourceAttributes map[string]string `json:"resource_attributes,omitempty"` + ServiceName string `json:"service_name,omitempty"` + ServiceNamespace string `json:"service_namespace,omitempty"` + ServiceVersion string `json:"service_version,omitempty"` + InstrumentationScope string `json:"instrumentation_scope,omitempty"` + TimeoutMillis uint64 `json:"timeout_millis,omitempty"` } // ObservabilityAtofConfig configures filesystem-backed raw ATOF JSONL export. @@ -179,56 +187,15 @@ func (config ObservabilityHttpStorageConfig) MarshalJSON() ([]byte, error) { }) } -// ObservabilityOtlpConfig configures OpenTelemetry or OpenInference OTLP export. -type ObservabilityOtlpConfig struct { - Enabled bool `json:"enabled,omitempty"` - MarkProjection ObservabilityMarkProjection `json:"mark_projection,omitempty"` - MarkExcludeNames []string `json:"mark_exclude_names,omitempty"` - AttributeMappings []OtlpAttributeMapping `json:"attribute_mappings,omitempty"` - Transport string `json:"transport,omitempty"` - Endpoint string `json:"endpoint,omitempty"` - Headers map[string]string `json:"headers,omitempty"` - ResourceAttributes map[string]string `json:"resource_attributes,omitempty"` - ServiceName string `json:"service_name,omitempty"` - ServiceNamespace string `json:"service_namespace,omitempty"` - ServiceVersion string `json:"service_version,omitempty"` - InstrumentationScope string `json:"instrumentation_scope,omitempty"` - TimeoutMillis uint64 `json:"timeout_millis,omitempty"` -} - -// MarshalJSON preserves the distinction between a nil exclusion list, which -// inherits the core default, and an explicitly empty list, which disables all -// default exclusions. -func (config ObservabilityOtlpConfig) MarshalJSON() ([]byte, error) { - type alias ObservabilityOtlpConfig - payload, err := json.Marshal(alias(config)) - if err != nil { - return nil, err - } - - var object map[string]json.RawMessage - if err := json.Unmarshal(payload, &object); err != nil { - return nil, err - } - if config.MarkExcludeNames != nil { - exclusions, err := json.Marshal(config.MarkExcludeNames) - if err != nil { - return nil, err - } - object["mark_exclude_names"] = exclusions - } - return json.Marshal(object) -} - // ObservabilityComponentSpec wraps one observability config as a top-level plugin component. type ObservabilityComponentSpec struct { Enabled bool `json:"enabled,omitempty"` Config ObservabilityConfig `json:"config"` } -// NewObservabilityConfig returns a default observability config with version 2. +// NewObservabilityConfig returns a default observability config with version 3. func NewObservabilityConfig() ObservabilityConfig { - return ObservabilityConfig{Version: 2} + return ObservabilityConfig{Version: 3} } // NewObservabilityAtofConfig returns disabled ATOF JSONL settings with native defaults. @@ -265,16 +232,23 @@ func NewObservabilityHttpStorageConfig(endpoint string) ObservabilityHttpStorage return ObservabilityHttpStorageConfig{Endpoint: endpoint} } -// NewObservabilityOtlpConfig returns disabled OTLP settings with core defaults. -func NewObservabilityOtlpConfig() ObservabilityOtlpConfig { - return ObservabilityOtlpConfig{ - Transport: "http_binary", - MarkProjection: ObservabilityMarkProjectionInherit, - MarkExcludeNames: []string{"llm.chunk"}, - Headers: map[string]string{}, - ResourceAttributes: map[string]string{}, - ServiceName: "nemo-relay", - TimeoutMillis: 3000, +// NewObservabilityOpenTelemetryConfig returns disabled multi-endpoint settings. +func NewObservabilityOpenTelemetryConfig() ObservabilityOpenTelemetryConfig { + return ObservabilityOpenTelemetryConfig{} +} + +// NewObservabilityOpenTelemetryEndpointConfig returns one typed endpoint with defaults. +func NewObservabilityOpenTelemetryEndpointConfig(otelType OpenTelemetryType, endpoint string) ObservabilityOpenTelemetryEndpointConfig { + return ObservabilityOpenTelemetryEndpointConfig{ + Type: otelType, + Endpoint: endpoint, + Transport: "http_binary", + Headers: map[string]string{}, + HeaderEnv: map[string]string{}, + ResourceAttributes: map[string]string{}, + ServiceName: "unknown_service", + InstrumentationScope: "opentelemetry", + TimeoutMillis: 3000, } } diff --git a/go/nemo_relay/observability_plugin_test.go b/go/nemo_relay/observability_plugin_test.go index 6a0eea564..2b65de7c0 100644 --- a/go/nemo_relay/observability_plugin_test.go +++ b/go/nemo_relay/observability_plugin_test.go @@ -28,8 +28,8 @@ const ( func TestObservabilityConfigHelpers(t *testing.T) { config := NewObservabilityConfig() - if config.Version != 2 { - t.Fatalf("expected version 2, got %d", config.Version) + if config.Version != 3 { + t.Fatalf("expected version 3, got %d", config.Version) } atof := NewObservabilityAtofConfig() if atof.Enabled || len(atof.Sinks) != 0 { @@ -65,15 +65,16 @@ func TestObservabilityConfigHelpers(t *testing.T) { s3Storage, httpStorage, } - otlp := NewObservabilityOtlpConfig() - if otlp.Enabled || otlp.MarkProjection != ObservabilityMarkProjectionInherit || len(otlp.MarkExcludeNames) != 1 || otlp.MarkExcludeNames[0] != "llm.chunk" || otlp.Transport != "http_binary" || otlp.ServiceName != "nemo-relay" || otlp.TimeoutMillis != 3000 { - t.Fatalf("unexpected OTLP defaults: %#v", otlp) + otel := NewObservabilityOpenTelemetryConfig() + otel.Enabled = true + otel.Endpoints = []ObservabilityOpenTelemetryEndpointConfig{ + NewObservabilityOpenTelemetryEndpointConfig(OpenTelemetryTypeFull, "http://localhost:4318/v1/traces"), } - otlp.MarkProjection = ObservabilityMarkProjectionTool + otel.Endpoints[0].HeaderEnv["authorization"] = "OTEL_AUTHORIZATION" config.Atof = &atof config.Atif = &atif - config.OpenTelemetry = &otlp + config.OpenTelemetry = &otel wrapped := ObservabilityComponent(config) if wrapped.Kind != ObservabilityPluginKind || !wrapped.Enabled { t.Fatalf("unexpected component wrapper: %#v", wrapped) @@ -130,28 +131,12 @@ func assertWrappedObservabilityConfig(t *testing.T, wrapped PluginComponentSpec) t.Fatalf("expected named ATOF endpoint in serialized component, got %s", serialized) } assertWrappedAtifStorageConfig(t, wrapped.Config["atif"].(map[string]any)) - if wrapped.Config["opentelemetry"].(map[string]any)["mark_projection"] != "tool" { - t.Fatalf("expected tool mark projection in serialized config: %#v", wrapped.Config) + otelEndpoints := wrapped.Config["opentelemetry"].(map[string]any)["endpoints"].([]any) + if otelEndpoints[0].(map[string]any)["type"] != "full" { + t.Fatalf("expected typed OpenTelemetry endpoint in serialized config: %#v", wrapped.Config) } -} - -func TestObservabilityOtlpConfigPreservesExplicitEmptyMarkExclusions(t *testing.T) { - inherited, err := json.Marshal(ObservabilityOtlpConfig{}) - if err != nil { - t.Fatalf("marshal zero-value OTLP config failed: %v", err) - } - if strings.Contains(string(inherited), `"mark_exclude_names"`) { - t.Fatalf("nil exclusions should inherit the core default: %s", inherited) - } - - config := NewObservabilityOtlpConfig() - config.MarkExcludeNames = []string{} - explicitEmpty, err := json.Marshal(config) - if err != nil { - t.Fatalf("marshal OTLP config with empty exclusions failed: %v", err) - } - if !strings.Contains(string(explicitEmpty), `"mark_exclude_names":[]`) { - t.Fatalf("explicit empty exclusions should be preserved: %s", explicitEmpty) + if otelEndpoints[0].(map[string]any)["header_env"].(map[string]any)["authorization"] != "OTEL_AUTHORIZATION" { + t.Fatalf("expected OpenTelemetry header_env in serialized config: %#v", wrapped.Config) } } diff --git a/go/nemo_relay/openinference_test.go b/go/nemo_relay/openinference_test.go index 970c3631a..135d2d409 100644 --- a/go/nemo_relay/openinference_test.go +++ b/go/nemo_relay/openinference_test.go @@ -5,7 +5,6 @@ package nemo_relay import ( "bytes" - "encoding/json" "io" "net/http" "net/http/httptest" @@ -13,149 +12,52 @@ import ( "time" ) -const ( - openInferenceServiceName = "go-agent" - tenantAttributeAlias = "tenant.id" - newOpenInferenceErrorFmt = "NewOpenInferenceSubscriber failed: %v" - uniqueSubscriberTimeFormat = "150405.000000" - registerOpenInferenceErrorFmt = "Register failed: %v" -) - type otelRequest struct { Path string ContentType string Body []byte } -func TestNewOpenInferenceConfigDefaults(t *testing.T) { - config := NewOpenInferenceConfig() - - if config.Transport != OpenInferenceTransportHTTPBinary { - t.Fatalf("expected default transport http_binary, got %q", config.Transport) - } - if config.ServiceName != "nemo-relay" { - t.Fatalf("expected default service name nemo-relay, got %q", config.ServiceName) - } - if config.InstrumentationScope != "nemo-relay-openinference" { - t.Fatalf("expected default instrumentation scope, got %q", config.InstrumentationScope) - } - if config.Timeout != 3*time.Second { - t.Fatalf("expected default timeout 3s, got %v", config.Timeout) - } - if config.Headers == nil || len(config.Headers) != 0 { - t.Fatalf("expected empty headers map, got %#v", config.Headers) - } - if config.ResourceAttributes == nil || len(config.ResourceAttributes) != 0 { - t.Fatalf("expected empty resource attributes map, got %#v", config.ResourceAttributes) - } -} - -func TestOpenInferenceSubscriberLifecycle(t *testing.T) { - config := NewOpenInferenceConfig() - config.Endpoint = "http://localhost:4318/v1/traces" - config.ServiceName = openInferenceServiceName - config.ServiceNamespace = "agents" - config.ServiceVersion = "1.0.0" - config.InstrumentationScope = "go-tests" - config.Timeout = 1250 * time.Millisecond - config.Headers["authorization"] = "Bearer token" - config.ResourceAttributes["deployment.environment"] = "test" - config.AttributeMappings = []OtlpAttributeMapping{{ - Key: "openinference.metadata.tenant", - Alias: tenantAttributeAlias, - }} - - subscriber, err := NewOpenInferenceSubscriber(config) - if err != nil { - t.Fatalf(newOpenInferenceErrorFmt, err) - } - defer subscriber.Close() - - name := "go_openinference_subscriber_" + time.Now().Format(uniqueSubscriberTimeFormat) - if err := subscriber.Register(name); err != nil { - t.Fatalf(registerOpenInferenceErrorFmt, err) - } - if err := subscriber.Deregister(name); err != nil { - t.Fatalf("Deregister failed: %v", err) - } - if err := subscriber.Deregister(name); err != nil { - t.Fatalf("repeated Deregister should be safe, got: %v", err) - } - if err := subscriber.ForceFlush(); err != nil { - t.Fatalf("ForceFlush failed: %v", err) - } - if err := subscriber.Shutdown(); err != nil { - t.Fatalf("Shutdown failed: %v", err) - } -} - -func TestOpenInferenceSubscriberRejectsInvalidTransport(t *testing.T) { - config := NewOpenInferenceConfig() - config.Transport = OpenInferenceTransport("invalid") - - _, err := NewOpenInferenceSubscriber(config) - if err == nil { - t.Fatal("expected invalid transport error") - } -} - -func TestOpenInferenceSubscriberRejectsInvalidAttributeMapping(t *testing.T) { - config := NewOpenInferenceConfig() - config.AttributeMappings = []OtlpAttributeMapping{{Key: "", Alias: tenantAttributeAlias}} - - if _, err := NewOpenInferenceSubscriber(config); err == nil { - t.Fatal("expected invalid attribute mapping error") - } -} - -func TestOpenInferenceSubscriberExportsScopeLifecycleAndMappedAttributes(t *testing.T) { - requests := make(chan otelRequest, 4) +func TestOpenInferenceUsesTypedOpenTelemetrySubscriber(t *testing.T) { + requests := make(chan otelRequest, 1) server := NewOtelTestServer(t, requests) defer server.Close() - config := NewOpenInferenceConfig() - config.Endpoint = server.URL + "/v1/traces" - config.ServiceName = openInferenceServiceName - config.AttributeMappings = []OtlpAttributeMapping{{ - Key: "openinference.metadata.tenant", - Alias: tenantAttributeAlias, - }} - subscriber, err := NewOpenInferenceSubscriber(config) + config := NewOpenTelemetryConfig(OpenTelemetryTypeOpenInference, server.URL+"/v1/traces") + config.ServiceName = "go-agent" + + subscriber, err := NewOpenTelemetrySubscriber(config) if err != nil { - t.Fatalf(newOpenInferenceErrorFmt, err) + t.Fatalf("NewOpenTelemetrySubscriber failed: %v", err) } defer subscriber.Close() - name := "go_openinference_e2e_" + time.Now().Format(uniqueSubscriberTimeFormat) + + name := "go_openinference_typed" if err := subscriber.Register(name); err != nil { - t.Fatalf(registerOpenInferenceErrorFmt, err) + t.Fatalf("Register failed: %v", err) } defer func() { _ = subscriber.Deregister(name) }() runWithTestScopeStack(t, func() { handle, err := PushScope("openinference_scope", ScopeTypeAgent) - if err != nil { - t.Fatalf("PushScope failed: %v", err) - } - requireNoError(t, EmitEvent( - "openinference_mark", - WithEventParent(handle), - WithEventData(json.RawMessage(`{"step":1}`)), - WithEventMetadata(json.RawMessage(`{"source":"go"}`)), - ), "EmitEvent failed") - requireNoError( - t, - PopScope(handle, WithScopeEndMetadata(json.RawMessage(`{"tenant":"go"}`))), - "PopScope failed", - ) + requireNoError(t, err, "PushScope failed") + requireNoError(t, PopScope(handle), "PopScope failed") }) - if err := subscriber.ForceFlush(); err != nil { - t.Fatalf("ForceFlush failed: %v", err) - } + requireNoError(t, subscriber.ForceFlush(), "ForceFlush failed") select { case request := <-requests: - AssertOpenInferenceRequest(t, request) - assertOtlpStringAttribute(t, request.Body, tenantAttributeAlias, "go") + if request.Path != "/v1/traces" { + t.Fatalf("expected /v1/traces path, got %q", request.Path) + } + if request.ContentType != "application/x-protobuf" { + t.Fatalf("expected protobuf content type, got %q", request.ContentType) + } + for _, needle := range [][]byte{[]byte("openinference.span.kind"), []byte("AGENT")} { + if !bytes.Contains(request.Body, needle) { + t.Fatalf("expected OTLP request body to contain %q", needle) + } + } case <-time.After(5 * time.Second): t.Fatal("timed out waiting for OTLP request") } @@ -176,66 +78,3 @@ func NewOtelTestServer(t *testing.T, requests chan<- otelRequest) *httptest.Serv w.WriteHeader(http.StatusOK) })) } - -func NewRegisteredOpenInferenceSubscriber(t *testing.T, endpoint string) *OpenInferenceSubscriber { - t.Helper() - config := NewOpenInferenceConfig() - config.Endpoint = endpoint - config.ServiceName = openInferenceServiceName - - subscriber, err := NewOpenInferenceSubscriber(config) - if err != nil { - t.Fatalf(newOpenInferenceErrorFmt, err) - } - name := "go_openinference_e2e_" + time.Now().Format(uniqueSubscriberTimeFormat) - if err := subscriber.Register(name); err != nil { - t.Fatalf(registerOpenInferenceErrorFmt, err) - } - t.Cleanup(func() { _ = subscriber.Deregister(name) }) - return subscriber -} - -func EmitOpenInferenceScopeLifecycle(t *testing.T) { - t.Helper() - runWithTestScopeStack(t, func() { - handle, err := PushScope("openinference_scope", ScopeTypeAgent) - if err != nil { - t.Fatalf("PushScope failed: %v", err) - } - requireNoError(t, EmitEvent( - "openinference_mark", - WithEventParent(handle), - WithEventData(json.RawMessage(`{"step":1}`)), - WithEventMetadata(json.RawMessage(`{"source":"go"}`)), - ), "EmitEvent failed") - requireNoError(t, PopScope(handle), "PopScope failed") - }) -} - -func AssertOpenInferenceRequest(t *testing.T, request otelRequest) { - t.Helper() - if request.Path != "/v1/traces" { - t.Fatalf("expected /v1/traces path, got %q", request.Path) - } - if request.ContentType != "application/x-protobuf" { - t.Fatalf("expected protobuf content type, got %q", request.ContentType) - } - if len(request.Body) == 0 { - t.Fatal("expected non-empty OTLP request body") - } - AssertOpenInferenceBodyContains(t, request.Body) -} - -func AssertOpenInferenceBodyContains(t *testing.T, body []byte) { - t.Helper() - for _, needle := range [][]byte{ - []byte("openinference.span.kind"), - []byte("AGENT"), - []byte("metadata"), - []byte("openinference_mark"), - } { - if !bytes.Contains(body, needle) { - t.Fatalf("expected OTLP request body to contain %q", needle) - } - } -} diff --git a/go/nemo_relay/otel_test.go b/go/nemo_relay/otel_test.go index e3d78edab..12823be21 100644 --- a/go/nemo_relay/otel_test.go +++ b/go/nemo_relay/otel_test.go @@ -14,8 +14,6 @@ import ( "time" ) -const otelTenantAttributeAlias = "tenant.id" - func assertOtlpStringAttribute(t *testing.T, body []byte, key string, value string) { t.Helper() encoded := append([]byte{0x0a}, binary.AppendUvarint(nil, uint64(len(key)))...) @@ -31,15 +29,15 @@ func assertOtlpStringAttribute(t *testing.T, body []byte, key string, value stri } func TestNewOpenTelemetryConfigDefaults(t *testing.T) { - config := NewOpenTelemetryConfig() + config := NewOpenTelemetryConfig(OpenTelemetryTypeFull, "http://localhost:4318/v1/traces") if config.Transport != OpenTelemetryTransportHTTPBinary { t.Fatalf("expected default transport http_binary, got %q", config.Transport) } - if config.ServiceName != "nemo-relay" { - t.Fatalf("expected default service name nemo-relay, got %q", config.ServiceName) + if config.ServiceName != "unknown_service" { + t.Fatalf("expected default service name unknown_service, got %q", config.ServiceName) } - if config.InstrumentationScope != "nemo-relay-otel" { + if config.InstrumentationScope != "opentelemetry" { t.Fatalf("expected default instrumentation scope, got %q", config.InstrumentationScope) } if config.Timeout != 3*time.Second { @@ -54,8 +52,7 @@ func TestNewOpenTelemetryConfigDefaults(t *testing.T) { } func TestOpenTelemetrySubscriberLifecycle(t *testing.T) { - config := NewOpenTelemetryConfig() - config.Endpoint = "http://localhost:4318/v1/traces" + config := NewOpenTelemetryConfig(OpenTelemetryTypeFull, "http://localhost:4318/v1/traces") config.ServiceName = "go-agent" config.ServiceNamespace = "agents" config.ServiceVersion = "1.0.0" @@ -63,11 +60,6 @@ func TestOpenTelemetrySubscriberLifecycle(t *testing.T) { config.Timeout = 1250 * time.Millisecond config.Headers["authorization"] = "Bearer token" config.ResourceAttributes["deployment.environment"] = "test" - config.AttributeMappings = []OtlpAttributeMapping{{ - Key: "nemo_relay.start.data.tenant", - Alias: otelTenantAttributeAlias, - }} - subscriber, err := NewOpenTelemetrySubscriber(config) if err != nil { t.Fatalf("NewOpenTelemetrySubscriber failed: %v", err) @@ -93,7 +85,7 @@ func TestOpenTelemetrySubscriberLifecycle(t *testing.T) { } func TestOpenTelemetrySubscriberRejectsInvalidTransport(t *testing.T) { - config := NewOpenTelemetryConfig() + config := NewOpenTelemetryConfig(OpenTelemetryTypeFull, "http://localhost:4318/v1/traces") config.Transport = OpenTelemetryTransport("invalid") _, err := NewOpenTelemetrySubscriber(config) @@ -102,12 +94,37 @@ func TestOpenTelemetrySubscriberRejectsInvalidTransport(t *testing.T) { } } -func TestOpenTelemetrySubscriberRejectsInvalidAttributeMapping(t *testing.T) { - config := NewOpenTelemetryConfig() - config.AttributeMappings = []OtlpAttributeMapping{{Key: "", Alias: otelTenantAttributeAlias}} - - if _, err := NewOpenTelemetrySubscriber(config); err == nil { - t.Fatal("expected invalid attribute mapping error") +func TestOpenTelemetrySubscriberRejectsInvalidRequiredFields(t *testing.T) { + testCases := []struct { + name string + config OpenTelemetryConfig + }{ + { + name: "missing type", + config: NewOpenTelemetryConfig("", "http://localhost:4318/v1/traces"), + }, + { + name: "unknown type", + config: NewOpenTelemetryConfig(OpenTelemetryType("invalid"), "http://localhost:4318/v1/traces"), + }, + { + name: "missing endpoint", + config: NewOpenTelemetryConfig(OpenTelemetryTypeFull, ""), + }, + { + name: "blank endpoint", + config: NewOpenTelemetryConfig(OpenTelemetryTypeFull, " \t"), + }, + } + + for _, testCase := range testCases { + t.Run(testCase.name, func(t *testing.T) { + subscriber, err := NewOpenTelemetrySubscriber(testCase.config) + if err == nil { + subscriber.Close() + t.Fatal("expected required-field validation error") + } + }) } } @@ -133,14 +150,8 @@ func TestOpenTelemetrySubscriberExportsScopeLifecycleAndMarks(t *testing.T) { })) defer server.Close() - config := NewOpenTelemetryConfig() - config.Endpoint = server.URL + "/v1/traces" + config := NewOpenTelemetryConfig(OpenTelemetryTypeFull, server.URL+"/v1/traces") config.ServiceName = "go-agent" - config.AttributeMappings = []OtlpAttributeMapping{{ - Key: "nemo_relay.mark.metadata.source", - Alias: otelTenantAttributeAlias, - }} - subscriber, err := NewOpenTelemetrySubscriber(config) if err != nil { t.Fatalf("NewOpenTelemetrySubscriber failed: %v", err) @@ -185,7 +196,50 @@ func TestOpenTelemetrySubscriberExportsScopeLifecycleAndMarks(t *testing.T) { if len(request.Body) == 0 { t.Fatal("expected non-empty OTLP request body") } - assertOtlpStringAttribute(t, request.Body, otelTenantAttributeAlias, "go") + assertOtlpStringAttribute(t, request.Body, "nemo_relay.scope_type", "agent") + case <-time.After(5 * time.Second): + t.Fatal("timed out waiting for OTLP request") + } +} + +func TestOpenTelemetrySubscriberExportsGenAIAgentProjection(t *testing.T) { + requests := make(chan otelRequest, 1) + server := NewOtelTestServer(t, requests) + defer server.Close() + + config := NewOpenTelemetryConfig(OpenTelemetryTypeGenAI, server.URL+"/v1/traces") + subscriber, err := NewOpenTelemetrySubscriber(config) + if err != nil { + t.Fatalf("NewOpenTelemetrySubscriber failed: %v", err) + } + defer subscriber.Close() + + name := "go_gen_ai_e2e_" + time.Now().Format("150405.000000") + if err := subscriber.Register(name); err != nil { + t.Fatalf("Register failed: %v", err) + } + defer func() { _ = subscriber.Deregister(name) }() + + runWithTestScopeStack(t, func() { + handle, err := PushScope("research-agent", ScopeTypeAgent) + requireNoError(t, err, "PushScope failed") + requireNoError(t, PopScope(handle), "PopScope failed") + }) + requireNoError(t, subscriber.ForceFlush(), "ForceFlush failed") + + select { + case request := <-requests: + for _, needle := range [][]byte{ + []byte("invoke_agent research-agent"), + []byte("gen_ai.operation.name"), + } { + if !bytes.Contains(request.Body, needle) { + t.Fatalf("expected OTLP request body to contain %q", needle) + } + } + if bytes.Contains(request.Body, []byte("nemo_relay.")) { + t.Fatal("GenAI projection must not contain nemo_relay attributes") + } case <-time.After(5 * time.Second): t.Fatal("timed out waiting for OTLP request") } diff --git a/go/nemo_relay/top_level_coverage_test.go b/go/nemo_relay/top_level_coverage_test.go index ed62409e4..ee530419b 100644 --- a/go/nemo_relay/top_level_coverage_test.go +++ b/go/nemo_relay/top_level_coverage_test.go @@ -39,7 +39,6 @@ func TestTopLevelNemoRelayCoverage(t *testing.T) { assertCheckedJSONStringFailureCoverage(t) assertNilLLMRequestWrapperCoverage(t) assertOpenTelemetryMarshalFailureCoverage(t) - assertOpenInferenceMarshalFailureCoverage(t) } func TestTopLevelCallbacksCoverage(t *testing.T) { @@ -146,7 +145,8 @@ func assertOpenTelemetryMarshalFailureCoverage(t *testing.T) { jsonMarshal = func(v any) ([]byte, error) { return nil, errors.New("forced otel headers marshal failure") } - _, err := NewOpenTelemetrySubscriber(OpenTelemetryConfig{}) + config := NewOpenTelemetryConfig(OpenTelemetryTypeFull, "http://localhost:4318/v1/traces") + _, err := NewOpenTelemetrySubscriber(config) assertErrorContains(t, err, "forced otel headers marshal failure", "OpenTelemetry header marshal") callCount := 0 @@ -157,34 +157,10 @@ func assertOpenTelemetryMarshalFailureCoverage(t *testing.T) { } return oldMarshal(v) } - _, err = NewOpenTelemetrySubscriber(OpenTelemetryConfig{}) + _, err = NewOpenTelemetrySubscriber(config) assertErrorContains(t, err, "forced otel resource marshal failure", "OpenTelemetry resource marshal") } -func assertOpenInferenceMarshalFailureCoverage(t *testing.T) { - t.Helper() - - oldMarshal := jsonMarshal - t.Cleanup(func() { jsonMarshal = oldMarshal }) - - jsonMarshal = func(v any) ([]byte, error) { - return nil, errors.New("forced openinference headers marshal failure") - } - _, err := NewOpenInferenceSubscriber(OpenInferenceConfig{}) - assertErrorContains(t, err, "forced openinference headers marshal failure", "OpenInference header marshal") - - callCount := 0 - jsonMarshal = func(v any) ([]byte, error) { - callCount++ - if callCount == 2 { - return nil, errors.New("forced openinference resource marshal failure") - } - return oldMarshal(v) - } - _, err = NewOpenInferenceSubscriber(OpenInferenceConfig{}) - assertErrorContains(t, err, "forced openinference resource marshal failure", "OpenInference resource marshal") -} - func assertRegisterClosurePanicCoverage(t *testing.T) { t.Helper() diff --git a/integrations/coding-agents/README.md b/integrations/coding-agents/README.md index 3f6bea221..20ab6d57f 100644 --- a/integrations/coding-agents/README.md +++ b/integrations/coding-agents/README.md @@ -222,12 +222,18 @@ version = 1 kind = "observability" enabled = true +[components.config] +version = 3 + [components.config.atif] enabled = true output_directory = ".nemo-relay/atif" -[components.config.openinference] +[components.config.opentelemetry] enabled = true + +[[components.config.opentelemetry.endpoints]] +type = "openinference" endpoint = "http://127.0.0.1:4318/v1/traces" ``` @@ -236,8 +242,8 @@ plugin config, unsupported exporter settings, or unavailable exporter features. The wrapper does not start the coding agent with a configuration that it cannot parse, validate, or activate. After the gateway and agent are running, exporter delivery failures follow the observability plugin policy: application -work continues while the failing ATOF, ATIF, OpenTelemetry, or OpenInference -destination records, logs, or reports the failure. +work continues while the failing ATOF, ATIF, or typed OpenTelemetry destination +records, logs, or reports the failure. ## Hook Forwarding diff --git a/integrations/openclaw/README.md b/integrations/openclaw/README.md index 4a7d08839..ef959585c 100644 --- a/integrations/openclaw/README.md +++ b/integrations/openclaw/README.md @@ -8,8 +8,8 @@ SPDX-License-Identifier: Apache-2.0 `nemo-relay-openclaw` is the NeMo Relay observability plugin package for OpenClaw. It converts supported OpenClaw hook events into NeMo Relay sessions, LLM spans, tool spans, and lifecycle marks that the generic NeMo Relay -observability component can export as ATIF JSON, OpenTelemetry spans, and -OpenInference/Phoenix spans. The same generic plugin config path can initialize +observability component can export as ATIF JSON and typed OpenTelemetry spans, +including the OpenInference projection for Phoenix. The same generic plugin config path can initialize Adaptive components for hook-backed telemetry learning. This public OpenClaw plugin package uses OpenClaw public hooks. It can run @@ -33,8 +33,8 @@ through a public plugin hook. - Generic NeMo Relay plugin initialization through `config.plugins`. - ATIF JSON export through the built-in `observability` component. - Adaptive plugin initialization through `config.plugins`. -- Optional OpenTelemetry OTLP export. -- Optional OpenInference/Phoenix OTLP export. +- Optional typed OpenTelemetry OTLP endpoints using `full`, `gen_ai`, or + `openinference` projection. - Bounded LLM replay correlation across supported OpenClaw hooks. - Tool span replay with conservative privacy defaults. - Admin-scoped `nemoRelay.status` gateway health method. @@ -82,7 +82,7 @@ OpenClaw plugin configuration under `plugins.entries["nemo-relay"].config`: "kind": "observability", "enabled": true, "config": { - "version": 1, + "version": 3, "atif": { "enabled": true, "agent_name": "openclaw", @@ -90,15 +90,20 @@ OpenClaw plugin configuration under `plugins.entries["nemo-relay"].config`: }, "opentelemetry": { "enabled": false, - "transport": "http_binary", - "endpoint": "http://localhost:4318/v1/traces", - "service_name": "openclaw-nemo-relay" - }, - "openinference": { - "enabled": false, - "transport": "http_binary", - "endpoint": "http://localhost:6006/v1/traces", - "service_name": "openclaw-nemo-relay" + "endpoints": [ + { + "type": "full", + "transport": "http_binary", + "endpoint": "http://localhost:4318/v1/traces", + "service_name": "openclaw-nemo-relay" + }, + { + "type": "openinference", + "transport": "http_binary", + "endpoint": "http://localhost:6006/v1/traces", + "service_name": "openclaw-nemo-relay" + } + ] } } }, @@ -156,11 +161,10 @@ do not use, or set their `enabled` fields to `false`. `adaptive`. - `config.plugins.components[].config.atif` writes ATIF trajectory JSON files. Set `output_directory` to the directory where OpenClaw should write files. -- `config.plugins.components[].config.opentelemetry` sends generic OTLP spans to - an OpenTelemetry collector when `enabled` is `true`. -- `config.plugins.components[].config.openinference` sends OpenInference OTLP - spans to Phoenix or another OpenInference-compatible collector when `enabled` - is `true`. +- `config.plugins.components[].config.opentelemetry.endpoints` sends typed OTLP + spans when the OpenTelemetry section is enabled. Use `full` for the complete + NeMo Relay projection, `gen_ai` for standardized GenAI conventions, or + `openinference` for Phoenix and other OpenInference-compatible collectors. - `config.plugins.components[]` entries with `kind: "adaptive"` initialize the Adaptive plugin. In hook-backed OpenClaw mode, adaptive telemetry can consume replayed NeMo Relay events, while request-rewrite features such as adaptive @@ -191,9 +195,9 @@ sink: - ATIF: confirm JSON files appear in the configured `config.plugins.components[].config.atif.output_directory`. -- OpenTelemetry: confirm spans arrive at the configured OTLP collector. -- OpenInference: confirm spans arrive at the configured OpenInference/Phoenix - endpoint. +- Typed OpenTelemetry: confirm spans arrive at every configured OTLP endpoint; + for an `openinference` endpoint, confirm the projected spans appear in + Phoenix or another OpenInference-compatible backend. The plugin also registers the `operator.admin` scoped gateway method `nemoRelay.status`. If your CLI is already paired with admin-capable gateway @@ -229,9 +233,9 @@ session emits the relevant LLM, message-write, and tool hooks. If no export output appears, verify `config.plugins.components[].config.atif.output_directory`, -`config.plugins.components[].config.opentelemetry.endpoint`, or -`config.plugins.components[].config.openinference.endpoint`, then confirm the -configured collector or output directory is reachable. +or each +`config.plugins.components[].config.opentelemetry.endpoints[].endpoint`, then +confirm the configured collector or output directory is reachable. ## Development diff --git a/integrations/openclaw/index.ts b/integrations/openclaw/index.ts index 97d8e399d..57d161aaa 100644 --- a/integrations/openclaw/index.ts +++ b/integrations/openclaw/index.ts @@ -17,7 +17,7 @@ type NemoRelayPluginEntry = ReturnType; const nemoRelayPluginEntry: NemoRelayPluginEntry = definePluginEntry({ id: 'nemo-relay', name: 'NeMo Relay Observability', - description: 'ATIF, OpenInference, and OpenTelemetry telemetry through NeMo Relay', + description: 'ATIF and typed OpenTelemetry telemetry through NeMo Relay', configSchema: nemoRelayConfigSchema, register(api: OpenClawPluginApi) { registerNemoRelayPlugin(api); diff --git a/integrations/openclaw/openclaw.plugin.json b/integrations/openclaw/openclaw.plugin.json index d27396093..47324792e 100644 --- a/integrations/openclaw/openclaw.plugin.json +++ b/integrations/openclaw/openclaw.plugin.json @@ -1,7 +1,7 @@ { "id": "nemo-relay", "name": "NeMo Relay Observability", - "description": "ATIF, OpenInference, and OpenTelemetry telemetry through NeMo Relay.", + "description": "ATIF and typed OpenTelemetry telemetry through NeMo Relay.", "activation": { "onStartup": true }, @@ -25,7 +25,7 @@ }, "plugins": { "$ref": "#/$defs/nemoRelayPluginConfig", - "description": "Generic NeMo Relay plugin configuration document. Use the observability component to configure ATIF, OpenTelemetry, and OpenInference exporters." + "description": "Generic NeMo Relay plugin configuration document. Use the observability component to configure ATIF and typed OpenTelemetry exporters." }, "capture": { "type": "object", diff --git a/integrations/openclaw/src/config.ts b/integrations/openclaw/src/config.ts index f4998d1ed..81cb7a453 100644 --- a/integrations/openclaw/src/config.ts +++ b/integrations/openclaw/src/config.ts @@ -178,7 +178,7 @@ function rejectRemovedFields(raw: Record): void { } if (raw.telemetry !== undefined) { throw new Error( - 'telemetry was removed; configure plugins.components[].config.opentelemetry or openinference on the observability component', + 'telemetry was removed; configure plugins.components[].config.opentelemetry.endpoints on the observability component', ); } } diff --git a/integrations/openclaw/src/health.ts b/integrations/openclaw/src/health.ts index 0a99c48e3..011715d3e 100644 --- a/integrations/openclaw/src/health.ts +++ b/integrations/openclaw/src/health.ts @@ -85,8 +85,13 @@ function configuredObservabilityOutputs(config: NemoRelayHookBackendConfig): { const componentConfig = asRecord(record.config); outputs.atif ||= sectionEnabled(componentConfig?.atif); - outputs.otel ||= sectionEnabled(componentConfig?.opentelemetry); - outputs.openInference ||= sectionEnabled(componentConfig?.openinference); + const opentelemetry = asRecord(componentConfig?.opentelemetry); + const opentelemetryEnabled = sectionEnabled(opentelemetry); + outputs.otel ||= opentelemetryEnabled; + outputs.openInference ||= + opentelemetryEnabled && + Array.isArray(opentelemetry?.endpoints) && + opentelemetry.endpoints.some((endpoint) => asRecord(endpoint)?.type === 'openinference'); } return outputs; diff --git a/integrations/openclaw/test/config.test.ts b/integrations/openclaw/test/config.test.ts index f82212709..6fec18197 100644 --- a/integrations/openclaw/test/config.test.ts +++ b/integrations/openclaw/test/config.test.ts @@ -127,7 +127,7 @@ describe('nemo-relay OpenClaw plugin shell', () => { ); assert.throws( () => parseConfig({ telemetry: { otel: { enabled: true } } }), - /telemetry was removed; configure plugins\.components\[\]\.config\.opentelemetry or openinference/, + /telemetry was removed; configure plugins\.components\[\]\.config\.opentelemetry\.endpoints/, ); assert.throws( () => parseConfig({ nemoRelay: { pluginConfig: { version: 1, components: [] } } }), @@ -298,10 +298,15 @@ describe('nemo-relay OpenClaw plugin shell', () => { kind: 'observability', enabled: true, config: { - version: 1, + version: 3, atif: { enabled: true, agent_name: 'openclaw' }, - opentelemetry: { enabled: true, endpoint: 'http://otel.example' }, - openinference: { enabled: true, endpoint: 'http://phoenix.example' }, + opentelemetry: { + enabled: true, + endpoints: [ + { type: 'full', endpoint: 'http://otel.example' }, + { type: 'openinference', endpoint: 'http://phoenix.example' }, + ], + }, }, }, { diff --git a/integrations/openclaw/test/live-smoke.test.ts b/integrations/openclaw/test/live-smoke.test.ts index 0b480cbdf..c8b3de692 100644 --- a/integrations/openclaw/test/live-smoke.test.ts +++ b/integrations/openclaw/test/live-smoke.test.ts @@ -32,7 +32,7 @@ it( kind: 'observability', enabled: true, config: { - version: 2, + version: 3, atif: { enabled: true, agent_name: 'openclaw', diff --git a/python/nemo_relay/README.md b/python/nemo_relay/README.md index 0927b4f04..d357e8ed6 100644 --- a/python/nemo_relay/README.md +++ b/python/nemo_relay/README.md @@ -33,8 +33,8 @@ Use the Python binding for the following tasks: - **Package policy around callbacks**: Use guardrails and intercepts to block work, sanitize observability payloads, rewrite requests, or wrap execution. - **Emit one lifecycle stream**: Send runtime events to in-process - subscribers, Agent Trajectory Interchange Format (ATIF), OpenTelemetry, or - OpenInference workflows. + subscribers, Agent Trajectory Interchange Format (ATIF), or typed + OpenTelemetry workflows. - **Integrate without a framework migration**: Wrap framework or provider callbacks while preserving the application’s orchestration model. @@ -47,8 +47,9 @@ The Python package provides the following capabilities: - **Middleware APIs**: Guardrails and intercepts for tool and LLM requests, responses, and execution, plus mark and scope event sanitizers for `data`, `category_profile`, and `metadata`. -- **Subscribers and exporters**: Event consumers for observability and - diagnostics. +- **Subscribers and exporters**: `OpenTelemetrySubscriber` accepts one required + `full`, `gen_ai`, or `openinference` endpoint configuration. The + `nemo_relay.observability` helpers configure plugin-owned endpoint fan-out. - **Plugin and typed helpers**: Public modules for plugins, codecs, typed wrappers, adaptive runtime behavior, and observability plugin configuration. - **Shared Rust runtime semantics**: Python behavior aligned with the Rust diff --git a/python/nemo_relay/__init__.py b/python/nemo_relay/__init__.py index fb8c89152..048283224 100644 --- a/python/nemo_relay/__init__.py +++ b/python/nemo_relay/__init__.py @@ -26,7 +26,7 @@ - native runtime types such as ``ScopeHandle``, ``ToolHandle``, ``LLMHandle``, ``LLMRequest``, ``ScopeType``, and the lifecycle event classes - observability helpers such as ``AtifExporter``, ``AtofExporter``, - ``OpenTelemetrySubscriber``, and ``OpenInferenceSubscriber`` + and ``OpenTelemetrySubscriber`` - JSON and callback type aliases used by middleware, typed wrappers, and plugin-facing configuration helpers @@ -105,8 +105,6 @@ async def main(): LlmSanitizeResponseCodec, LlmSanitizeResponseContext, MarkEvent, - OpenInferenceConfig, - OpenInferenceSubscriber, OpenTelemetryConfig, OpenTelemetrySubscriber, PendingMarkSpec, @@ -488,8 +486,6 @@ def worker() -> None: "AtofExporterMode", "AtofExporterConfig", "AtofExporter", - "OpenInferenceConfig", - "OpenInferenceSubscriber", "OpenTelemetryConfig", "OpenTelemetrySubscriber", "JsonPrimitive", diff --git a/python/nemo_relay/__init__.pyi b/python/nemo_relay/__init__.pyi index 7c2372a57..cdd311d12 100644 --- a/python/nemo_relay/__init__.pyi +++ b/python/nemo_relay/__init__.pyi @@ -90,12 +90,6 @@ from nemo_relay._native import ( from nemo_relay._native import ( MarkEvent as MarkEvent, ) -from nemo_relay._native import ( - OpenInferenceConfig as OpenInferenceConfig, -) -from nemo_relay._native import ( - OpenInferenceSubscriber as OpenInferenceSubscriber, -) from nemo_relay._native import ( OpenTelemetryConfig as OpenTelemetryConfig, ) diff --git a/python/nemo_relay/_native.pyi b/python/nemo_relay/_native.pyi index a76ee5240..f14c0f9ce 100644 --- a/python/nemo_relay/_native.pyi +++ b/python/nemo_relay/_native.pyi @@ -1013,15 +1013,20 @@ class OpenTelemetryConfig: """ transport: str - endpoint: Optional[str] + otel_type: Literal["full", "gen_ai", "openinference"] + endpoint: str service_name: str service_namespace: Optional[str] service_version: Optional[str] instrumentation_scope: str timeout_millis: int - def __init__(self) -> None: - """Create an OpenTelemetry config with native defaults.""" + def __init__( + self, + otel_type: Literal["full", "gen_ai", "openinference"], + endpoint: str, + ) -> None: + """Create a typed OpenTelemetry config for the required endpoint.""" ... @property def headers(self) -> dict[str, str]: @@ -1039,14 +1044,6 @@ class OpenTelemetryConfig: def resource_attributes(self, value: dict[str, str]) -> None: """Replace additional OpenTelemetry resource attributes.""" ... - @property - def attribute_mappings(self) -> list[dict[str, str]]: - """Return typed projected-attribute aliases.""" - ... - @attribute_mappings.setter - def attribute_mappings(self, value: list[dict[str, str]]) -> None: - """Replace typed projected-attribute aliases.""" - ... def set_header(self, key: str, value: str) -> None: """Set one exporter header key/value pair.""" ... @@ -1081,86 +1078,6 @@ class OpenTelemetrySubscriber: """Shut down native OpenTelemetry resources.""" ... -class OpenInferenceConfig: - """Mutable configuration for ``OpenInferenceSubscriber``. - - Summary: - Native OpenInference exporter configuration object. - - Description: - Configure transport, endpoint, service identity, exporter timeout, - headers, and resource attributes before constructing a subscriber. - """ - - transport: str - endpoint: Optional[str] - service_name: str - service_namespace: Optional[str] - service_version: Optional[str] - instrumentation_scope: str - timeout_millis: int - - def __init__(self) -> None: - """Create an OpenInference config with native defaults.""" - ... - @property - def headers(self) -> dict[str, str]: - """Return additional exporter headers.""" - ... - @headers.setter - def headers(self, value: dict[str, str]) -> None: - """Replace additional exporter headers.""" - ... - @property - def resource_attributes(self) -> dict[str, str]: - """Return additional OpenInference resource attributes.""" - ... - @resource_attributes.setter - def resource_attributes(self, value: dict[str, str]) -> None: - """Replace additional OpenInference resource attributes.""" - ... - @property - def attribute_mappings(self) -> list[dict[str, str]]: - """Return typed projected-attribute aliases.""" - ... - @attribute_mappings.setter - def attribute_mappings(self, value: list[dict[str, str]]) -> None: - """Replace typed projected-attribute aliases.""" - ... - def set_header(self, key: str, value: str) -> None: - """Set one exporter header key/value pair.""" - ... - def set_resource_attribute(self, key: str, value: str) -> None: - """Set one OpenInference resource attribute key/value pair.""" - ... - -class OpenInferenceSubscriber: - """OpenInference-backed NeMo Relay event subscriber. - - Summary: - Native subscriber that exports lifecycle events as OpenInference spans. - - Description: - Register the subscriber under a name to receive runtime events. Flush or - shut it down before process exit when deterministic export is required. - """ - - def __init__(self, config: OpenInferenceConfig) -> None: - """Create a subscriber from an OpenInference config.""" - ... - def register(self, name: str) -> None: - """Register the subscriber under ``name``.""" - ... - def deregister(self, name: str) -> bool: - """Deregister ``name`` and return whether it existed.""" - ... - def force_flush(self) -> None: - """Flush pending telemetry through the configured exporter.""" - ... - def shutdown(self) -> None: - """Shut down native OpenInference resources.""" - ... - class OpenAIChatCodec: """Built-in codec for OpenAI Chat Completions requests and responses. diff --git a/python/nemo_relay/observability.py b/python/nemo_relay/observability.py index 5f9bc8837..c04ad551d 100644 --- a/python/nemo_relay/observability.py +++ b/python/nemo_relay/observability.py @@ -10,8 +10,6 @@ from nemo_relay import Json, JsonObject, UnsupportedBehavior -MarkProjection = Literal["inherit", "event", "tool"] - class _SupportsToDict(Protocol): def to_dict(self) -> JsonObject: ... @@ -214,53 +212,60 @@ def to_dict(self) -> JsonObject: @dataclass(slots=True) -class OtlpConfig: - """Shared OpenTelemetry/OpenInference OTLP export settings.""" +class OpenTelemetryEndpointConfig: + """One typed OpenTelemetry OTLP destination.""" - enabled: bool = False - mark_projection: MarkProjection = "inherit" - mark_exclude_names: list[str] = field(default_factory=lambda: ["llm.chunk"]) + type: Literal["full", "gen_ai", "openinference"] + endpoint: str transport: Literal["http_binary", "grpc"] = "http_binary" - endpoint: str | None = None - headers: dict[str, str] = field(default_factory=dict) - resource_attributes: dict[str, str] = field(default_factory=dict) - service_name: str = "nemo-relay" + service_name: str = "unknown_service" service_namespace: str | None = None service_version: str | None = None - instrumentation_scope: str | None = None + instrumentation_scope: str = "opentelemetry" timeout_millis: int = 3000 - attribute_mappings: list[dict[str, str]] = field(default_factory=list) + headers: dict[str, str] = field(default_factory=dict) + header_env: dict[str, str] = field(default_factory=dict) + resource_attributes: dict[str, str] = field(default_factory=dict) def to_dict(self) -> JsonObject: - """Serialize this OTLP config to the canonical JSON object shape.""" + """Serialize this endpoint to the canonical plugin shape.""" return _normalize_object( { - "enabled": self.enabled, - "mark_projection": self.mark_projection, - "mark_exclude_names": self.mark_exclude_names, - "attribute_mappings": self.attribute_mappings, - "transport": self.transport, + "type": self.type, "endpoint": self.endpoint, - "headers": self.headers, - "resource_attributes": self.resource_attributes, + "transport": self.transport, "service_name": self.service_name, "service_namespace": self.service_namespace, "service_version": self.service_version, "instrumentation_scope": self.instrumentation_scope, "timeout_millis": self.timeout_millis, + "headers": self.headers, + "header_env": self.header_env, + "resource_attributes": self.resource_attributes, } ) +@dataclass(slots=True) +class OpenTelemetrySectionConfig: + """Multi-endpoint OpenTelemetry plugin settings.""" + + enabled: bool = False + endpoints: list[OpenTelemetryEndpointConfig] = field(default_factory=list) + + def to_dict(self) -> JsonObject: + """Serialize this section to the canonical plugin shape.""" + return _normalize_object({"enabled": self.enabled, "endpoints": self.endpoints}) + + @dataclass(slots=True) class ObservabilityConfig: """Canonical config document for the top-level observability component.""" - version: int = 2 + version: int = 3 atof: AtofConfig | None = None atif: AtifConfig | None = None - opentelemetry: OtlpConfig | None = None - openinference: OtlpConfig | None = None + opentelemetry: OpenTelemetrySectionConfig | None = None policy: ConfigPolicy = field(default_factory=ConfigPolicy) def to_dict(self) -> JsonObject: @@ -271,7 +276,6 @@ def to_dict(self) -> JsonObject: "atof": self.atof, "atif": self.atif, "opentelemetry": self.opentelemetry, - "openinference": self.openinference, "policy": self.policy, } ) @@ -304,9 +308,9 @@ def to_dict(self) -> JsonObject: "AtofConfig", "AtifConfig", "HttpStorageConfig", - "MarkProjection", "S3StorageConfig", - "OtlpConfig", + "OpenTelemetryEndpointConfig", + "OpenTelemetrySectionConfig", "ObservabilityConfig", "OBSERVABILITY_PLUGIN_KIND", "ComponentSpec", diff --git a/python/nemo_relay/observability.pyi b/python/nemo_relay/observability.pyi index d7b24807d..45029765c 100644 --- a/python/nemo_relay/observability.pyi +++ b/python/nemo_relay/observability.pyi @@ -10,8 +10,6 @@ from typing import Literal from nemo_relay import JsonObject, UnsupportedBehavior -MarkProjection = Literal["inherit", "event", "tool"] - @dataclass(slots=True) class ConfigPolicy: unknown_component: UnsupportedBehavior = ... @@ -79,20 +77,24 @@ class AtifConfig: def to_dict(self) -> JsonObject: ... @dataclass(slots=True) -class OtlpConfig: - enabled: bool = ... - mark_projection: MarkProjection = ... - mark_exclude_names: list[str] = ... +class OpenTelemetryEndpointConfig: + type: Literal["full", "gen_ai", "openinference"] + endpoint: str transport: Literal["http_binary", "grpc"] = ... - endpoint: str | None = ... - headers: dict[str, str] = field(default_factory=dict) - resource_attributes: dict[str, str] = field(default_factory=dict) service_name: str = ... service_namespace: str | None = ... service_version: str | None = ... - instrumentation_scope: str | None = ... + instrumentation_scope: str = ... timeout_millis: int = ... - attribute_mappings: list[dict[str, str]] = field(default_factory=list) + headers: dict[str, str] = field(default_factory=dict) + header_env: dict[str, str] = field(default_factory=dict) + resource_attributes: dict[str, str] = field(default_factory=dict) + def to_dict(self) -> JsonObject: ... + +@dataclass(slots=True) +class OpenTelemetrySectionConfig: + enabled: bool = ... + endpoints: list[OpenTelemetryEndpointConfig] = field(default_factory=list) def to_dict(self) -> JsonObject: ... @dataclass(slots=True) @@ -100,8 +102,7 @@ class ObservabilityConfig: version: int = ... atof: AtofConfig | None = ... atif: AtifConfig | None = ... - opentelemetry: OtlpConfig | None = ... - openinference: OtlpConfig | None = ... + opentelemetry: OpenTelemetrySectionConfig | None = ... policy: ConfigPolicy = field(default_factory=ConfigPolicy) def to_dict(self) -> JsonObject: ... diff --git a/python/tests/integrations/deepagents_tests/test_deepagents_integration.py b/python/tests/integrations/deepagents_tests/test_deepagents_integration.py index f9de8ce37..42e70cbc7 100644 --- a/python/tests/integrations/deepagents_tests/test_deepagents_integration.py +++ b/python/tests/integrations/deepagents_tests/test_deepagents_integration.py @@ -628,10 +628,9 @@ def test_e2e_agent_exports_openinference_output_contract( agent = create_deep_agent(**kwargs) with _OtelCollector() as collector: - config = nemo_relay.OpenInferenceConfig() - config.endpoint = collector.endpoint + config = nemo_relay.OpenTelemetryConfig("openinference", collector.endpoint) config.service_name = "deepagents-test" - subscriber = nemo_relay.OpenInferenceSubscriber(config) + subscriber = nemo_relay.OpenTelemetrySubscriber(config) subscriber_name = f"deepagents_openinference_{uuid4().hex}" event_recorder_name = f"deepagents_events_{uuid4().hex}" subscriber.register(subscriber_name) diff --git a/python/tests/test_observability_plugin.py b/python/tests/test_observability_plugin.py index c82626fdf..1fa94c214 100644 --- a/python/tests/test_observability_plugin.py +++ b/python/tests/test_observability_plugin.py @@ -25,7 +25,8 @@ ComponentSpec, HttpStorageConfig, ObservabilityConfig, - OtlpConfig, + OpenTelemetryEndpointConfig, + OpenTelemetrySectionConfig, S3StorageConfig, ) @@ -91,25 +92,32 @@ def test_defaults_and_component_wrapper(self): "model_name": "unknown", "filename_template": "nemo-relay-atif-{session_id}.json", } - assert OtlpConfig().to_dict() == { + assert OpenTelemetrySectionConfig().to_dict() == { "enabled": False, - "mark_projection": "inherit", - "mark_exclude_names": ["llm.chunk"], - "attribute_mappings": [], + "endpoints": [], + } + assert OpenTelemetryEndpointConfig( + "gen_ai", + "http://localhost:4318/v1/traces", + header_env={"authorization": "OTEL_AUTHORIZATION"}, + ).to_dict() == { + "type": "gen_ai", + "endpoint": "http://localhost:4318/v1/traces", "transport": "http_binary", + "service_name": "unknown_service", + "instrumentation_scope": "opentelemetry", + "timeout_millis": 3000, "headers": {}, + "header_env": {"authorization": "OTEL_AUTHORIZATION"}, "resource_attributes": {}, - "service_name": "nemo-relay", - "timeout_millis": 3000, } - assert OtlpConfig(mark_projection="tool").to_dict()["mark_projection"] == "tool" wrapped = ComponentSpec(ObservabilityConfig(atof=AtofConfig())).to_dict() assert wrapped["kind"] == OBSERVABILITY_PLUGIN_KIND assert wrapped["enabled"] is True wrapped_config = wrapped["config"] assert isinstance(wrapped_config, dict) - assert wrapped_config["version"] == 2 + assert wrapped_config["version"] == 3 def test_validation_rejects_bad_values(self): report = plugin.validate( @@ -117,7 +125,7 @@ def test_validation_rejects_bad_values(self): components=[ ComponentSpec( { - "version": 2, + "version": 3, "atof": {"sinks": [{"type": "file", "mode": "bad"}]}, "atif": {"filename_template": "missing-placeholder"}, } diff --git a/python/tests/test_types.py b/python/tests/test_types.py index f537216b1..c523a39f1 100644 --- a/python/tests/test_types.py +++ b/python/tests/test_types.py @@ -20,8 +20,6 @@ LLMAttributes, LLMRequest, MarkEvent, - OpenInferenceConfig, - OpenInferenceSubscriber, OpenTelemetryConfig, OpenTelemetrySubscriber, ScopeAttributes, @@ -567,17 +565,16 @@ def test_append_and_overwrite_modes(self, tmp_path): class TestOpenTelemetryTypes: def test_config_defaults_mutation_and_repr(self): - config = OpenTelemetryConfig() + config = OpenTelemetryConfig("full", "http://localhost:4318/v1/traces") assert config.transport == "http_binary" - assert config.endpoint is None - assert config.service_name == "nemo-relay" - assert config.instrumentation_scope == "nemo-relay-otel" + assert config.endpoint == "http://localhost:4318/v1/traces" + assert config.service_name == "unknown_service" + assert config.instrumentation_scope == "opentelemetry" assert config.timeout_millis == 3000 assert config.headers == {} assert config.resource_attributes == {} - config.endpoint = "http://localhost:4318/v1/traces" config.service_name = "py-agent" config.service_namespace = "agents" config.service_version = "1.0.0" @@ -588,12 +585,10 @@ def test_config_defaults_mutation_and_repr(self): assert config.headers == {"authorization": "Bearer token"} assert config.resource_attributes == {"deployment.environment": "test"} - config.attribute_mappings = [{"key": "nemo_relay.start.metadata.tenant", "alias": "tenant.id"}] - assert config.attribute_mappings == [{"key": "nemo_relay.start.metadata.tenant", "alias": "tenant.id"}] assert "OpenTelemetryConfig" in repr(config) def test_config_rejects_invalid_map_values(self): - config = OpenTelemetryConfig() + config = OpenTelemetryConfig("full", "http://localhost:4318/v1/traces") with pytest.raises(ValueError, match="dict\\[str, str\\]"): config.headers = cast(dict[str, str], []) @@ -601,21 +596,8 @@ def test_config_rejects_invalid_map_values(self): with pytest.raises(ValueError, match="dict\\[str, str\\]"): config.resource_attributes = cast(dict[str, str], {"env": 1}) - with pytest.raises(ValueError, match="attribute mapping key must not be blank"): - config.attribute_mappings = [{"key": "", "alias": "tenant.id"}] - - with pytest.raises(ValueError, match="attribute mapping alias must not be blank"): - config.attribute_mappings = [{"key": "nemo_relay.mark.metadata.source", "alias": ""}] - - with pytest.raises(ValueError, match=r"attribute mapping alias .* duplicated"): - config.attribute_mappings = [ - {"key": "one", "alias": "tenant.id"}, - {"key": "two", "alias": "tenant.id"}, - ] - def test_subscriber_lifecycle_and_invalid_transport(self): - config = OpenTelemetryConfig() - config.endpoint = "http://localhost:4318/v1/traces" + config = OpenTelemetryConfig("full", "http://localhost:4318/v1/traces") config.service_name = "py-agent" subscriber = OpenTelemetrySubscriber(config) @@ -631,18 +613,31 @@ def test_subscriber_lifecycle_and_invalid_transport(self): finally: subscribers.deregister(subscriber_name) - bad = OpenTelemetryConfig() + bad = OpenTelemetryConfig("full", "http://localhost:4318/v1/traces") bad.transport = "invalid" with pytest.raises(ValueError, match="transport must be"): OpenTelemetrySubscriber(bad) + def test_subscriber_rejects_missing_or_invalid_required_fields(self): + with pytest.raises(TypeError): + OpenTelemetryConfig() # ty: ignore[missing-argument] + + invalid_type = OpenTelemetryConfig( + "invalid", # ty: ignore[invalid-argument-type] + "http://localhost:4318/v1/traces", + ) + with pytest.raises(ValueError, match="type must be"): + OpenTelemetrySubscriber(invalid_type) + + blank_endpoint = OpenTelemetryConfig("full", " \t") + with pytest.raises(ValueError, match="endpoint is required and must be nonblank"): + OpenTelemetrySubscriber(blank_endpoint) + def test_subscriber_exports_scope_and_mark_events_end_to_end(self): with _OtelCollector() as collector: source = "python-é" * 20 - config = OpenTelemetryConfig() - config.endpoint = collector.endpoint + config = OpenTelemetryConfig("full", collector.endpoint) config.service_name = "py-agent" - config.attribute_mappings = [{"key": "nemo_relay.mark.metadata.source", "alias": "tenant.id"}] subscriber = OpenTelemetrySubscriber(config) subscriber_name = f"py_otel_e2e_{uuid4().hex}" @@ -665,7 +660,28 @@ def test_subscriber_exports_scope_and_mark_events_end_to_end(self): assert request["path"] == "/v1/traces" assert request["headers"]["content-type"] == "application/x-protobuf" assert request["body"] - assert _otlp_string_attribute("tenant.id", source) in request["body"] + assert b"nemo_relay.mark.metadata.source" in request["body"] + finally: + subscriber.deregister(subscriber_name) + subscriber.shutdown() + + def test_gen_ai_subscriber_exports_standardized_agent_span(self): + with _OtelCollector() as collector: + config = OpenTelemetryConfig("gen_ai", collector.endpoint) + subscriber = OpenTelemetrySubscriber(config) + subscriber_name = f"py_gen_ai_e2e_{uuid4().hex}" + subscriber.register(subscriber_name) + + try: + handle = scope.push("research-agent", ScopeType.Agent) + scope.pop(handle) + + subscriber.force_flush() + request = collector.wait_for_request() + assert request["path"] == "/v1/traces" + assert b"invoke_agent research-agent" in request["body"] + assert b"gen_ai.operation.name" in request["body"] + assert b"nemo_relay." not in request["body"] finally: subscriber.deregister(subscriber_name) subscriber.shutdown() @@ -673,17 +689,15 @@ def test_subscriber_exports_scope_and_mark_events_end_to_end(self): class TestOpenInferenceTypes: def test_config_defaults_mutation_and_repr(self): - config = OpenInferenceConfig() + config = OpenTelemetryConfig("openinference", "http://localhost:4318/v1/traces") assert config.transport == "http_binary" - assert config.endpoint is None - assert config.service_name == "nemo-relay" - assert config.instrumentation_scope == "nemo-relay-openinference" + assert config.service_name == "unknown_service" + assert config.instrumentation_scope == "opentelemetry" assert config.timeout_millis == 3000 assert config.headers == {} assert config.resource_attributes == {} - config.endpoint = "http://localhost:4318/v1/traces" config.service_name = "py-agent" config.service_namespace = "agents" config.service_version = "1.0.0" @@ -694,12 +708,10 @@ def test_config_defaults_mutation_and_repr(self): assert config.headers == {"authorization": "Bearer token"} assert config.resource_attributes == {"deployment.environment": "test"} - config.attribute_mappings = [{"key": "openinference.metadata.tenant", "alias": "tenant.id"}] - assert config.attribute_mappings == [{"key": "openinference.metadata.tenant", "alias": "tenant.id"}] - assert "OpenInferenceConfig" in repr(config) + assert "OpenTelemetryConfig" in repr(config) def test_config_rejects_invalid_map_values(self): - config = OpenInferenceConfig() + config = OpenTelemetryConfig("openinference", "http://localhost:4318/v1/traces") with pytest.raises(ValueError, match="dict\\[str, str\\]"): config.headers = cast(dict[str, str], []) @@ -707,25 +719,12 @@ def test_config_rejects_invalid_map_values(self): with pytest.raises(ValueError, match="dict\\[str, str\\]"): config.resource_attributes = cast(dict[str, str], {"env": 1}) - with pytest.raises(ValueError, match="attribute mapping key must not be blank"): - config.attribute_mappings = [{"key": "", "alias": "tenant.id"}] - - with pytest.raises(ValueError, match="attribute mapping alias must not be blank"): - config.attribute_mappings = [{"key": "openinference.metadata.tenant", "alias": ""}] - - with pytest.raises(ValueError, match=r"attribute mapping alias .* duplicated"): - config.attribute_mappings = [ - {"key": "one", "alias": "tenant.id"}, - {"key": "two", "alias": "tenant.id"}, - ] - def test_subscriber_lifecycle_and_invalid_transport(self): - config = OpenInferenceConfig() - config.endpoint = "http://localhost:4318/v1/traces" + config = OpenTelemetryConfig("openinference", "http://localhost:4318/v1/traces") config.service_name = "py-agent" - subscriber = OpenInferenceSubscriber(config) - assert "" in repr(subscriber) + subscriber = OpenTelemetrySubscriber(config) + assert "" in repr(subscriber) subscriber_name = f"py_openinference_subscriber_{uuid4().hex}" subscriber.register(subscriber_name) @@ -737,27 +736,23 @@ def test_subscriber_lifecycle_and_invalid_transport(self): finally: subscribers.deregister(subscriber_name) - grpc = OpenInferenceConfig() + grpc = OpenTelemetryConfig("openinference", "http://127.0.0.1:4317") grpc.transport = "grpc" - grpc.endpoint = "http://127.0.0.1:4317" grpc.service_name = "py-agent-grpc" - grpc_subscriber = OpenInferenceSubscriber(grpc) + grpc_subscriber = OpenTelemetrySubscriber(grpc) grpc_subscriber.shutdown() - bad = OpenInferenceConfig() + bad = OpenTelemetryConfig("openinference", "http://localhost:4318/v1/traces") bad.transport = "invalid" with pytest.raises(ValueError, match="transport must be"): - OpenInferenceSubscriber(bad) + OpenTelemetrySubscriber(bad) def test_subscriber_exports_scope_and_mark_events_end_to_end(self): with _OtelCollector() as collector: source = "python-é" * 20 - config = OpenInferenceConfig() - config.endpoint = collector.endpoint + config = OpenTelemetryConfig("openinference", collector.endpoint) config.service_name = "py-agent" - config.attribute_mappings = [{"key": "nemo_relay.mark.metadata.source", "alias": "tenant.id"}] - - subscriber = OpenInferenceSubscriber(config) + subscriber = OpenTelemetrySubscriber(config) subscriber_name = f"py_openinference_e2e_{uuid4().hex}" subscriber.register(subscriber_name) @@ -782,7 +777,6 @@ def test_subscriber_exports_scope_and_mark_events_end_to_end(self): assert b"AGENT" in request["body"] assert b"metadata" in request["body"] assert b"openinference_mark" in request["body"] - assert _otlp_string_attribute("tenant.id", source) in request["body"] finally: subscriber.deregister(subscriber_name) subscriber.shutdown() diff --git a/scripts/licensing/attributions_lockfile_md.py b/scripts/licensing/attributions_lockfile_md.py index 068d52162..5b0e3111b 100755 --- a/scripts/licensing/attributions_lockfile_md.py +++ b/scripts/licensing/attributions_lockfile_md.py @@ -436,6 +436,7 @@ def _render_rust_crate_attribution( repo = str(crate.get("repository") or "").strip() if not repo: repo = f"https://crates.io/crates/{name}" + license_text = "\n".join(line.rstrip() for line in license_text.splitlines()) rendered = "".join( [ From 5a872363470333caaf87c950692cd4a996c68129 Mon Sep 17 00:00:00 2001 From: Will Killian Date: Sun, 26 Jul 2026 22:35:32 -0400 Subject: [PATCH 2/4] test(cli): make endpoint probes portable on Windows Signed-off-by: Will Killian --- crates/cli/src/diagnostics/probes.rs | 7 ++++++- crates/cli/tests/coverage/shared/doctor_tests.rs | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/crates/cli/src/diagnostics/probes.rs b/crates/cli/src/diagnostics/probes.rs index 52149779e..0fdbcd7af 100644 --- a/crates/cli/src/diagnostics/probes.rs +++ b/crates/cli/src/diagnostics/probes.rs @@ -154,7 +154,12 @@ mod tcp_tests { drop(listener); let refused = probe_tcp_named("OpenTelemetry endpoint", &endpoint).await; assert_eq!(refused.status, Status::Fail); - assert!(refused.details.contains("connection failed")); + assert!( + refused.details.contains("connection failed") + || refused.details.contains("connection timed out"), + "{}", + refused.details + ); } #[test] diff --git a/crates/cli/tests/coverage/shared/doctor_tests.rs b/crates/cli/tests/coverage/shared/doctor_tests.rs index 0801bf227..00dc7cda5 100644 --- a/crates/cli/tests/coverage/shared/doctor_tests.rs +++ b/crates/cli/tests/coverage/shared/doctor_tests.rs @@ -8,7 +8,7 @@ use std::path::PathBuf; use std::sync::{Arc, Mutex}; use crate::configuration::ResolvedDynamicPluginConfig; -use crate::test_support::{EnvScope, accept_bounded}; +use crate::test_support::{EnvScope, accept_bounded, read_headers}; fn start_doctor_http_capture_server() -> (String, Arc>, std::thread::JoinHandle<()>) { let listener = TcpListener::bind("127.0.0.1:0").unwrap(); @@ -1000,6 +1000,7 @@ async fn opentelemetry_doctor_covers_http_missing_and_malformed_endpoints() { let endpoint = format!("http://{}", listener.local_addr().unwrap()); let accept = std::thread::spawn(move || { let mut stream = accept_bounded(&listener); + let _ = read_headers(&mut stream); stream .write_all(b"HTTP/1.1 204 No Content\r\nContent-Length: 0\r\n\r\n") .unwrap(); From 7fb9fbc403c44f42dba16527afebcbe722061605 Mon Sep 17 00:00:00 2001 From: Will Killian Date: Sun, 26 Jul 2026 23:11:02 -0400 Subject: [PATCH 3/4] test(observability): cover GenAI response attributes Signed-off-by: Will Killian --- .../tests/unit/observability/otel_tests.rs | 64 ++++++++++++++++++- 1 file changed, 62 insertions(+), 2 deletions(-) diff --git a/crates/core/tests/unit/observability/otel_tests.rs b/crates/core/tests/unit/observability/otel_tests.rs index 40a7ce38f..74ea78ab6 100644 --- a/crates/core/tests/unit/observability/otel_tests.rs +++ b/crates/core/tests/unit/observability/otel_tests.rs @@ -15,8 +15,8 @@ use crate::api::scope::{event, pop_scope, push_scope}; use crate::api::tool::ToolAttributes; use crate::codec::model_pricing::pricing_test_mutex; use crate::codec::response::{ - AnnotatedLlmResponse, CostEstimate, CostSource, PricingCatalog, PricingResolver, Usage, - reset_active_pricing_resolver, set_active_pricing_resolver, + AnnotatedLlmResponse, CostEstimate, CostSource, FinishReason, PricingCatalog, PricingResolver, + Usage, reset_active_pricing_resolver, set_active_pricing_resolver, }; use crate::json::Json; use crate::observability::atif::{AtifAgentInfo, AtifExporter, AtifStepExtra}; @@ -1297,6 +1297,66 @@ fn gen_ai_projection_emits_only_span_specific_attributes() { assert!(!embed_attributes.contains_key("gen_ai.usage.output_tokens")); } +#[test] +fn gen_ai_projection_emits_normalized_response_attributes() { + let event = make_scope_event_with_profile( + ScopeCategory::End, + Uuid::now_v7(), + None, + "chat", + ScopeType::Llm, + Some(json!({"answer": "ok"})), + Some( + CategoryProfile::builder() + .annotated_response(std::sync::Arc::new(AnnotatedLlmResponse { + id: Some("response-1".to_string()), + model: Some("model-1".to_string()), + finish_reason: Some(FinishReason::ToolUse), + usage: Some(Usage { + prompt_tokens: Some(13), + completion_tokens: Some(8), + total_tokens: Some(21), + cache_read_tokens: Some(5), + cache_write_tokens: Some(3), + cost: None, + }), + ..empty_annotated_response() + })) + .build(), + ), + ); + + let attributes = attr_map(&crate::observability::otel_genai::end_attributes(&event)); + assert_eq!( + attributes.get("gen_ai.response.id"), + Some(&"response-1".to_string()) + ); + assert_eq!( + attributes.get("gen_ai.response.model"), + Some(&"model-1".to_string()) + ); + assert_eq!( + attributes.get("gen_ai.response.finish_reasons"), + Some(&"[\"tool_calls\"]".to_string()) + ); + assert_eq!( + attributes.get("gen_ai.usage.input_tokens"), + Some(&"13".to_string()) + ); + assert_eq!( + attributes.get("gen_ai.usage.output_tokens"), + Some(&"8".to_string()) + ); + assert_eq!( + attributes.get("gen_ai.usage.cache_read.input_tokens"), + Some(&"5".to_string()) + ); + assert_eq!( + attributes.get("gen_ai.usage.cache_creation.input_tokens"), + Some(&"3".to_string()) + ); +} + #[test] fn gen_ai_projection_prefers_standard_names_and_normalized_provider_details() { let agent = make_start_event( From 7a3b3d13d2cc3985ce7c811399d43e5c5e38db9e Mon Sep 17 00:00:00 2001 From: Will Killian Date: Mon, 27 Jul 2026 13:20:06 -0400 Subject: [PATCH 4/4] fix(observability): address exporter review feedback Signed-off-by: Will Killian --- crates/cli/src/diagnostics/mod.rs | 67 +++++++------ crates/core/src/observability/otel.rs | 12 ++- crates/core/src/observability/otel_genai.rs | 39 ++++++-- .../src/observability/plugin_component.rs | 13 ++- crates/core/src/plugin.rs | 17 ++-- .../tests/integration/middleware_tests.rs | 4 + .../unit/observability/openinference_tests.rs | 2 +- .../tests/unit/observability/otel_tests.rs | 13 ++- crates/core/tests/unit/plugin_tests.rs | 6 +- crates/ffi/tests/unit/api/registry_tests.rs | 99 +++++++++++-------- crates/node/observability.d.ts | 2 +- crates/node/src/api/mod.rs | 7 +- crates/python/src/py_types/observability.rs | 2 +- docs/about-nemo-relay/release-notes/index.mdx | 5 +- .../observability/opentelemetry.mdx | 2 + go/nemo_relay/coverage_gap_test.go | 4 +- python/nemo_relay/_native.pyi | 2 +- 17 files changed, 188 insertions(+), 108 deletions(-) diff --git a/crates/cli/src/diagnostics/mod.rs b/crates/cli/src/diagnostics/mod.rs index 18b45161f..17b8b4d05 100644 --- a/crates/cli/src/diagnostics/mod.rs +++ b/crates/cli/src/diagnostics/mod.rs @@ -22,7 +22,7 @@ use render::*; use std::path::{Path, PathBuf}; use std::time::Duration; -use futures_util::SinkExt; +use futures_util::{SinkExt, future::join_all}; use nemo_relay::api::event::{BaseEvent, Event, MarkEvent}; use nemo_relay::codec::model_pricing::{PricingCatalog, PricingConfig, PricingSourceConfig}; use nemo_relay::observability::plugin_component::OBSERVABILITY_PLUGIN_KIND; @@ -649,35 +649,42 @@ async fn observability_http_exporter_checks(config: &Value) -> Vec { else { return Vec::new(); }; - let mut checks = Vec::with_capacity(endpoints.len()); - for (index, endpoint) in endpoints.iter().enumerate() { - let endpoint_type = endpoint - .get("type") - .and_then(Value::as_str) - .unwrap_or("unknown"); - let label = "OpenTelemetry endpoint"; - let transport = endpoint - .get("transport") - .and_then(Value::as_str) - .unwrap_or("http_binary"); - checks.push(match endpoint.get("endpoint").and_then(Value::as_str) { - Some(url) => { - let mut check = if transport == "grpc" { - probe_tcp_named(label, url).await - } else { - probe_http_named(label, url).await - }; - check.details = format!("endpoints[{index}] ({endpoint_type}): {}", check.details); - check - } - None => Check { - name: label, - status: Status::Fail, - details: format!("endpoints[{index}] ({endpoint_type}): endpoint is required"), - }, - }); - } - checks + join_all( + endpoints + .iter() + .enumerate() + .map(|(index, endpoint)| async move { + let endpoint_type = endpoint + .get("type") + .and_then(Value::as_str) + .unwrap_or("unknown"); + let label = "OpenTelemetry endpoint"; + let transport = endpoint + .get("transport") + .and_then(Value::as_str) + .unwrap_or("http_binary"); + match endpoint.get("endpoint").and_then(Value::as_str) { + Some(url) => { + let mut check = if transport == "grpc" { + probe_tcp_named(label, url).await + } else { + probe_http_named(label, url).await + }; + check.details = + format!("endpoints[{index}] ({endpoint_type}): {}", check.details); + check + } + None => Check { + name: label, + status: Status::Fail, + details: format!( + "endpoints[{index}] ({endpoint_type}): endpoint is required" + ), + }, + } + }), + ) + .await } fn observability_component_config(plugin_value: &Value) -> Option<&Value> { diff --git a/crates/core/src/observability/otel.rs b/crates/core/src/observability/otel.rs index 3614a97a0..6e9fd4e76 100644 --- a/crates/core/src/observability/otel.rs +++ b/crates/core/src/observability/otel.rs @@ -49,7 +49,7 @@ use opentelemetry_sdk::trace::{ }; use uuid::Uuid; -const COMPLETED_SPAN_CONTEXT_LIMIT: usize = 4096; +pub(super) const COMPLETED_SPAN_CONTEXT_LIMIT: usize = 4096; use opentelemetry_otlp::WithTonicConfig; use tonic::metadata::{MetadataKey, MetadataMap, MetadataValue}; @@ -319,6 +319,9 @@ impl Default for OpenTelemetrySubscriberOptions { } struct Inner { + // Keep `processor` before `_runtime`: the processor owns the + // `SdkTracerProvider` and must be dropped before `ExporterRuntime` joins + // and tears down its Tokio runtime. Do not reorder these fields. processor: Arc>, subscriber: EventSubscriberFn, _runtime: Option, @@ -872,6 +875,7 @@ impl OtelEventProcessor { fn process_start(&mut self, event: &Event) { self.remove_completed_span_context(event.uuid()); + self.remove_suppressed_parent_context(event.uuid()); let parent_context = self.parent_context(event); if self.otel_type == OpenTelemetryType::GenAi && !super::otel_genai::supports(event) { let parent_span_context = parent_context.span().span_context().clone(); @@ -1085,6 +1089,12 @@ impl OtelEventProcessor { .retain(|completed_uuid| *completed_uuid != uuid); } + fn remove_suppressed_parent_context(&mut self, uuid: Uuid) { + self.suppressed_parent_contexts.remove(&uuid); + self.suppressed_parent_order + .retain(|suppressed_uuid| *suppressed_uuid != uuid); + } + fn record_completed_span_context(&mut self, uuid: Uuid, span_context: SpanContext) { if self .completed_span_contexts diff --git a/crates/core/src/observability/otel_genai.rs b/crates/core/src/observability/otel_genai.rs index fde935a1b..0d0d8156b 100644 --- a/crates/core/src/observability/otel_genai.rs +++ b/crates/core/src/observability/otel_genai.rs @@ -3,6 +3,8 @@ //! OpenTelemetry GenAI semantic-convention projection. +#![allow(deprecated)] // Generated GenAI constants are retained for the pinned v1.42-era schema. + use crate::api::event::{Event, EventNormalizationExt}; use crate::api::scope::ScopeType; use crate::codec::request::ApiSpecificRequest; @@ -67,7 +69,7 @@ pub(super) fn span_kind(event: &Event) -> SpanKind { pub(super) fn start_attributes(event: &Event) -> Vec { let mut attributes = Vec::new(); attributes.push(KeyValue::new( - "gen_ai.operation.name", + semconv::GEN_AI_OPERATION_NAME, operation_name(event), )); @@ -113,9 +115,13 @@ fn push_embedding_response_attributes(attributes: &mut Vec, event: &Ev } if let Some(value) = scalar_i64( event, - &["gen_ai.usage.input_tokens", "input_tokens", "prompt_tokens"], + &[ + semconv::GEN_AI_USAGE_INPUT_TOKENS, + "input_tokens", + "prompt_tokens", + ], ) { - attributes.push(KeyValue::new("gen_ai.usage.input_tokens", value)); + attributes.push(KeyValue::new(semconv::GEN_AI_USAGE_INPUT_TOKENS, value)); } } @@ -177,7 +183,7 @@ fn push_agent_attributes(attributes: &mut Vec, event: &Event) { fn push_model_attribute(attributes: &mut Vec, event: &Event) { if let Some(model) = request_model(event) { - attributes.push(KeyValue::new("gen_ai.request.model", model)); + attributes.push(KeyValue::new(semconv::GEN_AI_REQUEST_MODEL, model)); } } @@ -192,7 +198,7 @@ fn push_llm_request_attributes(attributes: &mut Vec, event: &Event) { .clone() .or_else(|| event.model_name().map(ToOwned::to_owned)) { - attributes.push(KeyValue::new("gen_ai.request.model", model)); + attributes.push(KeyValue::new(semconv::GEN_AI_REQUEST_MODEL, model)); } if let Some(params) = request.params.as_ref() { if let Some(value) = params.temperature { @@ -274,8 +280,16 @@ fn push_llm_response_attributes(attributes: &mut Vec, event: &Event) { )); } if let Some(usage) = response.usage.as_ref() { - if let Some(value) = usage.prompt_tokens.and_then(to_i64) { - attributes.push(KeyValue::new("gen_ai.usage.input_tokens", value)); + let input_tokens = usage + .prompt_tokens + .unwrap_or_default() + .saturating_add(usage.cache_read_tokens.unwrap_or_default()) + .saturating_add(usage.cache_write_tokens.unwrap_or_default()); + if input_tokens > 0 { + attributes.push(KeyValue::new( + semconv::GEN_AI_USAGE_INPUT_TOKENS, + input_tokens as i64, + )); } if let Some(value) = usage.completion_tokens.and_then(to_i64) { attributes.push(KeyValue::new("gen_ai.usage.output_tokens", value)); @@ -293,7 +307,7 @@ fn push_llm_response_attributes(attributes: &mut Vec, event: &Event) { } fn push_tool_attributes(attributes: &mut Vec, event: &Event) { - attributes.push(KeyValue::new("gen_ai.tool.name", tool_name(event))); + attributes.push(KeyValue::new(semconv::GEN_AI_TOOL_NAME, tool_name(event))); if let Some(value) = scalar_string(event, &["gen_ai.tool.type", "tool_type"]) { attributes.push(KeyValue::new("gen_ai.tool.type", value)); } @@ -337,7 +351,12 @@ fn request_model(event: &Event) -> Option { .normalized_llm_request() .and_then(|request| request.as_ref().model.clone()) .or_else(|| event.model_name().map(ToOwned::to_owned)) - .or_else(|| scalar_string(event, &["gen_ai.request.model", "model", "model_name"])) + .or_else(|| { + scalar_string( + event, + &[semconv::GEN_AI_REQUEST_MODEL, "model", "model_name"], + ) + }) } fn provider_name(event: &Event) -> Option { @@ -386,7 +405,7 @@ fn agent_name(event: &Event) -> String { } fn tool_name(event: &Event) -> String { - scalar_string(event, &["gen_ai.tool.name"]).unwrap_or_else(|| event.name().to_string()) + scalar_string(event, &[semconv::GEN_AI_TOOL_NAME]).unwrap_or_else(|| event.name().to_string()) } fn data_source_id(event: &Event) -> Option { diff --git a/crates/core/src/observability/plugin_component.rs b/crates/core/src/observability/plugin_component.rs index cb32e1295..0e58ccf57 100644 --- a/crates/core/src/observability/plugin_component.rs +++ b/crates/core/src/observability/plugin_component.rs @@ -963,6 +963,9 @@ fn register_opentelemetry( .iter() .map(|subscriber| subscriber.subscriber()) .collect::>(); + // Retain the subscribers as long as the registered fan-out callback exists. + // Their tracer providers and exporter runtimes must outlive event delivery. + let delivery_subscribers = subscribers.clone(); ctx.add_registration(PluginRegistration::new( "observability", ctx.qualify_name("opentelemetry.shutdown"), @@ -970,7 +973,10 @@ fn register_opentelemetry( )); ctx.register_subscriber( "opentelemetry", - Arc::new(move |event| deliver_opentelemetry_event(&callbacks, event)), + Arc::new(move |event| { + let _keep_exporters_alive = &delivery_subscribers; + deliver_opentelemetry_event(&callbacks, event); + }), )?; Ok(()) } @@ -2024,7 +2030,10 @@ fn validate_opentelemetry_endpoint_fields( let Some(endpoints) = opentelemetry.get("endpoints").and_then(Json::as_array) else { return; }; - for (index, endpoint) in endpoints.iter().filter_map(Json::as_object).enumerate() { + for (index, endpoint) in endpoints.iter().enumerate() { + let Some(endpoint) = endpoint.as_object() else { + continue; + }; for field in endpoint .keys() .filter(|field| !ALLOWED.contains(&field.as_str())) diff --git a/crates/core/src/plugin.rs b/crates/core/src/plugin.rs index 6d60e8864..05f1f3596 100644 --- a/crates/core/src/plugin.rs +++ b/crates/core/src/plugin.rs @@ -1294,15 +1294,14 @@ fn merge_plugin_config_value( } fn plugin_config_list_concatenates(path: &[String], is_observability: bool) -> bool { - path.len() == 1 - || (is_observability - && matches!( - path, - [section, field] - if (section == "atof" && field == "sinks") - || (section == "opentelemetry" && field == "endpoints") - || (section == "atif" && field == "storage") - )) + is_observability + && matches!( + path, + [section, field] + if (section == "atof" && field == "sinks") + || (section == "opentelemetry" && field == "endpoints") + || (section == "atif" && field == "storage") + ) } /// Recursively merges `right` into a `left` JSON object; arrays and scalars are replaced. diff --git a/crates/core/tests/integration/middleware_tests.rs b/crates/core/tests/integration/middleware_tests.rs index 18d9b7c34..c5062b469 100644 --- a/crates/core/tests/integration/middleware_tests.rs +++ b/crates/core/tests/integration/middleware_tests.rs @@ -979,6 +979,10 @@ async fn test_managed_tool_pending_marks_project_through_trace_exporters_only() attribute.key.as_str() == "nemo_relay.mark.orphan" && attribute.value == opentelemetry::Value::Bool(true) })); + assert!(openinference_mark.attributes.iter().any(|attribute| { + attribute.key.as_str() == "openinference.span.kind" + && attribute.value.to_string() == "CHAIN" + })); for (key, value) in [ ("nemo_relay.mark.category", "custom"), ( diff --git a/crates/core/tests/unit/observability/openinference_tests.rs b/crates/core/tests/unit/observability/openinference_tests.rs index fd48bfc02..652311287 100644 --- a/crates/core/tests/unit/observability/openinference_tests.rs +++ b/crates/core/tests/unit/observability/openinference_tests.rs @@ -3211,7 +3211,7 @@ fn completed_span_context_cache_evicts_oldest_parent_contexts() { provider.clone(), "test-scope".to_string(), ); - let span_count = 4096 + 2; + let span_count = crate::observability::otel::COMPLETED_SPAN_CONTEXT_LIMIT + 2; let mut completed_uuids = Vec::with_capacity(span_count); for index in 0..span_count { diff --git a/crates/core/tests/unit/observability/otel_tests.rs b/crates/core/tests/unit/observability/otel_tests.rs index 74ea78ab6..e786b4f37 100644 --- a/crates/core/tests/unit/observability/otel_tests.rs +++ b/crates/core/tests/unit/observability/otel_tests.rs @@ -655,7 +655,7 @@ fn direct_config_rejects_process_global_otel_headers() { "OTEL_EXPORTER_OTLP_HEADERS", "OTEL_EXPORTER_OTLP_TRACES_HEADERS", ] { - let status = std::process::Command::new(std::env::current_exe().unwrap()) + let output = std::process::Command::new(std::env::current_exe().unwrap()) .arg("--exact") .arg("observability::otel::tests::direct_config_rejects_process_global_otel_headers") .env(CHILD_MARKER, variable) @@ -665,9 +665,14 @@ fn direct_config_rejects_process_global_otel_headers() { } else { "OTEL_EXPORTER_OTLP_HEADERS" }) - .status() + .output() .unwrap(); - assert!(status.success()); + assert!(output.status.success()); + let stdout = String::from_utf8_lossy(&output.stdout); + assert!( + stdout.contains("test result: ok. 1 passed"), + "child test filter did not execute exactly one test: {stdout}" + ); } } @@ -1341,7 +1346,7 @@ fn gen_ai_projection_emits_normalized_response_attributes() { ); assert_eq!( attributes.get("gen_ai.usage.input_tokens"), - Some(&"13".to_string()) + Some(&"21".to_string()) ); assert_eq!( attributes.get("gen_ai.usage.output_tokens"), diff --git a/crates/core/tests/unit/plugin_tests.rs b/crates/core/tests/unit/plugin_tests.rs index a0c7503cf..b447766b8 100644 --- a/crates/core/tests/unit/plugin_tests.rs +++ b/crates/core/tests/unit/plugin_tests.rs @@ -494,7 +494,7 @@ fn reset_global() { #[test] fn test_layer_config_overlay_wins() { // The overlay is the higher-precedence layer: it overrides shared component fields, deep-merges - // nested config objects, concatenates config lists, appends overlay-only kinds, preserves + // nested config objects, replaces ordinary config lists, appends overlay-only kinds, preserves // base-only kinds, replaces top-level scalars, and recursively merges top-level objects // (policy). let base = json!({ @@ -553,8 +553,8 @@ fn test_layer_config_overlay_wins() { ); assert_eq!( alpha["config"]["list"], - json!([9, 1, 2, 3]), - "config lists concatenate with higher-precedence entries first" + json!([9]), + "ordinary config lists are replaced by higher-precedence entries" ); // Base-only component is preserved. diff --git a/crates/ffi/tests/unit/api/registry_tests.rs b/crates/ffi/tests/unit/api/registry_tests.rs index 2bd41fc7f..185cadd79 100644 --- a/crates/ffi/tests/unit/api/registry_tests.rs +++ b/crates/ffi/tests/unit/api/registry_tests.rs @@ -9,54 +9,73 @@ use std::io::{Read, Write}; use std::net::TcpListener; use std::sync::mpsc::{self, Receiver}; use std::thread::{self, JoinHandle}; -use std::time::Duration; +use std::time::{Duration, Instant}; fn start_otlp_http_collector() -> (String, Receiver>, JoinHandle<()>) { let listener = TcpListener::bind("127.0.0.1:0").unwrap(); let address = listener.local_addr().unwrap(); + listener.set_nonblocking(true).unwrap(); let (sender, receiver) = mpsc::channel(); let handle = thread::spawn(move || { - let (mut stream, _) = listener.accept().unwrap(); - stream - .set_read_timeout(Some(Duration::from_secs(5))) - .unwrap(); - - let mut request = Vec::new(); - let mut buffer = [0_u8; 4096]; - let (header_end, content_length) = loop { - let read = stream.read(&mut buffer).unwrap(); - assert!( - read > 0, - "collector connection closed before request headers" - ); - request.extend_from_slice(&buffer[..read]); - if let Some(header_end) = request.windows(4).position(|value| value == b"\r\n\r\n") { - let header_end = header_end + 4; - let headers = String::from_utf8_lossy(&request[..header_end]); - let content_length = headers - .lines() - .find_map(|line| { - line.split_once(':').and_then(|(name, value)| { - name.eq_ignore_ascii_case("content-length") - .then(|| value.trim().parse::().unwrap()) - }) - }) - .expect("OTLP request must include content-length"); - break (header_end, content_length); + let deadline = Instant::now() + Duration::from_secs(5); + let mut last_request = None; + while Instant::now() < deadline { + match listener.accept() { + Ok((mut stream, _)) => { + stream + .set_read_timeout(Some(Duration::from_secs(1))) + .unwrap(); + let mut request = Vec::new(); + let mut buffer = [0_u8; 4096]; + let (header_end, content_length) = loop { + let read = stream.read(&mut buffer).unwrap(); + assert!( + read > 0, + "collector connection closed before request headers" + ); + request.extend_from_slice(&buffer[..read]); + if let Some(header_end) = + request.windows(4).position(|value| value == b"\r\n\r\n") + { + let header_end = header_end + 4; + let headers = String::from_utf8_lossy(&request[..header_end]); + let content_length = headers + .lines() + .find_map(|line| { + line.split_once(':').and_then(|(name, value)| { + name.eq_ignore_ascii_case("content-length") + .then(|| value.trim().parse::().unwrap()) + }) + }) + .expect("OTLP request must include content-length"); + break (header_end, content_length); + } + }; + while request.len() < header_end + content_length { + let read = stream.read(&mut buffer).unwrap(); + assert!(read > 0, "collector connection closed before request body"); + request.extend_from_slice(&buffer[..read]); + } + sender + .send(request[header_end..header_end + content_length].to_vec()) + .unwrap(); + stream + .write_all( + b"HTTP/1.1 200 OK\r\ncontent-length: 0\r\nconnection: close\r\n\r\n", + ) + .unwrap(); + last_request = Some(Instant::now()); + } + Err(error) if error.kind() == std::io::ErrorKind::WouldBlock => { + if last_request.is_some_and(|last| last.elapsed() >= Duration::from_millis(250)) + { + break; + } + thread::sleep(Duration::from_millis(10)); + } + Err(error) => panic!("collector accept failed: {error}"), } - }; - while request.len() < header_end + content_length { - let read = stream.read(&mut buffer).unwrap(); - assert!(read > 0, "collector connection closed before request body"); - request.extend_from_slice(&buffer[..read]); } - - sender - .send(request[header_end..header_end + content_length].to_vec()) - .unwrap(); - stream - .write_all(b"HTTP/1.1 200 OK\r\ncontent-length: 0\r\nconnection: close\r\n\r\n") - .unwrap(); }); (format!("http://{address}/v1/traces"), receiver, handle) } diff --git a/crates/node/observability.d.ts b/crates/node/observability.d.ts index fc93c50a7..bacea2c0b 100644 --- a/crates/node/observability.d.ts +++ b/crates/node/observability.d.ts @@ -69,7 +69,7 @@ export interface AtifConfig { export interface OpenTelemetryEndpointConfig { type: 'full' | 'gen_ai' | 'openinference'; endpoint: string; - transport?: 'http_binary' | 'grpc' | string; + transport?: 'http_binary' | 'grpc'; headers?: Record; header_env?: Record; resource_attributes?: Record; diff --git a/crates/node/src/api/mod.rs b/crates/node/src/api/mod.rs index 38540ce31..9d3251413 100644 --- a/crates/node/src/api/mod.rs +++ b/crates/node/src/api/mod.rs @@ -172,7 +172,12 @@ fn build_otel_config( options: OpenTelemetryConfig, ) -> napi::Result { let otel_type = parse_otel_type(&options.r#type)?; - let endpoint = options.endpoint; + let endpoint = options.endpoint.trim().to_string(); + if endpoint.is_empty() { + return Err(napi::Error::from_reason( + "endpoint must be a nonblank string", + )); + } let transport = parse_otel_transport(options.transport)?; let service_name = options .service_name diff --git a/crates/python/src/py_types/observability.rs b/crates/python/src/py_types/observability.rs index 2a24673a5..fa68858ee 100644 --- a/crates/python/src/py_types/observability.rs +++ b/crates/python/src/py_types/observability.rs @@ -415,7 +415,7 @@ impl PyAtofExporter { /// ``` #[pyclass(name = "OpenTelemetryConfig")] pub struct PyOpenTelemetryConfig { - #[pyo3(get, set)] + #[pyo3(get, set, name = "type")] pub(crate) otel_type: String, #[pyo3(get, set)] pub(crate) transport: String, diff --git a/docs/about-nemo-relay/release-notes/index.mdx b/docs/about-nemo-relay/release-notes/index.mdx index f0e65cc22..33046f2fa 100644 --- a/docs/about-nemo-relay/release-notes/index.mdx +++ b/docs/about-nemo-relay/release-notes/index.mdx @@ -85,8 +85,9 @@ configurable mark and attribute-alias controls. Refer to for before-and-after configuration and binding API changes. Each `opentelemetry.endpoints` entry can resolve sensitive header values from -environment variables through `header_env`. NeMo Relay validates the variable -and snapshots its value when the plugin activates. +environment variables through `header_env`. Plugin activation rejects missing +variables, blank values, and duplicate header names, then snapshots each valid +value for the endpoint. Process-global `OTEL_EXPORTER_OTLP_HEADERS` and `OTEL_EXPORTER_OTLP_TRACES_HEADERS` now fail construction or activation because their values cannot be isolated between endpoints. diff --git a/docs/configure-plugins/observability/opentelemetry.mdx b/docs/configure-plugins/observability/opentelemetry.mdx index 8daeea9fb..c1403ef26 100644 --- a/docs/configure-plugins/observability/opentelemetry.mdx +++ b/docs/configure-plugins/observability/opentelemetry.mdx @@ -32,6 +32,8 @@ receive the same event stream use the same identifiers and parentage. ## `plugins.toml` Example +The following configuration exports the `gen_ai` projection through OTLP/HTTP. + ```toml version = 1 diff --git a/go/nemo_relay/coverage_gap_test.go b/go/nemo_relay/coverage_gap_test.go index 66767e4b7..6eefcc748 100644 --- a/go/nemo_relay/coverage_gap_test.go +++ b/go/nemo_relay/coverage_gap_test.go @@ -153,8 +153,8 @@ func assertClosedExporterFails(t *testing.T) { func assertZeroSubscriberConfigs(t *testing.T) { t.Helper() - if _, err := NewOpenTelemetrySubscriber(OpenTelemetryConfig{}); err == nil { - t.Fatal("expected a required endpoint error") + if _, err := NewOpenTelemetrySubscriber(OpenTelemetryConfig{Type: "full"}); err == nil || err.Error() != "endpoint is required" { + t.Fatalf("expected endpoint is required error, got %v", err) } } diff --git a/python/nemo_relay/_native.pyi b/python/nemo_relay/_native.pyi index f14c0f9ce..7ea20071f 100644 --- a/python/nemo_relay/_native.pyi +++ b/python/nemo_relay/_native.pyi @@ -1013,7 +1013,7 @@ class OpenTelemetryConfig: """ transport: str - otel_type: Literal["full", "gen_ai", "openinference"] + type: Literal["full", "gen_ai", "openinference"] endpoint: str service_name: str service_namespace: Optional[str]