diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml new file mode 100644 index 00000000..f9996403 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -0,0 +1,56 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/issue-templates/forms/platform-dependent/bug-report.yml +# See: https://docs.github.com/communities/using-templates-to-encourage-useful-issues-and-pull-requests/syntax-for-issue-forms + +name: Bug report +description: Report a problem with the code or documentation in this repository. +labels: + - "type: imperfection" +body: + - type: textarea + id: description + attributes: + label: Describe the problem + validations: + required: true + - type: textarea + id: reproduce + attributes: + label: To reproduce + description: Provide the specific set of steps we can follow to reproduce the problem. + validations: + required: true + - type: textarea + id: expected + attributes: + label: Expected behavior + description: What would you expect to happen after following those instructions? + validations: + required: true + - type: input + id: project-version + attributes: + label: Arduino App CLI version + description: | + Which version of Arduino App CLI are you using? (output of `arduino-app-cli version` executed inside the board) + _This should be the most recent version available._ + validations: + required: true + - type: textarea + id: additional + attributes: + label: Additional context + description: Add any additional information here. + validations: + required: false + - type: checkboxes + id: checklist + attributes: + label: Issue checklist + description: Please double-check that you have done each of the following things before submitting the issue. + options: + - label: I searched for previous reports in [the issue tracker](https://github.com/arduino/arduino-app-cli/issues?q=) + required: true + - label: I verified the problem still occurs when using the latest version + required: true + - label: My report contains all necessary details + required: true diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml new file mode 100644 index 00000000..54810758 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -0,0 +1,51 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/issue-templates/forms/platform-dependent/bug-report.yml +# See: https://docs.github.com/communities/using-templates-to-encourage-useful-issues-and-pull-requests/syntax-for-issue-forms + +name: Feature request +description: Suggest an enhancement to this project. +labels: + - "type: enhancement" +body: + - type: textarea + id: description + attributes: + label: Describe the request + validations: + required: true + - type: textarea + id: current + attributes: + label: Describe the current behavior + description: | + What is the current behavior of Arduino App CLI in relation to your request? + How can we reproduce that behavior? + validations: + required: true + - type: input + id: project-version + attributes: + label: Arduino App CLI version + description: | + Which version of Arduino App CLI are you using? (output of `arduino-app-cli version` executed inside the board) + _This should be the most recent version available._ + validations: + required: true + - type: textarea + id: additional + attributes: + label: Additional context + description: Add any additional information here. + validations: + required: false + - type: checkboxes + id: checklist + attributes: + label: Issue checklist + description: Please double-check that you have done each of the following things before submitting the issue. + options: + - label: I searched for previous requests in [the issue tracker](https://github.com/arduino/arduino-app-cli/issues?q=) + required: true + - label: I verified the feature was still missing when using the latest version + required: true + - label: My request contains all necessary details + required: true diff --git a/.github/workflows/test-update.yml b/.github/workflows/test-update.yml new file mode 100644 index 00000000..9b5dc6bf --- /dev/null +++ b/.github/workflows/test-update.yml @@ -0,0 +1,29 @@ +name: test the system update flow + +on: + push: + branches: + - main + workflow_dispatch: + +permissions: + contents: read + +jobs: + build-and-update: + runs-on: ubuntu-22.04 + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version-file: go.mod + + - name: Run dep package update test + env: + GH_TOKEN: ${{ secrets.ARDUINOBOT_TOKEN }} + run: | + go tool task test:update diff --git a/.licenses/arduino-app-cli/NOTICE b/.licenses/arduino-app-cli/NOTICE index ff6448cf..27d1a289 100644 --- a/.licenses/arduino-app-cli/NOTICE +++ b/.licenses/arduino-app-cli/NOTICE @@ -97857,7 +97857,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5@v5.16.2 +github.com/go-git/go-git/v5@v5.16.3 Apache License Version 2.0, January 2004 @@ -98066,7 +98066,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/config@v5.16.2 +github.com/go-git/go-git/v5/config@v5.16.3 Apache License Version 2.0, January 2004 @@ -98275,7 +98275,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/internal/path_util@v5.16.2 +github.com/go-git/go-git/v5/internal/path_util@v5.16.3 Apache License Version 2.0, January 2004 @@ -98484,7 +98484,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/internal/revision@v5.16.2 +github.com/go-git/go-git/v5/internal/revision@v5.16.3 Apache License Version 2.0, January 2004 @@ -98693,7 +98693,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/internal/url@v5.16.2 +github.com/go-git/go-git/v5/internal/url@v5.16.3 Apache License Version 2.0, January 2004 @@ -98902,7 +98902,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/plumbing@v5.16.2 +github.com/go-git/go-git/v5/plumbing@v5.16.3 Apache License Version 2.0, January 2004 @@ -99111,7 +99111,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/plumbing/cache@v5.16.2 +github.com/go-git/go-git/v5/plumbing/cache@v5.16.3 Apache License Version 2.0, January 2004 @@ -99320,7 +99320,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/plumbing/color@v5.16.2 +github.com/go-git/go-git/v5/plumbing/color@v5.16.3 Apache License Version 2.0, January 2004 @@ -99529,7 +99529,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/plumbing/filemode@v5.16.2 +github.com/go-git/go-git/v5/plumbing/filemode@v5.16.3 Apache License Version 2.0, January 2004 @@ -99738,7 +99738,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/plumbing/format/config@v5.16.2 +github.com/go-git/go-git/v5/plumbing/format/config@v5.16.3 Apache License Version 2.0, January 2004 @@ -99947,7 +99947,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/plumbing/format/diff@v5.16.2 +github.com/go-git/go-git/v5/plumbing/format/diff@v5.16.3 Apache License Version 2.0, January 2004 @@ -100156,7 +100156,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/plumbing/format/gitignore@v5.16.2 +github.com/go-git/go-git/v5/plumbing/format/gitignore@v5.16.3 Apache License Version 2.0, January 2004 @@ -100365,7 +100365,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/plumbing/format/idxfile@v5.16.2 +github.com/go-git/go-git/v5/plumbing/format/idxfile@v5.16.3 Apache License Version 2.0, January 2004 @@ -100574,7 +100574,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/plumbing/format/index@v5.16.2 +github.com/go-git/go-git/v5/plumbing/format/index@v5.16.3 Apache License Version 2.0, January 2004 @@ -100783,7 +100783,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/plumbing/format/objfile@v5.16.2 +github.com/go-git/go-git/v5/plumbing/format/objfile@v5.16.3 Apache License Version 2.0, January 2004 @@ -100992,7 +100992,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/plumbing/format/packfile@v5.16.2 +github.com/go-git/go-git/v5/plumbing/format/packfile@v5.16.3 Apache License Version 2.0, January 2004 @@ -101201,7 +101201,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/plumbing/format/pktline@v5.16.2 +github.com/go-git/go-git/v5/plumbing/format/pktline@v5.16.3 Apache License Version 2.0, January 2004 @@ -101410,7 +101410,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/plumbing/hash@v5.16.2 +github.com/go-git/go-git/v5/plumbing/hash@v5.16.3 Apache License Version 2.0, January 2004 @@ -101619,7 +101619,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/plumbing/object@v5.16.2 +github.com/go-git/go-git/v5/plumbing/object@v5.16.3 Apache License Version 2.0, January 2004 @@ -101828,7 +101828,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/plumbing/protocol/packp@v5.16.2 +github.com/go-git/go-git/v5/plumbing/protocol/packp@v5.16.3 Apache License Version 2.0, January 2004 @@ -102037,7 +102037,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/plumbing/protocol/packp/capability@v5.16.2 +github.com/go-git/go-git/v5/plumbing/protocol/packp/capability@v5.16.3 Apache License Version 2.0, January 2004 @@ -102246,7 +102246,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband@v5.16.2 +github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband@v5.16.3 Apache License Version 2.0, January 2004 @@ -102455,7 +102455,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/plumbing/revlist@v5.16.2 +github.com/go-git/go-git/v5/plumbing/revlist@v5.16.3 Apache License Version 2.0, January 2004 @@ -102664,7 +102664,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/plumbing/storer@v5.16.2 +github.com/go-git/go-git/v5/plumbing/storer@v5.16.3 Apache License Version 2.0, January 2004 @@ -102873,7 +102873,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/plumbing/transport@v5.16.2 +github.com/go-git/go-git/v5/plumbing/transport@v5.16.3 Apache License Version 2.0, January 2004 @@ -103082,7 +103082,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/plumbing/transport/client@v5.16.2 +github.com/go-git/go-git/v5/plumbing/transport/client@v5.16.3 Apache License Version 2.0, January 2004 @@ -103291,7 +103291,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/plumbing/transport/file@v5.16.2 +github.com/go-git/go-git/v5/plumbing/transport/file@v5.16.3 Apache License Version 2.0, January 2004 @@ -103500,7 +103500,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/plumbing/transport/git@v5.16.2 +github.com/go-git/go-git/v5/plumbing/transport/git@v5.16.3 Apache License Version 2.0, January 2004 @@ -103709,7 +103709,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/plumbing/transport/http@v5.16.2 +github.com/go-git/go-git/v5/plumbing/transport/http@v5.16.3 Apache License Version 2.0, January 2004 @@ -103918,7 +103918,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/plumbing/transport/internal/common@v5.16.2 +github.com/go-git/go-git/v5/plumbing/transport/internal/common@v5.16.3 Apache License Version 2.0, January 2004 @@ -104127,7 +104127,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/plumbing/transport/server@v5.16.2 +github.com/go-git/go-git/v5/plumbing/transport/server@v5.16.3 Apache License Version 2.0, January 2004 @@ -104336,7 +104336,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/plumbing/transport/ssh@v5.16.2 +github.com/go-git/go-git/v5/plumbing/transport/ssh@v5.16.3 Apache License Version 2.0, January 2004 @@ -104545,7 +104545,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/storage@v5.16.2 +github.com/go-git/go-git/v5/storage@v5.16.3 Apache License Version 2.0, January 2004 @@ -104754,7 +104754,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/storage/filesystem@v5.16.2 +github.com/go-git/go-git/v5/storage/filesystem@v5.16.3 Apache License Version 2.0, January 2004 @@ -104963,7 +104963,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/storage/filesystem/dotgit@v5.16.2 +github.com/go-git/go-git/v5/storage/filesystem/dotgit@v5.16.3 Apache License Version 2.0, January 2004 @@ -105172,7 +105172,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/storage/memory@v5.16.2 +github.com/go-git/go-git/v5/storage/memory@v5.16.3 Apache License Version 2.0, January 2004 @@ -105381,7 +105381,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/utils/binary@v5.16.2 +github.com/go-git/go-git/v5/utils/binary@v5.16.3 Apache License Version 2.0, January 2004 @@ -105590,7 +105590,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/utils/diff@v5.16.2 +github.com/go-git/go-git/v5/utils/diff@v5.16.3 Apache License Version 2.0, January 2004 @@ -105799,7 +105799,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/utils/ioutil@v5.16.2 +github.com/go-git/go-git/v5/utils/ioutil@v5.16.3 Apache License Version 2.0, January 2004 @@ -106008,7 +106008,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/utils/merkletrie@v5.16.2 +github.com/go-git/go-git/v5/utils/merkletrie@v5.16.3 Apache License Version 2.0, January 2004 @@ -106217,7 +106217,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/utils/merkletrie/filesystem@v5.16.2 +github.com/go-git/go-git/v5/utils/merkletrie/filesystem@v5.16.3 Apache License Version 2.0, January 2004 @@ -106426,7 +106426,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/utils/merkletrie/index@v5.16.2 +github.com/go-git/go-git/v5/utils/merkletrie/index@v5.16.3 Apache License Version 2.0, January 2004 @@ -106635,7 +106635,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/utils/merkletrie/internal/frame@v5.16.2 +github.com/go-git/go-git/v5/utils/merkletrie/internal/frame@v5.16.3 Apache License Version 2.0, January 2004 @@ -106844,7 +106844,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/utils/merkletrie/noder@v5.16.2 +github.com/go-git/go-git/v5/utils/merkletrie/noder@v5.16.3 Apache License Version 2.0, January 2004 @@ -107053,7 +107053,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/utils/sync@v5.16.2 +github.com/go-git/go-git/v5/utils/sync@v5.16.3 Apache License Version 2.0, January 2004 @@ -107262,7 +107262,7 @@ Apache License Apache License Version 2.0, see [LICENSE](LICENSE) ***** -github.com/go-git/go-git/v5/utils/trace@v5.16.2 +github.com/go-git/go-git/v5/utils/trace@v5.16.3 Apache License Version 2.0, January 2004 @@ -140672,7 +140672,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ***** -github.com/sagikazarmark/locafero@v0.7.0 +github.com/sagikazarmark/locafero@v0.11.0 Copyright (c) 2023 Márk Sági-Kazár @@ -142261,7 +142261,7 @@ Copyright (c) 2013 skratchdot Licensed under the MIT license. ***** -github.com/sourcegraph/conc@v0.3.0 +github.com/sourcegraph/conc@v0.3.1-0.20240121214520-5f936abd7ae8 MIT License @@ -142286,7 +142286,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ***** -github.com/sourcegraph/conc/internal/multierror@v0.3.0 +github.com/sourcegraph/conc/panics@v0.3.1-0.20240121214520-5f936abd7ae8 MIT License @@ -142311,7 +142311,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ***** -github.com/sourcegraph/conc/iter@v0.3.0 +github.com/sourcegraph/conc/pool@v0.3.1-0.20240121214520-5f936abd7ae8 MIT License @@ -142336,32 +142336,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ***** -github.com/sourcegraph/conc/panics@v0.3.0 - -MIT License - -Copyright (c) 2023 Sourcegraph - -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. - -***** -github.com/spf13/afero@v1.12.0 +github.com/spf13/afero@v1.15.0 Apache License Version 2.0, January 2004 @@ -142538,13 +142513,8 @@ Apache License incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. ------ - -Afero is released under the Apache 2.0 license. See -[LICENSE.txt](https://github.com/spf13/afero/blob/master/LICENSE.txt) - ***** -github.com/spf13/afero/internal/common@v1.12.0 +github.com/spf13/afero/internal/common@v1.15.0 Apache License Version 2.0, January 2004 @@ -142721,13 +142691,8 @@ Apache License incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. ------ - -Afero is released under the Apache 2.0 license. See -[LICENSE.txt](https://github.com/spf13/afero/blob/master/LICENSE.txt) - ***** -github.com/spf13/afero/mem@v1.12.0 +github.com/spf13/afero/mem@v1.15.0 Apache License Version 2.0, January 2004 @@ -142904,13 +142869,37 @@ Apache License incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. +***** +github.com/spf13/cast@v1.10.0 + +The MIT License (MIT) + +Copyright (c) 2014 Steve Francia + +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. + ----- -Afero is released under the Apache 2.0 license. See -[LICENSE.txt](https://github.com/spf13/afero/blob/master/LICENSE.txt) +The project is licensed under the [MIT License](LICENSE). ***** -github.com/spf13/cast@v1.7.1 +github.com/spf13/cast/internal@v1.10.0 The MIT License (MIT) @@ -142934,6 +142923,10 @@ 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 project is licensed under the [MIT License](LICENSE). + ***** github.com/spf13/cobra@v1.10.1 @@ -143117,7 +143110,7 @@ Apache License Cobra is released under the Apache 2.0 license. See [LICENSE.txt](LICENSE.txt) ***** -github.com/spf13/pflag@v1.0.9 +github.com/spf13/pflag@v1.0.10 Copyright (c) 2012 Alex Ogier. All rights reserved. Copyright (c) 2012 The Go Authors. All rights reserved. @@ -143149,7 +143142,7 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ***** -github.com/spf13/viper@v1.20.1 +github.com/spf13/viper@v1.21.0 The MIT License (MIT) @@ -143178,7 +143171,7 @@ SOFTWARE. The project is licensed under the [MIT License](LICENSE). ***** -github.com/spf13/viper/internal/encoding/dotenv@v1.20.1 +github.com/spf13/viper/internal/encoding/dotenv@v1.21.0 The MIT License (MIT) @@ -143207,7 +143200,7 @@ SOFTWARE. The project is licensed under the [MIT License](LICENSE). ***** -github.com/spf13/viper/internal/encoding/json@v1.20.1 +github.com/spf13/viper/internal/encoding/json@v1.21.0 The MIT License (MIT) @@ -143236,7 +143229,7 @@ SOFTWARE. The project is licensed under the [MIT License](LICENSE). ***** -github.com/spf13/viper/internal/encoding/toml@v1.20.1 +github.com/spf13/viper/internal/encoding/toml@v1.21.0 The MIT License (MIT) @@ -143265,7 +143258,7 @@ SOFTWARE. The project is licensed under the [MIT License](LICENSE). ***** -github.com/spf13/viper/internal/encoding/yaml@v1.20.1 +github.com/spf13/viper/internal/encoding/yaml@v1.21.0 The MIT License (MIT) @@ -143294,7 +143287,7 @@ SOFTWARE. The project is licensed under the [MIT License](LICENSE). ***** -github.com/spf13/viper/internal/features@v1.20.1 +github.com/spf13/viper/internal/features@v1.21.0 The MIT License (MIT) @@ -164099,7 +164092,81 @@ Apache License limitations under the License. ***** -golang.org/x/crypto/argon2@v0.41.0 +go.yaml.in/yaml/v3@v3.0.4 + +This project is covered by two different licenses: MIT and Apache. + +#### MIT License #### + +The following files were ported to Go from C files of libyaml, and thus +are still covered by their original MIT license, with the additional +copyright staring in 2011 when the project was ported over: + + apic.go emitterc.go parserc.go readerc.go scannerc.go + writerc.go yamlh.go yamlprivateh.go + +Copyright (c) 2006-2010 Kirill Simonov +Copyright (c) 2006-2011 Kirill Simonov + +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. + +### Apache License ### + +All the remaining project files are covered by the Apache license: + +Copyright (c) 2011-2019 Canonical Ltd + +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 yaml package is licensed under the MIT and Apache License 2.0 licenses. +Please see the LICENSE file for details. + +----- + +Copyright 2011-2016 Canonical Ltd. + +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. + +***** +golang.org/x/crypto/argon2@v0.42.0 Copyright 2009 The Go Authors. @@ -164155,7 +164222,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/crypto/blake2b@v0.41.0 +golang.org/x/crypto/blake2b@v0.42.0 Copyright 2009 The Go Authors. @@ -164211,7 +164278,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/crypto/blowfish@v0.41.0 +golang.org/x/crypto/blowfish@v0.42.0 Copyright 2009 The Go Authors. @@ -164267,7 +164334,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/crypto/cast5@v0.41.0 +golang.org/x/crypto/cast5@v0.42.0 Copyright 2009 The Go Authors. @@ -164323,7 +164390,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/crypto/curve25519@v0.41.0 +golang.org/x/crypto/curve25519@v0.42.0 Copyright 2009 The Go Authors. @@ -164379,7 +164446,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/crypto/ed25519@v0.41.0 +golang.org/x/crypto/ed25519@v0.42.0 Copyright 2009 The Go Authors. @@ -164435,7 +164502,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/crypto/hkdf@v0.41.0 +golang.org/x/crypto/hkdf@v0.42.0 Copyright 2009 The Go Authors. @@ -164491,7 +164558,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/crypto/nacl/sign@v0.41.0 +golang.org/x/crypto/nacl/sign@v0.42.0 Copyright 2009 The Go Authors. @@ -164547,7 +164614,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/crypto/pbkdf2@v0.41.0 +golang.org/x/crypto/pbkdf2@v0.42.0 Copyright 2009 The Go Authors. @@ -164603,7 +164670,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/crypto/sha3@v0.41.0 +golang.org/x/crypto/sha3@v0.42.0 Copyright 2009 The Go Authors. @@ -164659,7 +164726,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/crypto/ssh@v0.41.0 +golang.org/x/crypto/ssh@v0.42.0 Copyright 2009 The Go Authors. @@ -164715,7 +164782,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/crypto/ssh/agent@v0.41.0 +golang.org/x/crypto/ssh/agent@v0.42.0 Copyright 2009 The Go Authors. @@ -164771,7 +164838,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/crypto/ssh/internal/bcrypt_pbkdf@v0.41.0 +golang.org/x/crypto/ssh/internal/bcrypt_pbkdf@v0.42.0 Copyright 2009 The Go Authors. @@ -164827,7 +164894,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/crypto/ssh/knownhosts@v0.41.0 +golang.org/x/crypto/ssh/knownhosts@v0.42.0 Copyright 2009 The Go Authors. @@ -164883,7 +164950,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/net/context@v0.43.0 +golang.org/x/net/context@v0.44.0 Copyright 2009 The Go Authors. @@ -164939,7 +165006,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/net/html@v0.43.0 +golang.org/x/net/html@v0.44.0 Copyright 2009 The Go Authors. @@ -164995,7 +165062,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/net/html/atom@v0.43.0 +golang.org/x/net/html/atom@v0.44.0 Copyright 2009 The Go Authors. @@ -165051,7 +165118,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/net/http2@v0.43.0 +golang.org/x/net/http2@v0.44.0 Copyright 2009 The Go Authors. @@ -165107,7 +165174,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/net/internal/httpcommon@v0.43.0 +golang.org/x/net/internal/httpcommon@v0.44.0 Copyright 2009 The Go Authors. @@ -165163,7 +165230,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/net/internal/socks@v0.43.0 +golang.org/x/net/internal/socks@v0.44.0 Copyright 2009 The Go Authors. @@ -165219,7 +165286,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/net/internal/timeseries@v0.43.0 +golang.org/x/net/internal/timeseries@v0.44.0 Copyright 2009 The Go Authors. @@ -165275,7 +165342,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/net/proxy@v0.43.0 +golang.org/x/net/proxy@v0.44.0 Copyright 2009 The Go Authors. @@ -165331,7 +165398,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/net/publicsuffix@v0.43.0 +golang.org/x/net/publicsuffix@v0.44.0 Copyright 2009 The Go Authors. @@ -165387,7 +165454,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/net/trace@v0.43.0 +golang.org/x/net/trace@v0.44.0 Copyright 2009 The Go Authors. @@ -165443,7 +165510,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/net/websocket@v0.43.0 +golang.org/x/net/websocket@v0.44.0 Copyright 2009 The Go Authors. @@ -165673,7 +165740,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/sys/execabs@v0.36.0 +golang.org/x/sys/execabs@v0.38.0 Copyright 2009 The Go Authors. @@ -165729,7 +165796,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/sys/unix@v0.36.0 +golang.org/x/sys/unix@v0.38.0 Copyright 2009 The Go Authors. @@ -165785,7 +165852,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/term@v0.35.0 +golang.org/x/term@v0.36.0 Copyright 2009 The Go Authors. @@ -165841,7 +165908,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/text/cases@v0.29.0 +golang.org/x/text/cases@v0.30.0 Copyright 2009 The Go Authors. @@ -165897,7 +165964,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/text/encoding@v0.29.0 +golang.org/x/text/encoding@v0.30.0 Copyright 2009 The Go Authors. @@ -165953,7 +166020,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/text/encoding/internal@v0.29.0 +golang.org/x/text/encoding/internal@v0.30.0 Copyright 2009 The Go Authors. @@ -166009,7 +166076,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/text/encoding/internal/identifier@v0.29.0 +golang.org/x/text/encoding/internal/identifier@v0.30.0 Copyright 2009 The Go Authors. @@ -166065,7 +166132,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/text/encoding/unicode@v0.29.0 +golang.org/x/text/encoding/unicode@v0.30.0 Copyright 2009 The Go Authors. @@ -166121,7 +166188,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/text/feature/plural@v0.29.0 +golang.org/x/text/feature/plural@v0.30.0 Copyright 2009 The Go Authors. @@ -166177,7 +166244,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/text/internal@v0.29.0 +golang.org/x/text/internal@v0.30.0 Copyright 2009 The Go Authors. @@ -166233,7 +166300,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/text/internal/catmsg@v0.29.0 +golang.org/x/text/internal/catmsg@v0.30.0 Copyright 2009 The Go Authors. @@ -166289,7 +166356,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/text/internal/format@v0.29.0 +golang.org/x/text/internal/format@v0.30.0 Copyright 2009 The Go Authors. @@ -166345,7 +166412,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/text/internal/language@v0.29.0 +golang.org/x/text/internal/language@v0.30.0 Copyright 2009 The Go Authors. @@ -166401,7 +166468,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/text/internal/language/compact@v0.29.0 +golang.org/x/text/internal/language/compact@v0.30.0 Copyright 2009 The Go Authors. @@ -166457,7 +166524,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/text/internal/number@v0.29.0 +golang.org/x/text/internal/number@v0.30.0 Copyright 2009 The Go Authors. @@ -166513,7 +166580,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/text/internal/stringset@v0.29.0 +golang.org/x/text/internal/stringset@v0.30.0 Copyright 2009 The Go Authors. @@ -166569,7 +166636,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/text/internal/tag@v0.29.0 +golang.org/x/text/internal/tag@v0.30.0 Copyright 2009 The Go Authors. @@ -166625,7 +166692,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/text/internal/utf8internal@v0.29.0 +golang.org/x/text/internal/utf8internal@v0.30.0 Copyright 2009 The Go Authors. @@ -166681,7 +166748,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/text/language@v0.29.0 +golang.org/x/text/language@v0.30.0 Copyright 2009 The Go Authors. @@ -166737,7 +166804,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/text/message@v0.29.0 +golang.org/x/text/message@v0.30.0 Copyright 2009 The Go Authors. @@ -166793,7 +166860,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/text/message/catalog@v0.29.0 +golang.org/x/text/message/catalog@v0.30.0 Copyright 2009 The Go Authors. @@ -166849,7 +166916,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/text/runes@v0.29.0 +golang.org/x/text/runes@v0.30.0 Copyright 2009 The Go Authors. @@ -166905,7 +166972,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -golang.org/x/text/width@v0.29.0 +golang.org/x/text/width@v0.30.0 Copyright 2009 The Go Authors. @@ -167017,7 +167084,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/genproto/googleapis/api/httpbody@v0.0.0-20250707201910-8d1bb00bc6a7 +google.golang.org/genproto/googleapis/api/httpbody@v0.0.0-20250804133106-a7a43d27e69b Apache License Version 2.0, January 2004 @@ -167222,7 +167289,7 @@ Apache License limitations under the License. ***** -google.golang.org/genproto/googleapis/rpc/errdetails@v0.0.0-20250707201910-8d1bb00bc6a7 +google.golang.org/genproto/googleapis/rpc/errdetails@v0.0.0-20250804133106-a7a43d27e69b Apache License Version 2.0, January 2004 @@ -167427,7 +167494,7 @@ Apache License limitations under the License. ***** -google.golang.org/genproto/googleapis/rpc/status@v0.0.0-20250707201910-8d1bb00bc6a7 +google.golang.org/genproto/googleapis/rpc/status@v0.0.0-20250804133106-a7a43d27e69b Apache License Version 2.0, January 2004 @@ -167632,7 +167699,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc@v1.75.1 +google.golang.org/grpc@v1.76.0 Apache License Version 2.0, January 2004 @@ -167857,7 +167924,7 @@ See the License for the specific language governing permissions and limitations under the License. ***** -google.golang.org/grpc/attributes@v1.75.1 +google.golang.org/grpc/attributes@v1.76.0 Apache License Version 2.0, January 2004 @@ -168062,7 +168129,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/backoff@v1.75.1 +google.golang.org/grpc/backoff@v1.76.0 Apache License Version 2.0, January 2004 @@ -168267,7 +168334,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/balancer@v1.75.1 +google.golang.org/grpc/balancer@v1.76.0 Apache License Version 2.0, January 2004 @@ -168472,7 +168539,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/balancer/base@v1.75.1 +google.golang.org/grpc/balancer/base@v1.76.0 Apache License Version 2.0, January 2004 @@ -168677,7 +168744,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/balancer/endpointsharding@v1.75.1 +google.golang.org/grpc/balancer/endpointsharding@v1.76.0 Apache License Version 2.0, January 2004 @@ -168882,7 +168949,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/balancer/grpclb/state@v1.75.1 +google.golang.org/grpc/balancer/grpclb/state@v1.76.0 Apache License Version 2.0, January 2004 @@ -169087,7 +169154,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/balancer/pickfirst@v1.75.1 +google.golang.org/grpc/balancer/pickfirst@v1.76.0 Apache License Version 2.0, January 2004 @@ -169292,7 +169359,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/balancer/pickfirst/internal@v1.75.1 +google.golang.org/grpc/balancer/pickfirst/internal@v1.76.0 Apache License Version 2.0, January 2004 @@ -169497,7 +169564,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/balancer/pickfirst/pickfirstleaf@v1.75.1 +google.golang.org/grpc/balancer/pickfirst/pickfirstleaf@v1.76.0 Apache License Version 2.0, January 2004 @@ -169702,7 +169769,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/balancer/roundrobin@v1.75.1 +google.golang.org/grpc/balancer/roundrobin@v1.76.0 Apache License Version 2.0, January 2004 @@ -169907,7 +169974,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/binarylog/grpc_binarylog_v1@v1.75.1 +google.golang.org/grpc/binarylog/grpc_binarylog_v1@v1.76.0 Apache License Version 2.0, January 2004 @@ -170112,7 +170179,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/channelz@v1.75.1 +google.golang.org/grpc/channelz@v1.76.0 Apache License Version 2.0, January 2004 @@ -170317,7 +170384,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/codes@v1.75.1 +google.golang.org/grpc/codes@v1.76.0 Apache License Version 2.0, January 2004 @@ -170522,7 +170589,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/connectivity@v1.75.1 +google.golang.org/grpc/connectivity@v1.76.0 Apache License Version 2.0, January 2004 @@ -170727,7 +170794,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/credentials@v1.75.1 +google.golang.org/grpc/credentials@v1.76.0 Apache License Version 2.0, January 2004 @@ -170932,7 +170999,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/credentials/insecure@v1.75.1 +google.golang.org/grpc/credentials/insecure@v1.76.0 Apache License Version 2.0, January 2004 @@ -171137,7 +171204,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/encoding@v1.75.1 +google.golang.org/grpc/encoding@v1.76.0 Apache License Version 2.0, January 2004 @@ -171342,7 +171409,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/encoding/gzip@v1.75.1 +google.golang.org/grpc/encoding/gzip@v1.76.0 Apache License Version 2.0, January 2004 @@ -171547,7 +171614,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/encoding/proto@v1.75.1 +google.golang.org/grpc/encoding/proto@v1.76.0 Apache License Version 2.0, January 2004 @@ -171752,7 +171819,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/experimental/stats@v1.75.1 +google.golang.org/grpc/experimental/stats@v1.76.0 Apache License Version 2.0, January 2004 @@ -171957,7 +172024,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/grpclog@v1.75.1 +google.golang.org/grpc/grpclog@v1.76.0 Apache License Version 2.0, January 2004 @@ -172162,7 +172229,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/grpclog/internal@v1.75.1 +google.golang.org/grpc/grpclog/internal@v1.76.0 Apache License Version 2.0, January 2004 @@ -172367,7 +172434,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/health@v1.75.1 +google.golang.org/grpc/health@v1.76.0 Apache License Version 2.0, January 2004 @@ -172572,7 +172639,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/health/grpc_health_v1@v1.75.1 +google.golang.org/grpc/health/grpc_health_v1@v1.76.0 Apache License Version 2.0, January 2004 @@ -172777,7 +172844,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal@v1.75.1 +google.golang.org/grpc/internal@v1.76.0 Apache License Version 2.0, January 2004 @@ -172982,7 +173049,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal/backoff@v1.75.1 +google.golang.org/grpc/internal/backoff@v1.76.0 Apache License Version 2.0, January 2004 @@ -173187,7 +173254,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal/balancer/gracefulswitch@v1.75.1 +google.golang.org/grpc/internal/balancer/gracefulswitch@v1.76.0 Apache License Version 2.0, January 2004 @@ -173392,7 +173459,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal/balancerload@v1.75.1 +google.golang.org/grpc/internal/balancerload@v1.76.0 Apache License Version 2.0, January 2004 @@ -173597,7 +173664,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal/binarylog@v1.75.1 +google.golang.org/grpc/internal/binarylog@v1.76.0 Apache License Version 2.0, January 2004 @@ -173802,7 +173869,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal/buffer@v1.75.1 +google.golang.org/grpc/internal/buffer@v1.76.0 Apache License Version 2.0, January 2004 @@ -174007,7 +174074,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal/channelz@v1.75.1 +google.golang.org/grpc/internal/channelz@v1.76.0 Apache License Version 2.0, January 2004 @@ -174212,7 +174279,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal/credentials@v1.75.1 +google.golang.org/grpc/internal/credentials@v1.76.0 Apache License Version 2.0, January 2004 @@ -174417,7 +174484,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal/envconfig@v1.75.1 +google.golang.org/grpc/internal/envconfig@v1.76.0 Apache License Version 2.0, January 2004 @@ -174622,7 +174689,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal/grpclog@v1.75.1 +google.golang.org/grpc/internal/grpclog@v1.76.0 Apache License Version 2.0, January 2004 @@ -174827,7 +174894,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal/grpcsync@v1.75.1 +google.golang.org/grpc/internal/grpcsync@v1.76.0 Apache License Version 2.0, January 2004 @@ -175032,7 +175099,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal/grpcutil@v1.75.1 +google.golang.org/grpc/internal/grpcutil@v1.76.0 Apache License Version 2.0, January 2004 @@ -175237,7 +175304,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal/idle@v1.75.1 +google.golang.org/grpc/internal/idle@v1.76.0 Apache License Version 2.0, January 2004 @@ -175442,7 +175509,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal/metadata@v1.75.1 +google.golang.org/grpc/internal/metadata@v1.76.0 Apache License Version 2.0, January 2004 @@ -175647,7 +175714,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal/pretty@v1.75.1 +google.golang.org/grpc/internal/pretty@v1.76.0 Apache License Version 2.0, January 2004 @@ -175852,7 +175919,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal/proxyattributes@v1.75.1 +google.golang.org/grpc/internal/proxyattributes@v1.76.0 Apache License Version 2.0, January 2004 @@ -176057,7 +176124,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal/resolver@v1.75.1 +google.golang.org/grpc/internal/resolver@v1.76.0 Apache License Version 2.0, January 2004 @@ -176262,7 +176329,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal/resolver/delegatingresolver@v1.75.1 +google.golang.org/grpc/internal/resolver/delegatingresolver@v1.76.0 Apache License Version 2.0, January 2004 @@ -176467,7 +176534,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal/resolver/dns@v1.75.1 +google.golang.org/grpc/internal/resolver/dns@v1.76.0 Apache License Version 2.0, January 2004 @@ -176672,7 +176739,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal/resolver/dns/internal@v1.75.1 +google.golang.org/grpc/internal/resolver/dns/internal@v1.76.0 Apache License Version 2.0, January 2004 @@ -176877,7 +176944,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal/resolver/passthrough@v1.75.1 +google.golang.org/grpc/internal/resolver/passthrough@v1.76.0 Apache License Version 2.0, January 2004 @@ -177082,7 +177149,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal/resolver/unix@v1.75.1 +google.golang.org/grpc/internal/resolver/unix@v1.76.0 Apache License Version 2.0, January 2004 @@ -177287,7 +177354,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal/serviceconfig@v1.75.1 +google.golang.org/grpc/internal/serviceconfig@v1.76.0 Apache License Version 2.0, January 2004 @@ -177492,7 +177559,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal/stats@v1.75.1 +google.golang.org/grpc/internal/stats@v1.76.0 Apache License Version 2.0, January 2004 @@ -177697,7 +177764,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal/status@v1.75.1 +google.golang.org/grpc/internal/status@v1.76.0 Apache License Version 2.0, January 2004 @@ -177902,7 +177969,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal/syscall@v1.75.1 +google.golang.org/grpc/internal/syscall@v1.76.0 Apache License Version 2.0, January 2004 @@ -178107,7 +178174,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal/transport@v1.75.1 +google.golang.org/grpc/internal/transport@v1.76.0 Apache License Version 2.0, January 2004 @@ -178312,7 +178379,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/internal/transport/networktype@v1.75.1 +google.golang.org/grpc/internal/transport/networktype@v1.76.0 Apache License Version 2.0, January 2004 @@ -178517,7 +178584,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/keepalive@v1.75.1 +google.golang.org/grpc/keepalive@v1.76.0 Apache License Version 2.0, January 2004 @@ -178722,7 +178789,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/mem@v1.75.1 +google.golang.org/grpc/mem@v1.76.0 Apache License Version 2.0, January 2004 @@ -178927,7 +178994,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/metadata@v1.75.1 +google.golang.org/grpc/metadata@v1.76.0 Apache License Version 2.0, January 2004 @@ -179132,7 +179199,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/peer@v1.75.1 +google.golang.org/grpc/peer@v1.76.0 Apache License Version 2.0, January 2004 @@ -179337,7 +179404,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/resolver@v1.75.1 +google.golang.org/grpc/resolver@v1.76.0 Apache License Version 2.0, January 2004 @@ -179542,7 +179609,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/resolver/dns@v1.75.1 +google.golang.org/grpc/resolver/dns@v1.76.0 Apache License Version 2.0, January 2004 @@ -179747,7 +179814,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/serviceconfig@v1.75.1 +google.golang.org/grpc/serviceconfig@v1.76.0 Apache License Version 2.0, January 2004 @@ -179952,7 +180019,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/stats@v1.75.1 +google.golang.org/grpc/stats@v1.76.0 Apache License Version 2.0, January 2004 @@ -180157,7 +180224,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/status@v1.75.1 +google.golang.org/grpc/status@v1.76.0 Apache License Version 2.0, January 2004 @@ -180362,7 +180429,7 @@ Apache License limitations under the License. ***** -google.golang.org/grpc/tap@v1.75.1 +google.golang.org/grpc/tap@v1.76.0 Apache License Version 2.0, January 2004 @@ -180567,7 +180634,7 @@ Apache License limitations under the License. ***** -google.golang.org/protobuf/encoding/protodelim@v1.36.9 +google.golang.org/protobuf/encoding/protodelim@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -180623,7 +180690,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/encoding/protojson@v1.36.9 +google.golang.org/protobuf/encoding/protojson@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -180679,7 +180746,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/encoding/prototext@v1.36.9 +google.golang.org/protobuf/encoding/prototext@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -180735,7 +180802,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/encoding/protowire@v1.36.9 +google.golang.org/protobuf/encoding/protowire@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -180791,7 +180858,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/internal/descfmt@v1.36.9 +google.golang.org/protobuf/internal/descfmt@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -180847,7 +180914,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/internal/descopts@v1.36.9 +google.golang.org/protobuf/internal/descopts@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -180903,7 +180970,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/internal/detrand@v1.36.9 +google.golang.org/protobuf/internal/detrand@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -180959,7 +181026,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/internal/editiondefaults@v1.36.9 +google.golang.org/protobuf/internal/editiondefaults@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -181015,7 +181082,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/internal/editionssupport@v1.36.9 +google.golang.org/protobuf/internal/editionssupport@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -181071,7 +181138,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/internal/encoding/defval@v1.36.9 +google.golang.org/protobuf/internal/encoding/defval@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -181127,7 +181194,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/internal/encoding/json@v1.36.9 +google.golang.org/protobuf/internal/encoding/json@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -181183,7 +181250,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/internal/encoding/messageset@v1.36.9 +google.golang.org/protobuf/internal/encoding/messageset@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -181239,7 +181306,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/internal/encoding/tag@v1.36.9 +google.golang.org/protobuf/internal/encoding/tag@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -181295,7 +181362,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/internal/encoding/text@v1.36.9 +google.golang.org/protobuf/internal/encoding/text@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -181351,7 +181418,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/internal/errors@v1.36.9 +google.golang.org/protobuf/internal/errors@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -181407,7 +181474,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/internal/filedesc@v1.36.9 +google.golang.org/protobuf/internal/filedesc@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -181463,7 +181530,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/internal/filetype@v1.36.9 +google.golang.org/protobuf/internal/filetype@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -181519,7 +181586,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/internal/flags@v1.36.9 +google.golang.org/protobuf/internal/flags@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -181575,7 +181642,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/internal/genid@v1.36.9 +google.golang.org/protobuf/internal/genid@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -181631,7 +181698,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/internal/impl@v1.36.9 +google.golang.org/protobuf/internal/impl@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -181687,7 +181754,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/internal/order@v1.36.9 +google.golang.org/protobuf/internal/order@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -181743,7 +181810,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/internal/pragma@v1.36.9 +google.golang.org/protobuf/internal/pragma@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -181799,7 +181866,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/internal/protolazy@v1.36.9 +google.golang.org/protobuf/internal/protolazy@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -181855,7 +181922,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/internal/set@v1.36.9 +google.golang.org/protobuf/internal/set@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -181911,7 +181978,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/internal/strs@v1.36.9 +google.golang.org/protobuf/internal/strs@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -181967,7 +182034,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/internal/version@v1.36.9 +google.golang.org/protobuf/internal/version@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -182023,7 +182090,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/proto@v1.36.9 +google.golang.org/protobuf/proto@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -182079,7 +182146,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/protoadapt@v1.36.9 +google.golang.org/protobuf/protoadapt@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -182135,7 +182202,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/reflect/protodesc@v1.36.9 +google.golang.org/protobuf/reflect/protodesc@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -182191,7 +182258,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/reflect/protoreflect@v1.36.9 +google.golang.org/protobuf/reflect/protoreflect@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -182247,7 +182314,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/reflect/protoregistry@v1.36.9 +google.golang.org/protobuf/reflect/protoregistry@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -182303,7 +182370,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/runtime/protoiface@v1.36.9 +google.golang.org/protobuf/runtime/protoiface@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -182359,7 +182426,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/runtime/protoimpl@v1.36.9 +google.golang.org/protobuf/runtime/protoimpl@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -182415,7 +182482,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/types/descriptorpb@v1.36.9 +google.golang.org/protobuf/types/descriptorpb@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -182471,7 +182538,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/types/gofeaturespb@v1.36.9 +google.golang.org/protobuf/types/gofeaturespb@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -182527,7 +182594,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/types/known/anypb@v1.36.9 +google.golang.org/protobuf/types/known/anypb@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -182583,7 +182650,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/types/known/durationpb@v1.36.9 +google.golang.org/protobuf/types/known/durationpb@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -182639,7 +182706,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/types/known/emptypb@v1.36.9 +google.golang.org/protobuf/types/known/emptypb@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -182695,7 +182762,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/types/known/fieldmaskpb@v1.36.9 +google.golang.org/protobuf/types/known/fieldmaskpb@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -182751,7 +182818,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/types/known/structpb@v1.36.9 +google.golang.org/protobuf/types/known/structpb@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -182807,7 +182874,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/types/known/timestamppb@v1.36.9 +google.golang.org/protobuf/types/known/timestamppb@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. @@ -182863,7 +182930,7 @@ rights granted to you under this License for this implementation of Go shall terminate as of the date such litigation is filed. ***** -google.golang.org/protobuf/types/known/wrapperspb@v1.36.9 +google.golang.org/protobuf/types/known/wrapperspb@v1.36.10 Copyright (c) 2018 The Go Authors. All rights reserved. diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5.dep.yml index 7e6c5e6d..05df7e3f 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5.dep.yml @@ -1,6 +1,6 @@ --- name: github.com/go-git/go-git/v5 -version: v5.16.2 +version: v5.16.3 type: go summary: A highly extensible git implementation in pure Go. homepage: https://pkg.go.dev/github.com/go-git/go-git/v5 diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/config.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/config.dep.yml index 5a8f4bf2..ff486698 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/config.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/config.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/config -version: v5.16.2 +version: v5.16.3 type: go summary: Package config contains the abstraction of multiple config files homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/config license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/internal/path_util.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/internal/path_util.dep.yml index 04259efc..a5c5b9ed 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/internal/path_util.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/internal/path_util.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/internal/path_util -version: v5.16.2 +version: v5.16.3 type: go -summary: +summary: homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/internal/path_util license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/internal/revision.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/internal/revision.dep.yml index 475a4d6b..eb283f9e 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/internal/revision.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/internal/revision.dep.yml @@ -1,13 +1,13 @@ --- name: github.com/go-git/go-git/v5/internal/revision -version: v5.16.2 +version: v5.16.3 type: go summary: 'Package revision extracts git revision from string More information about revision : https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html' homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/internal/revision license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -210,6 +210,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/internal/url.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/internal/url.dep.yml index 323954c3..920c3f7f 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/internal/url.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/internal/url.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/internal/url -version: v5.16.2 +version: v5.16.3 type: go -summary: +summary: homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/internal/url license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing.dep.yml index 05e34679..3beff5c8 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/plumbing -version: v5.16.2 +version: v5.16.3 type: go summary: package plumbing implement the core interfaces and structs used by go-git homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/cache.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/cache.dep.yml index 7ad8bb0f..ee0bc906 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/cache.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/cache.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/plumbing/cache -version: v5.16.2 +version: v5.16.3 type: go -summary: +summary: homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/cache license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/color.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/color.dep.yml index 62f0c00a..1498f6fb 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/color.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/color.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/plumbing/color -version: v5.16.2 +version: v5.16.3 type: go -summary: +summary: homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/color license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/filemode.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/filemode.dep.yml index 094163ea..a158ff54 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/filemode.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/filemode.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/plumbing/filemode -version: v5.16.2 +version: v5.16.3 type: go -summary: +summary: homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/filemode license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/config.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/config.dep.yml index 4cdf47de..378bc7cc 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/config.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/config.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/plumbing/format/config -version: v5.16.2 +version: v5.16.3 type: go summary: Package config implements encoding and decoding of git config files. homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/format/config license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/diff.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/diff.dep.yml index 07fa73d4..d81dea42 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/diff.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/diff.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/plumbing/format/diff -version: v5.16.2 +version: v5.16.3 type: go -summary: +summary: homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/format/diff license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/gitignore.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/gitignore.dep.yml index e57027bb..08d5e7be 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/gitignore.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/gitignore.dep.yml @@ -1,6 +1,6 @@ --- name: github.com/go-git/go-git/v5/plumbing/format/gitignore -version: v5.16.2 +version: v5.16.3 type: go summary: Package gitignore implements matching file system paths to gitignore patterns that can be automatically read from a git repository tree in the order of definition @@ -8,7 +8,7 @@ summary: Package gitignore implements matching file system paths to gitignore pa homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/format/gitignore license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -211,6 +211,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/idxfile.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/idxfile.dep.yml index 500de1c1..f15dfa15 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/idxfile.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/idxfile.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/plumbing/format/idxfile -version: v5.16.2 +version: v5.16.3 type: go summary: Package idxfile implements encoding and decoding of packfile idx files. homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/format/idxfile license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/index.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/index.dep.yml index 0d1bb8c6..3bf27975 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/index.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/index.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/plumbing/format/index -version: v5.16.2 +version: v5.16.3 type: go summary: Package index implements encoding and decoding of index format files. homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/format/index license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/objfile.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/objfile.dep.yml index 4cf92a67..2e528aab 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/objfile.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/objfile.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/plumbing/format/objfile -version: v5.16.2 +version: v5.16.3 type: go summary: Package objfile implements encoding and decoding of object files. homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/format/objfile license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/packfile.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/packfile.dep.yml index 7b909673..651c0f9c 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/packfile.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/packfile.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/plumbing/format/packfile -version: v5.16.2 +version: v5.16.3 type: go summary: Package packfile implements encoding and decoding of packfile format. homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/format/packfile license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/pktline.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/pktline.dep.yml index f4eddadf..d6852928 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/pktline.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/format/pktline.dep.yml @@ -1,13 +1,13 @@ --- name: github.com/go-git/go-git/v5/plumbing/format/pktline -version: v5.16.2 +version: v5.16.3 type: go summary: Package pktline implements reading payloads form pkt-lines and encoding pkt-lines from payloads. homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/format/pktline license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -210,6 +210,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/hash.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/hash.dep.yml index c8156907..a49c31bf 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/hash.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/hash.dep.yml @@ -1,13 +1,13 @@ --- name: github.com/go-git/go-git/v5/plumbing/hash -version: v5.16.2 +version: v5.16.3 type: go summary: package hash provides a way for managing the underlying hash implementations used across go-git. homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/hash license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -210,6 +210,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/object.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/object.dep.yml index b77daa8e..233c24aa 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/object.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/object.dep.yml @@ -1,13 +1,13 @@ --- name: github.com/go-git/go-git/v5/plumbing/object -version: v5.16.2 +version: v5.16.3 type: go summary: Package object contains implementations of all Git objects and utility functions to work with them. homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/object license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -210,6 +210,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/protocol/packp.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/protocol/packp.dep.yml index be87fed5..d2304b4f 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/protocol/packp.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/protocol/packp.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/plumbing/protocol/packp -version: v5.16.2 +version: v5.16.3 type: go -summary: +summary: homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/protocol/packp license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/protocol/packp/capability.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/protocol/packp/capability.dep.yml index 17b48754..87d914a1 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/protocol/packp/capability.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/protocol/packp/capability.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/plumbing/protocol/packp/capability -version: v5.16.2 +version: v5.16.3 type: go summary: Package capability defines the server and client capabilities. homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/protocol/packp/capability license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband.dep.yml index 029d05e0..26845593 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband -version: v5.16.2 +version: v5.16.3 type: go summary: Package sideband implements a sideband mutiplex/demultiplexer homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/protocol/packp/sideband license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/revlist.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/revlist.dep.yml index 17e3d372..cea3eb43 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/revlist.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/revlist.dep.yml @@ -1,13 +1,13 @@ --- name: github.com/go-git/go-git/v5/plumbing/revlist -version: v5.16.2 +version: v5.16.3 type: go summary: Package revlist provides support to access the ancestors of commits, in a similar way as the git-rev-list command. homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/revlist license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -210,6 +210,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/storer.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/storer.dep.yml index 3d283a5f..5c919411 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/storer.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/storer.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/plumbing/storer -version: v5.16.2 +version: v5.16.3 type: go summary: Package storer defines the interfaces to store objects, references, etc. homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/storer license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport.dep.yml index 239369e0..04c4c5af 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/plumbing/transport -version: v5.16.2 +version: v5.16.3 type: go summary: Package transport includes the implementation for different transport protocols. homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/transport license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/client.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/client.dep.yml index acb280e5..1b75f74d 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/client.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/client.dep.yml @@ -1,13 +1,13 @@ --- name: github.com/go-git/go-git/v5/plumbing/transport/client -version: v5.16.2 +version: v5.16.3 type: go summary: Package client contains helper function to deal with the different client protocols. homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/transport/client license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -210,6 +210,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/file.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/file.dep.yml index 1698e2e2..8cd44f27 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/file.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/file.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/plumbing/transport/file -version: v5.16.2 +version: v5.16.3 type: go summary: Package file implements the file transport protocol. homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/transport/file license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/git.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/git.dep.yml index b1e39a41..de189a12 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/git.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/git.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/plumbing/transport/git -version: v5.16.2 +version: v5.16.3 type: go summary: Package git implements the git transport protocol. homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/transport/git license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/http.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/http.dep.yml index 9a7202f6..e74b2df5 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/http.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/http.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/plumbing/transport/http -version: v5.16.2 +version: v5.16.3 type: go summary: Package http implements the HTTP transport protocol. homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/transport/http license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/internal/common.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/internal/common.dep.yml index 9fc6fa01..a53e0295 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/internal/common.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/internal/common.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/plumbing/transport/internal/common -version: v5.16.2 +version: v5.16.3 type: go summary: Package common implements the git pack protocol with a pluggable transport. homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/transport/internal/common license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/server.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/server.dep.yml index e95cfcce..c5fc2a98 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/server.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/server.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/plumbing/transport/server -version: v5.16.2 +version: v5.16.3 type: go summary: Package server implements the git server protocol. homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/transport/server license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/ssh.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/ssh.dep.yml index b0dc3511..96a9e787 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/ssh.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/plumbing/transport/ssh.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/plumbing/transport/ssh -version: v5.16.2 +version: v5.16.3 type: go summary: Package ssh implements the SSH transport protocol. homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/plumbing/transport/ssh license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/storage.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/storage.dep.yml index f27b218a..d4c1ec1d 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/storage.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/storage.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/storage -version: v5.16.2 +version: v5.16.3 type: go -summary: +summary: homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/storage license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/storage/filesystem.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/storage/filesystem.dep.yml index e65ac0cb..a6c3531b 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/storage/filesystem.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/storage/filesystem.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/storage/filesystem -version: v5.16.2 +version: v5.16.3 type: go summary: Package filesystem is a storage backend base on filesystems homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/storage/filesystem license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/storage/filesystem/dotgit.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/storage/filesystem/dotgit.dep.yml index 99687f06..7c917d1d 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/storage/filesystem/dotgit.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/storage/filesystem/dotgit.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/storage/filesystem/dotgit -version: v5.16.2 +version: v5.16.3 type: go summary: https://github.com/git/git/blob/master/Documentation/gitrepository-layout.txt homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/storage/filesystem/dotgit license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/storage/memory.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/storage/memory.dep.yml index 50a0f26c..31a99471 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/storage/memory.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/storage/memory.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/storage/memory -version: v5.16.2 +version: v5.16.3 type: go summary: Package memory is a storage backend base on memory homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/storage/memory license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/binary.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/binary.dep.yml index 81634e89..9eaabca3 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/binary.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/binary.dep.yml @@ -1,13 +1,13 @@ --- name: github.com/go-git/go-git/v5/utils/binary -version: v5.16.2 +version: v5.16.3 type: go summary: Package binary implements syntax-sugar functions on top of the standard library binary package homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/utils/binary license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -210,6 +210,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/diff.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/diff.dep.yml index 51edddeb..6104e43f 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/diff.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/diff.dep.yml @@ -1,13 +1,13 @@ --- name: github.com/go-git/go-git/v5/utils/diff -version: v5.16.2 +version: v5.16.3 type: go summary: Package diff implements line oriented diffs, similar to the ancient Unix diff command. homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/utils/diff license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -210,6 +210,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/ioutil.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/ioutil.dep.yml index e6c4f389..83646c53 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/ioutil.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/ioutil.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/utils/ioutil -version: v5.16.2 +version: v5.16.3 type: go summary: Package ioutil implements some I/O utility functions. homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/utils/ioutil license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/merkletrie.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/merkletrie.dep.yml index 08e8b456..ecf6f630 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/merkletrie.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/merkletrie.dep.yml @@ -1,13 +1,13 @@ --- name: github.com/go-git/go-git/v5/utils/merkletrie -version: v5.16.2 +version: v5.16.3 type: go summary: Package merkletrie provides support for n-ary trees that are at the same time Merkle trees and Radix trees (tries). homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/utils/merkletrie license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -210,6 +210,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/merkletrie/filesystem.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/merkletrie/filesystem.dep.yml index 3370d30b..99c47770 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/merkletrie/filesystem.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/merkletrie/filesystem.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/utils/merkletrie/filesystem -version: v5.16.2 +version: v5.16.3 type: go -summary: +summary: homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/utils/merkletrie/filesystem license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/merkletrie/index.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/merkletrie/index.dep.yml index 59c0fcf3..6609b0c2 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/merkletrie/index.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/merkletrie/index.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/utils/merkletrie/index -version: v5.16.2 +version: v5.16.3 type: go -summary: +summary: homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/utils/merkletrie/index license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/merkletrie/internal/frame.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/merkletrie/internal/frame.dep.yml index 8faa378c..0aaeabe0 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/merkletrie/internal/frame.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/merkletrie/internal/frame.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/utils/merkletrie/internal/frame -version: v5.16.2 +version: v5.16.3 type: go -summary: +summary: homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/utils/merkletrie/internal/frame license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/merkletrie/noder.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/merkletrie/noder.dep.yml index 3cbf44fa..af736be7 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/merkletrie/noder.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/merkletrie/noder.dep.yml @@ -1,13 +1,13 @@ --- name: github.com/go-git/go-git/v5/utils/merkletrie/noder -version: v5.16.2 +version: v5.16.3 type: go summary: Package noder provide an interface for defining nodes in a merkletrie, their hashes and their paths (a noders and its ancestors). homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/utils/merkletrie/noder license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -210,6 +210,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/sync.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/sync.dep.yml index 965ec8c6..8f0442f8 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/sync.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/sync.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/utils/sync -version: v5.16.2 +version: v5.16.3 type: go -summary: +summary: homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/utils/sync license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/trace.dep.yml b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/trace.dep.yml index 678d26ca..58751a32 100644 --- a/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/trace.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/go-git/go-git/v5/utils/trace.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/go-git/go-git/v5/utils/trace -version: v5.16.2 +version: v5.16.3 type: go -summary: +summary: homepage: https://pkg.go.dev/github.com/go-git/go-git/v5/utils/trace license: apache-2.0 licenses: -- sources: v5@v5.16.2/LICENSE +- sources: v5@v5.16.3/LICENSE text: |2 Apache License Version 2.0, January 2004 @@ -209,6 +209,6 @@ licenses: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -- sources: v5@v5.16.2/README.md +- sources: v5@v5.16.3/README.md text: Apache License Version 2.0, see [LICENSE](LICENSE) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/sagikazarmark/locafero.dep.yml b/.licenses/arduino-app-cli/go/github.com/sagikazarmark/locafero.dep.yml index d159fe8a..b7b6e50c 100644 --- a/.licenses/arduino-app-cli/go/github.com/sagikazarmark/locafero.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/sagikazarmark/locafero.dep.yml @@ -1,8 +1,8 @@ --- name: github.com/sagikazarmark/locafero -version: v0.7.0 +version: v0.11.0 type: go -summary: Package finder looks for files and directories in an {fs.Fs} filesystem. +summary: Package locafero looks for files and directories in an {fs.Fs} filesystem. homepage: https://pkg.go.dev/github.com/sagikazarmark/locafero license: mit licenses: diff --git a/.licenses/arduino-app-cli/go/github.com/sourcegraph/conc.dep.yml b/.licenses/arduino-app-cli/go/github.com/sourcegraph/conc.dep.yml index e9af869d..5b90aa4f 100644 --- a/.licenses/arduino-app-cli/go/github.com/sourcegraph/conc.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/sourcegraph/conc.dep.yml @@ -1,8 +1,8 @@ --- name: github.com/sourcegraph/conc -version: v0.3.0 +version: v0.3.1-0.20240121214520-5f936abd7ae8 type: go -summary: +summary: homepage: https://pkg.go.dev/github.com/sourcegraph/conc license: mit licenses: diff --git a/.licenses/arduino-app-cli/go/github.com/sourcegraph/conc/panics.dep.yml b/.licenses/arduino-app-cli/go/github.com/sourcegraph/conc/panics.dep.yml index 412e1c2c..9fabe553 100644 --- a/.licenses/arduino-app-cli/go/github.com/sourcegraph/conc/panics.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/sourcegraph/conc/panics.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/sourcegraph/conc/panics -version: v0.3.0 +version: v0.3.1-0.20240121214520-5f936abd7ae8 type: go -summary: +summary: homepage: https://pkg.go.dev/github.com/sourcegraph/conc/panics license: mit licenses: -- sources: conc@v0.3.0/LICENSE +- sources: conc@v0.3.1-0.20240121214520-5f936abd7ae8/LICENSE text: | MIT License diff --git a/.licenses/arduino-app-cli/go/github.com/sourcegraph/conc/internal/multierror.dep.yml b/.licenses/arduino-app-cli/go/github.com/sourcegraph/conc/pool.dep.yml similarity index 84% rename from .licenses/arduino-app-cli/go/github.com/sourcegraph/conc/internal/multierror.dep.yml rename to .licenses/arduino-app-cli/go/github.com/sourcegraph/conc/pool.dep.yml index 7bd4c6de..75f9d4d9 100644 --- a/.licenses/arduino-app-cli/go/github.com/sourcegraph/conc/internal/multierror.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/sourcegraph/conc/pool.dep.yml @@ -1,12 +1,12 @@ --- -name: github.com/sourcegraph/conc/internal/multierror -version: v0.3.0 +name: github.com/sourcegraph/conc/pool +version: v0.3.1-0.20240121214520-5f936abd7ae8 type: go -summary: -homepage: https://pkg.go.dev/github.com/sourcegraph/conc/internal/multierror +summary: +homepage: https://pkg.go.dev/github.com/sourcegraph/conc/pool license: mit licenses: -- sources: conc@v0.3.0/LICENSE +- sources: conc@v0.3.1-0.20240121214520-5f936abd7ae8/LICENSE text: | MIT License diff --git a/.licenses/arduino-app-cli/go/github.com/spf13/afero.dep.yml b/.licenses/arduino-app-cli/go/github.com/spf13/afero.dep.yml index d11c5243..7e393a3e 100644 --- a/.licenses/arduino-app-cli/go/github.com/spf13/afero.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/spf13/afero.dep.yml @@ -1,8 +1,8 @@ --- name: github.com/spf13/afero -version: v1.12.0 +version: v1.15.0 type: go -summary: +summary: homepage: https://pkg.go.dev/github.com/spf13/afero license: apache-2.0 licenses: @@ -182,8 +182,4 @@ licenses: 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. -- sources: README.md - text: |- - Afero is released under the Apache 2.0 license. See - [LICENSE.txt](https://github.com/spf13/afero/blob/master/LICENSE.txt) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/spf13/afero/internal/common.dep.yml b/.licenses/arduino-app-cli/go/github.com/spf13/afero/internal/common.dep.yml index e2209f19..762f1646 100644 --- a/.licenses/arduino-app-cli/go/github.com/spf13/afero/internal/common.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/spf13/afero/internal/common.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/spf13/afero/internal/common -version: v1.12.0 +version: v1.15.0 type: go -summary: +summary: homepage: https://pkg.go.dev/github.com/spf13/afero/internal/common license: apache-2.0 licenses: -- sources: afero@v1.12.0/LICENSE.txt +- sources: afero@v1.15.0/LICENSE.txt text: |2 Apache License Version 2.0, January 2004 @@ -182,8 +182,4 @@ licenses: 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. -- sources: afero@v1.12.0/README.md - text: |- - Afero is released under the Apache 2.0 license. See - [LICENSE.txt](https://github.com/spf13/afero/blob/master/LICENSE.txt) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/spf13/afero/mem.dep.yml b/.licenses/arduino-app-cli/go/github.com/spf13/afero/mem.dep.yml index 50060367..3d329d4c 100644 --- a/.licenses/arduino-app-cli/go/github.com/spf13/afero/mem.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/spf13/afero/mem.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/spf13/afero/mem -version: v1.12.0 +version: v1.15.0 type: go -summary: +summary: homepage: https://pkg.go.dev/github.com/spf13/afero/mem license: apache-2.0 licenses: -- sources: afero@v1.12.0/LICENSE.txt +- sources: afero@v1.15.0/LICENSE.txt text: |2 Apache License Version 2.0, January 2004 @@ -182,8 +182,4 @@ licenses: 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. -- sources: afero@v1.12.0/README.md - text: |- - Afero is released under the Apache 2.0 license. See - [LICENSE.txt](https://github.com/spf13/afero/blob/master/LICENSE.txt) notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/spf13/cast.dep.yml b/.licenses/arduino-app-cli/go/github.com/spf13/cast.dep.yml index 22ec680c..2e4c07f3 100644 --- a/.licenses/arduino-app-cli/go/github.com/spf13/cast.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/spf13/cast.dep.yml @@ -1,6 +1,6 @@ --- name: github.com/spf13/cast -version: v1.7.1 +version: v1.10.0 type: go summary: Package cast provides easy and safe casting in Go. homepage: https://pkg.go.dev/github.com/spf13/cast @@ -29,4 +29,6 @@ licenses: 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. +- sources: README.md + text: The project is licensed under the [MIT License](LICENSE). notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/sourcegraph/conc/iter.dep.yml b/.licenses/arduino-app-cli/go/github.com/spf13/cast/internal.dep.yml similarity index 77% rename from .licenses/arduino-app-cli/go/github.com/sourcegraph/conc/iter.dep.yml rename to .licenses/arduino-app-cli/go/github.com/spf13/cast/internal.dep.yml index 84963446..ad6d721e 100644 --- a/.licenses/arduino-app-cli/go/github.com/sourcegraph/conc/iter.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/spf13/cast/internal.dep.yml @@ -1,16 +1,16 @@ --- -name: github.com/sourcegraph/conc/iter -version: v0.3.0 +name: github.com/spf13/cast/internal +version: v1.10.0 type: go -summary: -homepage: https://pkg.go.dev/github.com/sourcegraph/conc/iter +summary: +homepage: https://pkg.go.dev/github.com/spf13/cast/internal license: mit licenses: -- sources: conc@v0.3.0/LICENSE - text: | - MIT License +- sources: cast@v1.10.0/LICENSE + text: |- + The MIT License (MIT) - Copyright (c) 2023 Sourcegraph + Copyright (c) 2014 Steve Francia Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -29,4 +29,6 @@ licenses: 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. +- sources: cast@v1.10.0/README.md + text: The project is licensed under the [MIT License](LICENSE). notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/spf13/pflag.dep.yml b/.licenses/arduino-app-cli/go/github.com/spf13/pflag.dep.yml index 6984f241..c47fe637 100644 --- a/.licenses/arduino-app-cli/go/github.com/spf13/pflag.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/spf13/pflag.dep.yml @@ -1,6 +1,6 @@ --- name: github.com/spf13/pflag -version: v1.0.9 +version: v1.0.10 type: go summary: Package pflag is a drop-in replacement for Go's flag package, implementing POSIX/GNU-style --flags. diff --git a/.licenses/arduino-app-cli/go/github.com/spf13/viper.dep.yml b/.licenses/arduino-app-cli/go/github.com/spf13/viper.dep.yml index 1d37ad1e..9cf157d1 100644 --- a/.licenses/arduino-app-cli/go/github.com/spf13/viper.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/spf13/viper.dep.yml @@ -1,8 +1,8 @@ --- name: github.com/spf13/viper -version: v1.20.1 +version: v1.21.0 type: go -summary: +summary: homepage: https://pkg.go.dev/github.com/spf13/viper license: mit licenses: diff --git a/.licenses/arduino-app-cli/go/github.com/spf13/viper/internal/encoding/dotenv.dep.yml b/.licenses/arduino-app-cli/go/github.com/spf13/viper/internal/encoding/dotenv.dep.yml index f28e5bc4..4842bb4d 100644 --- a/.licenses/arduino-app-cli/go/github.com/spf13/viper/internal/encoding/dotenv.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/spf13/viper/internal/encoding/dotenv.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/spf13/viper/internal/encoding/dotenv -version: v1.20.1 +version: v1.21.0 type: go -summary: +summary: homepage: https://pkg.go.dev/github.com/spf13/viper/internal/encoding/dotenv license: mit licenses: -- sources: viper@v1.20.1/LICENSE +- sources: viper@v1.21.0/LICENSE text: |- The MIT License (MIT) @@ -29,6 +29,6 @@ licenses: 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. -- sources: viper@v1.20.1/README.md +- sources: viper@v1.21.0/README.md text: The project is licensed under the [MIT License](LICENSE). notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/spf13/viper/internal/encoding/json.dep.yml b/.licenses/arduino-app-cli/go/github.com/spf13/viper/internal/encoding/json.dep.yml index 3978d9bc..227f55d3 100644 --- a/.licenses/arduino-app-cli/go/github.com/spf13/viper/internal/encoding/json.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/spf13/viper/internal/encoding/json.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/spf13/viper/internal/encoding/json -version: v1.20.1 +version: v1.21.0 type: go -summary: +summary: homepage: https://pkg.go.dev/github.com/spf13/viper/internal/encoding/json license: mit licenses: -- sources: viper@v1.20.1/LICENSE +- sources: viper@v1.21.0/LICENSE text: |- The MIT License (MIT) @@ -29,6 +29,6 @@ licenses: 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. -- sources: viper@v1.20.1/README.md +- sources: viper@v1.21.0/README.md text: The project is licensed under the [MIT License](LICENSE). notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/spf13/viper/internal/encoding/toml.dep.yml b/.licenses/arduino-app-cli/go/github.com/spf13/viper/internal/encoding/toml.dep.yml index d1e99637..382a7e72 100644 --- a/.licenses/arduino-app-cli/go/github.com/spf13/viper/internal/encoding/toml.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/spf13/viper/internal/encoding/toml.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/spf13/viper/internal/encoding/toml -version: v1.20.1 +version: v1.21.0 type: go -summary: +summary: homepage: https://pkg.go.dev/github.com/spf13/viper/internal/encoding/toml license: mit licenses: -- sources: viper@v1.20.1/LICENSE +- sources: viper@v1.21.0/LICENSE text: |- The MIT License (MIT) @@ -29,6 +29,6 @@ licenses: 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. -- sources: viper@v1.20.1/README.md +- sources: viper@v1.21.0/README.md text: The project is licensed under the [MIT License](LICENSE). notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/spf13/viper/internal/encoding/yaml.dep.yml b/.licenses/arduino-app-cli/go/github.com/spf13/viper/internal/encoding/yaml.dep.yml index ea34f237..76476583 100644 --- a/.licenses/arduino-app-cli/go/github.com/spf13/viper/internal/encoding/yaml.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/spf13/viper/internal/encoding/yaml.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/spf13/viper/internal/encoding/yaml -version: v1.20.1 +version: v1.21.0 type: go -summary: +summary: homepage: https://pkg.go.dev/github.com/spf13/viper/internal/encoding/yaml license: mit licenses: -- sources: viper@v1.20.1/LICENSE +- sources: viper@v1.21.0/LICENSE text: |- The MIT License (MIT) @@ -29,6 +29,6 @@ licenses: 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. -- sources: viper@v1.20.1/README.md +- sources: viper@v1.21.0/README.md text: The project is licensed under the [MIT License](LICENSE). notices: [] diff --git a/.licenses/arduino-app-cli/go/github.com/spf13/viper/internal/features.dep.yml b/.licenses/arduino-app-cli/go/github.com/spf13/viper/internal/features.dep.yml index b6929192..cbe35194 100644 --- a/.licenses/arduino-app-cli/go/github.com/spf13/viper/internal/features.dep.yml +++ b/.licenses/arduino-app-cli/go/github.com/spf13/viper/internal/features.dep.yml @@ -1,12 +1,12 @@ --- name: github.com/spf13/viper/internal/features -version: v1.20.1 +version: v1.21.0 type: go -summary: +summary: homepage: https://pkg.go.dev/github.com/spf13/viper/internal/features license: mit licenses: -- sources: viper@v1.20.1/LICENSE +- sources: viper@v1.21.0/LICENSE text: |- The MIT License (MIT) @@ -29,6 +29,6 @@ licenses: 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. -- sources: viper@v1.20.1/README.md +- sources: viper@v1.21.0/README.md text: The project is licensed under the [MIT License](LICENSE). notices: [] diff --git a/.licenses/arduino-app-cli/go/go.yaml.in/yaml/v3.dep.yml b/.licenses/arduino-app-cli/go/go.yaml.in/yaml/v3.dep.yml new file mode 100644 index 00000000..7fe89709 --- /dev/null +++ b/.licenses/arduino-app-cli/go/go.yaml.in/yaml/v3.dep.yml @@ -0,0 +1,80 @@ +--- +name: go.yaml.in/yaml/v3 +version: v3.0.4 +type: go +summary: Package yaml implements YAML support for the Go language. +homepage: https://pkg.go.dev/go.yaml.in/yaml/v3 +license: other +licenses: +- sources: LICENSE + text: |2 + + This project is covered by two different licenses: MIT and Apache. + + #### MIT License #### + + The following files were ported to Go from C files of libyaml, and thus + are still covered by their original MIT license, with the additional + copyright staring in 2011 when the project was ported over: + + apic.go emitterc.go parserc.go readerc.go scannerc.go + writerc.go yamlh.go yamlprivateh.go + + Copyright (c) 2006-2010 Kirill Simonov + Copyright (c) 2006-2011 Kirill Simonov + + 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. + + ### Apache License ### + + All the remaining project files are covered by the Apache license: + + Copyright (c) 2011-2019 Canonical Ltd + + 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. +- sources: README.md + text: |- + The yaml package is licensed under the MIT and Apache License 2.0 licenses. + Please see the LICENSE file for details. +notices: +- sources: NOTICE + text: |- + Copyright 2011-2016 Canonical Ltd. + + 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. diff --git a/.licenses/arduino-app-cli/go/golang.org/x/crypto/argon2.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/crypto/argon2.dep.yml index e8fa418d..072edfe9 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/crypto/argon2.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/crypto/argon2.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/crypto/argon2 -version: v0.41.0 +version: v0.42.0 type: go summary: Package argon2 implements the key derivation function Argon2. homepage: https://pkg.go.dev/golang.org/x/crypto/argon2 license: bsd-3-clause licenses: -- sources: crypto@v0.41.0/LICENSE +- sources: crypto@v0.42.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: crypto@v0.41.0/PATENTS +- sources: crypto@v0.42.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/crypto/blake2b.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/crypto/blake2b.dep.yml index fb71ab94..456d8add 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/crypto/blake2b.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/crypto/blake2b.dep.yml @@ -1,13 +1,13 @@ --- name: golang.org/x/crypto/blake2b -version: v0.41.0 +version: v0.42.0 type: go summary: Package blake2b implements the BLAKE2b hash algorithm defined by RFC 7693 and the extendable output function (XOF) BLAKE2Xb. homepage: https://pkg.go.dev/golang.org/x/crypto/blake2b license: bsd-3-clause licenses: -- sources: crypto@v0.41.0/LICENSE +- sources: crypto@v0.42.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -36,7 +36,7 @@ licenses: 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. -- sources: crypto@v0.41.0/PATENTS +- sources: crypto@v0.42.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/crypto/blowfish.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/crypto/blowfish.dep.yml index fdf17269..3b016a01 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/crypto/blowfish.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/crypto/blowfish.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/crypto/blowfish -version: v0.41.0 +version: v0.42.0 type: go summary: Package blowfish implements Bruce Schneier's Blowfish encryption algorithm. homepage: https://pkg.go.dev/golang.org/x/crypto/blowfish license: bsd-3-clause licenses: -- sources: crypto@v0.41.0/LICENSE +- sources: crypto@v0.42.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: crypto@v0.41.0/PATENTS +- sources: crypto@v0.42.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/crypto/cast5.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/crypto/cast5.dep.yml index 7dd555be..662a113e 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/crypto/cast5.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/crypto/cast5.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/crypto/cast5 -version: v0.41.0 +version: v0.42.0 type: go summary: Package cast5 implements CAST5, as defined in RFC 2144. homepage: https://pkg.go.dev/golang.org/x/crypto/cast5 license: bsd-3-clause licenses: -- sources: crypto@v0.41.0/LICENSE +- sources: crypto@v0.42.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: crypto@v0.41.0/PATENTS +- sources: crypto@v0.42.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/crypto/curve25519.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/crypto/curve25519.dep.yml index 45f38c73..888f7122 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/crypto/curve25519.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/crypto/curve25519.dep.yml @@ -1,13 +1,13 @@ --- name: golang.org/x/crypto/curve25519 -version: v0.41.0 +version: v0.42.0 type: go summary: Package curve25519 provides an implementation of the X25519 function, which performs scalar multiplication on the elliptic curve known as Curve25519. homepage: https://pkg.go.dev/golang.org/x/crypto/curve25519 license: bsd-3-clause licenses: -- sources: crypto@v0.41.0/LICENSE +- sources: crypto@v0.42.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -36,7 +36,7 @@ licenses: 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. -- sources: crypto@v0.41.0/PATENTS +- sources: crypto@v0.42.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/crypto/ed25519.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/crypto/ed25519.dep.yml index 9c7f91bf..d1d50197 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/crypto/ed25519.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/crypto/ed25519.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/crypto/ed25519 -version: v0.41.0 +version: v0.42.0 type: go summary: Package ed25519 implements the Ed25519 signature algorithm. homepage: https://pkg.go.dev/golang.org/x/crypto/ed25519 license: bsd-3-clause licenses: -- sources: crypto@v0.41.0/LICENSE +- sources: crypto@v0.42.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: crypto@v0.41.0/PATENTS +- sources: crypto@v0.42.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/crypto/hkdf.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/crypto/hkdf.dep.yml index dd28cb1c..f6fbcdc3 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/crypto/hkdf.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/crypto/hkdf.dep.yml @@ -1,13 +1,13 @@ --- name: golang.org/x/crypto/hkdf -version: v0.41.0 +version: v0.42.0 type: go summary: Package hkdf implements the HMAC-based Extract-and-Expand Key Derivation Function (HKDF) as defined in RFC 5869. homepage: https://pkg.go.dev/golang.org/x/crypto/hkdf license: bsd-3-clause licenses: -- sources: crypto@v0.41.0/LICENSE +- sources: crypto@v0.42.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -36,7 +36,7 @@ licenses: 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. -- sources: crypto@v0.41.0/PATENTS +- sources: crypto@v0.42.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/crypto/nacl/sign.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/crypto/nacl/sign.dep.yml index 81627756..9c873308 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/crypto/nacl/sign.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/crypto/nacl/sign.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/crypto/nacl/sign -version: v0.41.0 +version: v0.42.0 type: go summary: Package sign signs small messages using public-key cryptography. homepage: https://pkg.go.dev/golang.org/x/crypto/nacl/sign license: bsd-3-clause licenses: -- sources: crypto@v0.41.0/LICENSE +- sources: crypto@v0.42.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: crypto@v0.41.0/PATENTS +- sources: crypto@v0.42.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/crypto/pbkdf2.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/crypto/pbkdf2.dep.yml index e7a7ffa4..b6a511d2 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/crypto/pbkdf2.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/crypto/pbkdf2.dep.yml @@ -1,13 +1,13 @@ --- name: golang.org/x/crypto/pbkdf2 -version: v0.41.0 +version: v0.42.0 type: go summary: 'Package pbkdf2 implements the key derivation function PBKDF2 as defined in RFC 2898 / PKCS #5 v2.0.' homepage: https://pkg.go.dev/golang.org/x/crypto/pbkdf2 license: bsd-3-clause licenses: -- sources: crypto@v0.41.0/LICENSE +- sources: crypto@v0.42.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -36,7 +36,7 @@ licenses: 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. -- sources: crypto@v0.41.0/PATENTS +- sources: crypto@v0.42.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/crypto/sha3.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/crypto/sha3.dep.yml index fd63cbf6..8ce8ad26 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/crypto/sha3.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/crypto/sha3.dep.yml @@ -1,13 +1,13 @@ --- name: golang.org/x/crypto/sha3 -version: v0.41.0 +version: v0.42.0 type: go summary: Package sha3 implements the SHA-3 fixed-output-length hash functions and the SHAKE variable-output-length hash functions defined by FIPS-202. homepage: https://pkg.go.dev/golang.org/x/crypto/sha3 license: bsd-3-clause licenses: -- sources: crypto@v0.41.0/LICENSE +- sources: crypto@v0.42.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -36,7 +36,7 @@ licenses: 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. -- sources: crypto@v0.41.0/PATENTS +- sources: crypto@v0.42.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/crypto/ssh.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/crypto/ssh.dep.yml index a7e12176..cc9927f1 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/crypto/ssh.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/crypto/ssh.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/crypto/ssh -version: v0.41.0 +version: v0.42.0 type: go summary: Package ssh implements an SSH client and server. homepage: https://pkg.go.dev/golang.org/x/crypto/ssh license: bsd-3-clause licenses: -- sources: crypto@v0.41.0/LICENSE +- sources: crypto@v0.42.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: crypto@v0.41.0/PATENTS +- sources: crypto@v0.42.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/crypto/ssh/agent.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/crypto/ssh/agent.dep.yml index e07b7a19..2ddbcd6c 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/crypto/ssh/agent.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/crypto/ssh/agent.dep.yml @@ -1,13 +1,13 @@ --- name: golang.org/x/crypto/ssh/agent -version: v0.41.0 +version: v0.42.0 type: go summary: Package agent implements the ssh-agent protocol, and provides both a client and a server. homepage: https://pkg.go.dev/golang.org/x/crypto/ssh/agent license: bsd-3-clause licenses: -- sources: crypto@v0.41.0/LICENSE +- sources: crypto@v0.42.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -36,7 +36,7 @@ licenses: 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. -- sources: crypto@v0.41.0/PATENTS +- sources: crypto@v0.42.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/crypto/ssh/internal/bcrypt_pbkdf.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/crypto/ssh/internal/bcrypt_pbkdf.dep.yml index ae781755..4dfb7bfb 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/crypto/ssh/internal/bcrypt_pbkdf.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/crypto/ssh/internal/bcrypt_pbkdf.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/crypto/ssh/internal/bcrypt_pbkdf -version: v0.41.0 +version: v0.42.0 type: go summary: Package bcrypt_pbkdf implements bcrypt_pbkdf(3) from OpenBSD. homepage: https://pkg.go.dev/golang.org/x/crypto/ssh/internal/bcrypt_pbkdf license: bsd-3-clause licenses: -- sources: crypto@v0.41.0/LICENSE +- sources: crypto@v0.42.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: crypto@v0.41.0/PATENTS +- sources: crypto@v0.42.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/crypto/ssh/knownhosts.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/crypto/ssh/knownhosts.dep.yml index a63d5d12..fba88c87 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/crypto/ssh/knownhosts.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/crypto/ssh/knownhosts.dep.yml @@ -1,6 +1,6 @@ --- name: golang.org/x/crypto/ssh/knownhosts -version: v0.41.0 +version: v0.42.0 type: go summary: Package knownhosts implements a parser for the OpenSSH known_hosts host key database, and provides utility functions for writing OpenSSH compliant known_hosts @@ -8,7 +8,7 @@ summary: Package knownhosts implements a parser for the OpenSSH known_hosts host homepage: https://pkg.go.dev/golang.org/x/crypto/ssh/knownhosts license: bsd-3-clause licenses: -- sources: crypto@v0.41.0/LICENSE +- sources: crypto@v0.42.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -37,7 +37,7 @@ licenses: 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. -- sources: crypto@v0.41.0/PATENTS +- sources: crypto@v0.42.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/net/context.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/net/context.dep.yml index 50e15fce..25bf6c74 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/net/context.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/net/context.dep.yml @@ -1,13 +1,13 @@ --- name: golang.org/x/net/context -version: v0.43.0 +version: v0.44.0 type: go summary: Package context defines the Context type, which carries deadlines, cancellation signals, and other request-scoped values across API boundaries and between processes. homepage: https://pkg.go.dev/golang.org/x/net/context license: bsd-3-clause licenses: -- sources: net@v0.43.0/LICENSE +- sources: net@v0.44.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -36,7 +36,7 @@ licenses: 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. -- sources: net@v0.43.0/PATENTS +- sources: net@v0.44.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/net/html.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/net/html.dep.yml index e6314ef4..beb04288 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/net/html.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/net/html.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/net/html -version: v0.43.0 +version: v0.44.0 type: go summary: Package html implements an HTML5-compliant tokenizer and parser. homepage: https://pkg.go.dev/golang.org/x/net/html license: bsd-3-clause licenses: -- sources: net@v0.43.0/LICENSE +- sources: net@v0.44.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: net@v0.43.0/PATENTS +- sources: net@v0.44.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/net/html/atom.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/net/html/atom.dep.yml index cc08fd42..aebfdd28 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/net/html/atom.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/net/html/atom.dep.yml @@ -1,6 +1,6 @@ --- name: golang.org/x/net/html/atom -version: v0.43.0 +version: v0.44.0 type: go summary: 'Package atom provides integer codes (also known as atoms) for a fixed set of frequently occurring HTML strings: tag names and attribute keys such as "p" and @@ -8,7 +8,7 @@ summary: 'Package atom provides integer codes (also known as atoms) for a fixed homepage: https://pkg.go.dev/golang.org/x/net/html/atom license: bsd-3-clause licenses: -- sources: net@v0.43.0/LICENSE +- sources: net@v0.44.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -37,7 +37,7 @@ licenses: 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. -- sources: net@v0.43.0/PATENTS +- sources: net@v0.44.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/net/http2.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/net/http2.dep.yml index 6483acc2..e7ad5a4a 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/net/http2.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/net/http2.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/net/http2 -version: v0.43.0 +version: v0.44.0 type: go summary: Package http2 implements the HTTP/2 protocol. homepage: https://pkg.go.dev/golang.org/x/net/http2 license: bsd-3-clause licenses: -- sources: net@v0.43.0/LICENSE +- sources: net@v0.44.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: net@v0.43.0/PATENTS +- sources: net@v0.44.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/net/internal/httpcommon.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/net/internal/httpcommon.dep.yml index dcd083ca..5115a1d5 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/net/internal/httpcommon.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/net/internal/httpcommon.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/net/internal/httpcommon -version: v0.43.0 +version: v0.44.0 type: go -summary: +summary: homepage: https://pkg.go.dev/golang.org/x/net/internal/httpcommon license: bsd-3-clause licenses: -- sources: net@v0.43.0/LICENSE +- sources: net@v0.44.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: net@v0.43.0/PATENTS +- sources: net@v0.44.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/net/internal/socks.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/net/internal/socks.dep.yml index 3be35aad..2e883718 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/net/internal/socks.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/net/internal/socks.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/net/internal/socks -version: v0.43.0 +version: v0.44.0 type: go summary: Package socks provides a SOCKS version 5 client implementation. homepage: https://pkg.go.dev/golang.org/x/net/internal/socks license: bsd-3-clause licenses: -- sources: net@v0.43.0/LICENSE +- sources: net@v0.44.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: net@v0.43.0/PATENTS +- sources: net@v0.44.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/net/internal/timeseries.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/net/internal/timeseries.dep.yml index 0dfd8d63..55b5b619 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/net/internal/timeseries.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/net/internal/timeseries.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/net/internal/timeseries -version: v0.43.0 +version: v0.44.0 type: go summary: Package timeseries implements a time series structure for stats collection. homepage: https://pkg.go.dev/golang.org/x/net/internal/timeseries license: bsd-3-clause licenses: -- sources: net@v0.43.0/LICENSE +- sources: net@v0.44.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: net@v0.43.0/PATENTS +- sources: net@v0.44.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/net/proxy.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/net/proxy.dep.yml index 677ad05c..553d099b 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/net/proxy.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/net/proxy.dep.yml @@ -1,13 +1,13 @@ --- name: golang.org/x/net/proxy -version: v0.43.0 +version: v0.44.0 type: go summary: Package proxy provides support for a variety of protocols to proxy network data. homepage: https://pkg.go.dev/golang.org/x/net/proxy license: bsd-3-clause licenses: -- sources: net@v0.43.0/LICENSE +- sources: net@v0.44.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -36,7 +36,7 @@ licenses: 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. -- sources: net@v0.43.0/PATENTS +- sources: net@v0.44.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/net/publicsuffix.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/net/publicsuffix.dep.yml index 2ce0f18c..e58a6ea8 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/net/publicsuffix.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/net/publicsuffix.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/net/publicsuffix -version: v0.43.0 +version: v0.44.0 type: go summary: Package publicsuffix provides a public suffix list based on data from https://publicsuffix.org/ homepage: https://pkg.go.dev/golang.org/x/net/publicsuffix license: bsd-3-clause licenses: -- sources: net@v0.43.0/LICENSE +- sources: net@v0.44.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: net@v0.43.0/PATENTS +- sources: net@v0.44.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/net/trace.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/net/trace.dep.yml index 0d21df63..bb84b6e1 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/net/trace.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/net/trace.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/net/trace -version: v0.43.0 +version: v0.44.0 type: go summary: Package trace implements tracing of requests and long-lived objects. homepage: https://pkg.go.dev/golang.org/x/net/trace license: bsd-3-clause licenses: -- sources: net@v0.43.0/LICENSE +- sources: net@v0.44.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: net@v0.43.0/PATENTS +- sources: net@v0.44.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/net/websocket.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/net/websocket.dep.yml index 255bac79..210970fc 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/net/websocket.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/net/websocket.dep.yml @@ -1,13 +1,13 @@ --- name: golang.org/x/net/websocket -version: v0.43.0 +version: v0.44.0 type: go summary: Package websocket implements a client and server for the WebSocket protocol as specified in RFC 6455. homepage: https://pkg.go.dev/golang.org/x/net/websocket license: bsd-3-clause licenses: -- sources: net@v0.43.0/LICENSE +- sources: net@v0.44.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -36,7 +36,7 @@ licenses: 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. -- sources: net@v0.43.0/PATENTS +- sources: net@v0.44.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/sys/execabs.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/sys/execabs.dep.yml index 0f591ac2..a51da193 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/sys/execabs.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/sys/execabs.dep.yml @@ -1,13 +1,13 @@ --- name: golang.org/x/sys/execabs -version: v0.36.0 +version: v0.38.0 type: go summary: Package execabs is a drop-in replacement for os/exec that requires PATH lookups to find absolute paths. homepage: https://pkg.go.dev/golang.org/x/sys/execabs license: bsd-3-clause licenses: -- sources: sys@v0.36.0/LICENSE +- sources: sys@v0.38.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -36,7 +36,7 @@ licenses: 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. -- sources: sys@v0.36.0/PATENTS +- sources: sys@v0.38.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/sys/unix.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/sys/unix.dep.yml index 3a18e0de..0260ecb7 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/sys/unix.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/sys/unix.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/sys/unix -version: v0.36.0 +version: v0.38.0 type: go summary: Package unix contains an interface to the low-level operating system primitives. homepage: https://pkg.go.dev/golang.org/x/sys/unix license: bsd-3-clause licenses: -- sources: sys@v0.36.0/LICENSE +- sources: sys@v0.38.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: sys@v0.36.0/PATENTS +- sources: sys@v0.38.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/term.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/term.dep.yml index 76cd0cd5..5d2bbfa0 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/term.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/term.dep.yml @@ -1,6 +1,6 @@ --- name: golang.org/x/term -version: v0.35.0 +version: v0.36.0 type: go summary: Package term provides support functions for dealing with terminals, as commonly found on UNIX systems. diff --git a/.licenses/arduino-app-cli/go/golang.org/x/text/cases.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/text/cases.dep.yml index 001c9b82..348e6716 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/text/cases.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/text/cases.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/text/cases -version: v0.29.0 +version: v0.30.0 type: go summary: Package cases provides general and language-specific case mappers. homepage: https://pkg.go.dev/golang.org/x/text/cases license: bsd-3-clause licenses: -- sources: text@v0.29.0/LICENSE +- sources: text@v0.30.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: text@v0.29.0/PATENTS +- sources: text@v0.30.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/text/encoding.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/text/encoding.dep.yml index fbc7fb1f..8249f3e5 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/text/encoding.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/text/encoding.dep.yml @@ -1,13 +1,13 @@ --- name: golang.org/x/text/encoding -version: v0.29.0 +version: v0.30.0 type: go summary: Package encoding defines an interface for character encodings, such as Shift JIS and Windows 1252, that can convert to and from UTF-8. homepage: https://pkg.go.dev/golang.org/x/text/encoding license: bsd-3-clause licenses: -- sources: text@v0.29.0/LICENSE +- sources: text@v0.30.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -36,7 +36,7 @@ licenses: 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. -- sources: text@v0.29.0/PATENTS +- sources: text@v0.30.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/text/encoding/internal.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/text/encoding/internal.dep.yml index f725c8b0..0d4caa37 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/text/encoding/internal.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/text/encoding/internal.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/text/encoding/internal -version: v0.29.0 +version: v0.30.0 type: go summary: Package internal contains code that is shared among encoding implementations. homepage: https://pkg.go.dev/golang.org/x/text/encoding/internal license: bsd-3-clause licenses: -- sources: text@v0.29.0/LICENSE +- sources: text@v0.30.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: text@v0.29.0/PATENTS +- sources: text@v0.30.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/text/encoding/internal/identifier.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/text/encoding/internal/identifier.dep.yml index 31268a4d..8ea6ea42 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/text/encoding/internal/identifier.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/text/encoding/internal/identifier.dep.yml @@ -1,6 +1,6 @@ --- name: golang.org/x/text/encoding/internal/identifier -version: v0.29.0 +version: v0.30.0 type: go summary: Package identifier defines the contract between implementations of Encoding and Index by defining identifiers that uniquely identify standardized coded character @@ -10,7 +10,7 @@ summary: Package identifier defines the contract between implementations of Enco homepage: https://pkg.go.dev/golang.org/x/text/encoding/internal/identifier license: bsd-3-clause licenses: -- sources: text@v0.29.0/LICENSE +- sources: text@v0.30.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -39,7 +39,7 @@ licenses: 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. -- sources: text@v0.29.0/PATENTS +- sources: text@v0.30.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/text/encoding/unicode.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/text/encoding/unicode.dep.yml index c1e46da0..b69256e5 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/text/encoding/unicode.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/text/encoding/unicode.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/text/encoding/unicode -version: v0.29.0 +version: v0.30.0 type: go summary: Package unicode provides Unicode encodings such as UTF-16. homepage: https://pkg.go.dev/golang.org/x/text/encoding/unicode license: bsd-3-clause licenses: -- sources: text@v0.29.0/LICENSE +- sources: text@v0.30.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: text@v0.29.0/PATENTS +- sources: text@v0.30.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/text/feature/plural.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/text/feature/plural.dep.yml index 2c80aa70..65807e81 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/text/feature/plural.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/text/feature/plural.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/text/feature/plural -version: v0.29.0 +version: v0.30.0 type: go summary: Package plural provides utilities for handling linguistic plurals in text. homepage: https://pkg.go.dev/golang.org/x/text/feature/plural license: bsd-3-clause licenses: -- sources: text@v0.29.0/LICENSE +- sources: text@v0.30.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: text@v0.29.0/PATENTS +- sources: text@v0.30.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/text/internal.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/text/internal.dep.yml index d564e15b..63bb2b30 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/text/internal.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/text/internal.dep.yml @@ -1,13 +1,13 @@ --- name: golang.org/x/text/internal -version: v0.29.0 +version: v0.30.0 type: go summary: Package internal contains non-exported functionality that are used by packages in the text repository. homepage: https://pkg.go.dev/golang.org/x/text/internal license: bsd-3-clause licenses: -- sources: text@v0.29.0/LICENSE +- sources: text@v0.30.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -36,7 +36,7 @@ licenses: 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. -- sources: text@v0.29.0/PATENTS +- sources: text@v0.30.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/text/internal/catmsg.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/text/internal/catmsg.dep.yml index 0398c1f5..462e9f86 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/text/internal/catmsg.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/text/internal/catmsg.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/text/internal/catmsg -version: v0.29.0 +version: v0.30.0 type: go summary: Package catmsg contains support types for package x/text/message/catalog. homepage: https://pkg.go.dev/golang.org/x/text/internal/catmsg license: bsd-3-clause licenses: -- sources: text@v0.29.0/LICENSE +- sources: text@v0.30.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: text@v0.29.0/PATENTS +- sources: text@v0.30.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/text/internal/format.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/text/internal/format.dep.yml index da531374..31c28899 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/text/internal/format.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/text/internal/format.dep.yml @@ -1,13 +1,13 @@ --- name: golang.org/x/text/internal/format -version: v0.29.0 +version: v0.30.0 type: go summary: Package format contains types for defining language-specific formatting of values. homepage: https://pkg.go.dev/golang.org/x/text/internal/format license: bsd-3-clause licenses: -- sources: text@v0.29.0/LICENSE +- sources: text@v0.30.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -36,7 +36,7 @@ licenses: 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. -- sources: text@v0.29.0/PATENTS +- sources: text@v0.30.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/text/internal/language.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/text/internal/language.dep.yml index be63bed2..f6c8fa49 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/text/internal/language.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/text/internal/language.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/text/internal/language -version: v0.29.0 +version: v0.30.0 type: go -summary: +summary: homepage: https://pkg.go.dev/golang.org/x/text/internal/language license: bsd-3-clause licenses: -- sources: text@v0.29.0/LICENSE +- sources: text@v0.30.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: text@v0.29.0/PATENTS +- sources: text@v0.30.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/text/internal/language/compact.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/text/internal/language/compact.dep.yml index 61b318db..4cc1eb00 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/text/internal/language/compact.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/text/internal/language/compact.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/text/internal/language/compact -version: v0.29.0 +version: v0.30.0 type: go summary: Package compact defines a compact representation of language tags. homepage: https://pkg.go.dev/golang.org/x/text/internal/language/compact license: bsd-3-clause licenses: -- sources: text@v0.29.0/LICENSE +- sources: text@v0.30.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: text@v0.29.0/PATENTS +- sources: text@v0.30.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/text/internal/number.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/text/internal/number.dep.yml index 044fb229..24338c30 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/text/internal/number.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/text/internal/number.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/text/internal/number -version: v0.29.0 +version: v0.30.0 type: go summary: Package number contains tools and data for formatting numbers. homepage: https://pkg.go.dev/golang.org/x/text/internal/number license: bsd-3-clause licenses: -- sources: text@v0.29.0/LICENSE +- sources: text@v0.30.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: text@v0.29.0/PATENTS +- sources: text@v0.30.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/text/internal/stringset.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/text/internal/stringset.dep.yml index 64d3e02e..cf403f81 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/text/internal/stringset.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/text/internal/stringset.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/text/internal/stringset -version: v0.29.0 +version: v0.30.0 type: go summary: Package stringset provides a way to represent a collection of strings compactly. homepage: https://pkg.go.dev/golang.org/x/text/internal/stringset license: bsd-3-clause licenses: -- sources: text@v0.29.0/LICENSE +- sources: text@v0.30.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: text@v0.29.0/PATENTS +- sources: text@v0.30.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/text/internal/tag.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/text/internal/tag.dep.yml index 16dc8199..7b4007bb 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/text/internal/tag.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/text/internal/tag.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/text/internal/tag -version: v0.29.0 +version: v0.30.0 type: go summary: Package tag contains functionality handling tags and related data. homepage: https://pkg.go.dev/golang.org/x/text/internal/tag license: bsd-3-clause licenses: -- sources: text@v0.29.0/LICENSE +- sources: text@v0.30.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: text@v0.29.0/PATENTS +- sources: text@v0.30.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/text/internal/utf8internal.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/text/internal/utf8internal.dep.yml index 08fb4007..0762300d 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/text/internal/utf8internal.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/text/internal/utf8internal.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/text/internal/utf8internal -version: v0.29.0 +version: v0.30.0 type: go summary: Package utf8internal contains low-level utf8-related constants, tables, etc. homepage: https://pkg.go.dev/golang.org/x/text/internal/utf8internal license: bsd-3-clause licenses: -- sources: text@v0.29.0/LICENSE +- sources: text@v0.30.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: text@v0.29.0/PATENTS +- sources: text@v0.30.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/text/language.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/text/language.dep.yml index bba4ca53..016f175d 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/text/language.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/text/language.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/text/language -version: v0.29.0 +version: v0.30.0 type: go summary: Package language implements BCP 47 language tags and related functionality. homepage: https://pkg.go.dev/golang.org/x/text/language license: bsd-3-clause licenses: -- sources: text@v0.29.0/LICENSE +- sources: text@v0.30.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: text@v0.29.0/PATENTS +- sources: text@v0.30.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/text/message.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/text/message.dep.yml index a01f5a76..09bb5dfa 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/text/message.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/text/message.dep.yml @@ -1,13 +1,13 @@ --- name: golang.org/x/text/message -version: v0.29.0 +version: v0.30.0 type: go summary: Package message implements formatted I/O for localized strings with functions analogous to the fmt's print functions. homepage: https://pkg.go.dev/golang.org/x/text/message license: bsd-3-clause licenses: -- sources: text@v0.29.0/LICENSE +- sources: text@v0.30.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -36,7 +36,7 @@ licenses: 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. -- sources: text@v0.29.0/PATENTS +- sources: text@v0.30.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/text/message/catalog.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/text/message/catalog.dep.yml index 6de74825..8fc616ba 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/text/message/catalog.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/text/message/catalog.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/text/message/catalog -version: v0.29.0 +version: v0.30.0 type: go summary: Package catalog defines collections of translated format strings. homepage: https://pkg.go.dev/golang.org/x/text/message/catalog license: bsd-3-clause licenses: -- sources: text@v0.29.0/LICENSE +- sources: text@v0.30.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: text@v0.29.0/PATENTS +- sources: text@v0.30.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/text/runes.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/text/runes.dep.yml index bd152728..91e5c15c 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/text/runes.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/text/runes.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/text/runes -version: v0.29.0 +version: v0.30.0 type: go summary: Package runes provide transforms for UTF-8 encoded text. homepage: https://pkg.go.dev/golang.org/x/text/runes license: bsd-3-clause licenses: -- sources: text@v0.29.0/LICENSE +- sources: text@v0.30.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: text@v0.29.0/PATENTS +- sources: text@v0.30.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/golang.org/x/text/width.dep.yml b/.licenses/arduino-app-cli/go/golang.org/x/text/width.dep.yml index e8532e34..4e0235c8 100644 --- a/.licenses/arduino-app-cli/go/golang.org/x/text/width.dep.yml +++ b/.licenses/arduino-app-cli/go/golang.org/x/text/width.dep.yml @@ -1,12 +1,12 @@ --- name: golang.org/x/text/width -version: v0.29.0 +version: v0.30.0 type: go summary: Package width provides functionality for handling different widths in text. homepage: https://pkg.go.dev/golang.org/x/text/width license: bsd-3-clause licenses: -- sources: text@v0.29.0/LICENSE +- sources: text@v0.30.0/LICENSE text: | Copyright 2009 The Go Authors. @@ -35,7 +35,7 @@ licenses: 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. -- sources: text@v0.29.0/PATENTS +- sources: text@v0.30.0/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/genproto/googleapis/api/httpbody.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/genproto/googleapis/api/httpbody.dep.yml index ffce2f4b..d8b07c61 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/genproto/googleapis/api/httpbody.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/genproto/googleapis/api/httpbody.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/genproto/googleapis/api/httpbody -version: v0.0.0-20250707201910-8d1bb00bc6a7 +version: v0.0.0-20250804133106-a7a43d27e69b type: go summary: homepage: https://pkg.go.dev/google.golang.org/genproto/googleapis/api/httpbody license: apache-2.0 licenses: -- sources: api@v0.0.0-20250707201910-8d1bb00bc6a7/LICENSE +- sources: api@v0.0.0-20250804133106-a7a43d27e69b/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/genproto/googleapis/rpc/errdetails.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/genproto/googleapis/rpc/errdetails.dep.yml index 0b4f98b7..fd656382 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/genproto/googleapis/rpc/errdetails.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/genproto/googleapis/rpc/errdetails.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/genproto/googleapis/rpc/errdetails -version: v0.0.0-20250707201910-8d1bb00bc6a7 +version: v0.0.0-20250804133106-a7a43d27e69b type: go summary: homepage: https://pkg.go.dev/google.golang.org/genproto/googleapis/rpc/errdetails license: apache-2.0 licenses: -- sources: rpc@v0.0.0-20250707201910-8d1bb00bc6a7/LICENSE +- sources: rpc@v0.0.0-20250804133106-a7a43d27e69b/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/genproto/googleapis/rpc/status.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/genproto/googleapis/rpc/status.dep.yml index 3ae1759a..0fc11ffd 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/genproto/googleapis/rpc/status.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/genproto/googleapis/rpc/status.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/genproto/googleapis/rpc/status -version: v0.0.0-20250707201910-8d1bb00bc6a7 +version: v0.0.0-20250804133106-a7a43d27e69b type: go summary: homepage: https://pkg.go.dev/google.golang.org/genproto/googleapis/rpc/status license: apache-2.0 licenses: -- sources: rpc@v0.0.0-20250707201910-8d1bb00bc6a7/LICENSE +- sources: rpc@v0.0.0-20250804133106-a7a43d27e69b/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc.dep.yml index 384a1900..11cb2171 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc.dep.yml @@ -1,6 +1,6 @@ --- name: google.golang.org/grpc -version: v1.75.1 +version: v1.76.0 type: go summary: Package grpc implements an RPC system called gRPC. homepage: https://pkg.go.dev/google.golang.org/grpc diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/attributes.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/attributes.dep.yml index 97a9cca0..50d22caf 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/attributes.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/attributes.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/grpc/attributes -version: v1.75.1 +version: v1.76.0 type: go summary: Package attributes defines a generic key/value store used in various gRPC components. homepage: https://pkg.go.dev/google.golang.org/grpc/attributes license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/backoff.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/backoff.dep.yml index 403ee3ba..354952ac 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/backoff.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/backoff.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/backoff -version: v1.75.1 +version: v1.76.0 type: go summary: Package backoff provides configuration options for backoff. homepage: https://pkg.go.dev/google.golang.org/grpc/backoff license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer.dep.yml index e987c186..7605b9b0 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/balancer -version: v1.75.1 +version: v1.76.0 type: go summary: Package balancer defines APIs for load balancing in gRPC. homepage: https://pkg.go.dev/google.golang.org/grpc/balancer license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/base.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/base.dep.yml index 71c90b2f..0fd5c62c 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/base.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/base.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/grpc/balancer/base -version: v1.75.1 +version: v1.76.0 type: go summary: Package base defines a balancer base that can be used to build balancers with different picking algorithms. homepage: https://pkg.go.dev/google.golang.org/grpc/balancer/base license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/endpointsharding.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/endpointsharding.dep.yml index 41053494..d720933d 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/endpointsharding.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/endpointsharding.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/grpc/balancer/endpointsharding -version: v1.75.1 +version: v1.76.0 type: go summary: Package endpointsharding implements a load balancing policy that manages homogeneous child policies each owning a single endpoint. homepage: https://pkg.go.dev/google.golang.org/grpc/balancer/endpointsharding license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/grpclb/state.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/grpclb/state.dep.yml index efbfb732..ec37188e 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/grpclb/state.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/grpclb/state.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/grpc/balancer/grpclb/state -version: v1.75.1 +version: v1.76.0 type: go summary: Package state declares grpclb types to be set by resolvers wishing to pass information to grpclb via resolver.State Attributes. homepage: https://pkg.go.dev/google.golang.org/grpc/balancer/grpclb/state license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/pickfirst.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/pickfirst.dep.yml index 9cb1f1b8..f946e49a 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/pickfirst.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/pickfirst.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/balancer/pickfirst -version: v1.75.1 +version: v1.76.0 type: go summary: Package pickfirst contains the pick_first load balancing policy. homepage: https://pkg.go.dev/google.golang.org/grpc/balancer/pickfirst license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/pickfirst/internal.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/pickfirst/internal.dep.yml index 421ad3e8..dcb2aa97 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/pickfirst/internal.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/pickfirst/internal.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/balancer/pickfirst/internal -version: v1.75.1 +version: v1.76.0 type: go summary: Package internal contains code internal to the pickfirst package. homepage: https://pkg.go.dev/google.golang.org/grpc/balancer/pickfirst/internal license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/pickfirst/pickfirstleaf.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/pickfirst/pickfirstleaf.dep.yml index c81968ec..78e49ea0 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/pickfirst/pickfirstleaf.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/pickfirst/pickfirstleaf.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/grpc/balancer/pickfirst/pickfirstleaf -version: v1.75.1 +version: v1.76.0 type: go summary: Package pickfirstleaf contains the pick_first load balancing policy which will be the universal leaf policy after dualstack changes are implemented. homepage: https://pkg.go.dev/google.golang.org/grpc/balancer/pickfirst/pickfirstleaf license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/roundrobin.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/roundrobin.dep.yml index 665c756c..cc3e3cbf 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/roundrobin.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/balancer/roundrobin.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/balancer/roundrobin -version: v1.75.1 +version: v1.76.0 type: go summary: Package roundrobin defines a roundrobin balancer. homepage: https://pkg.go.dev/google.golang.org/grpc/balancer/roundrobin license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/binarylog/grpc_binarylog_v1.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/binarylog/grpc_binarylog_v1.dep.yml index 26694709..ce9d0ba2 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/binarylog/grpc_binarylog_v1.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/binarylog/grpc_binarylog_v1.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/binarylog/grpc_binarylog_v1 -version: v1.75.1 +version: v1.76.0 type: go summary: homepage: https://pkg.go.dev/google.golang.org/grpc/binarylog/grpc_binarylog_v1 license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/channelz.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/channelz.dep.yml index 9578d381..7dffb986 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/channelz.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/channelz.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/grpc/channelz -version: v1.75.1 +version: v1.76.0 type: go summary: Package channelz exports internals of the channelz implementation as required by other gRPC packages. homepage: https://pkg.go.dev/google.golang.org/grpc/channelz license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/codes.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/codes.dep.yml index 8caec5e6..765b8b90 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/codes.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/codes.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/codes -version: v1.75.1 +version: v1.76.0 type: go summary: Package codes defines the canonical error codes used by gRPC. homepage: https://pkg.go.dev/google.golang.org/grpc/codes license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/connectivity.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/connectivity.dep.yml index f48b6ef9..98dfec14 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/connectivity.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/connectivity.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/connectivity -version: v1.75.1 +version: v1.76.0 type: go summary: Package connectivity defines connectivity semantics. homepage: https://pkg.go.dev/google.golang.org/grpc/connectivity license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/credentials.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/credentials.dep.yml index 0d329fb5..041c04c1 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/credentials.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/credentials.dep.yml @@ -1,6 +1,6 @@ --- name: google.golang.org/grpc/credentials -version: v1.75.1 +version: v1.76.0 type: go summary: Package credentials implements various credentials supported by gRPC library, which encapsulate all the state needed by a client to authenticate with a server @@ -9,7 +9,7 @@ summary: Package credentials implements various credentials supported by gRPC li homepage: https://pkg.go.dev/google.golang.org/grpc/credentials license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/credentials/insecure.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/credentials/insecure.dep.yml index 082be313..0c34d3f0 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/credentials/insecure.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/credentials/insecure.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/grpc/credentials/insecure -version: v1.75.1 +version: v1.76.0 type: go summary: Package insecure provides an implementation of the credentials.TransportCredentials interface which disables transport security. homepage: https://pkg.go.dev/google.golang.org/grpc/credentials/insecure license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/encoding.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/encoding.dep.yml index 2377f328..43a51276 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/encoding.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/encoding.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/grpc/encoding -version: v1.75.1 +version: v1.76.0 type: go summary: Package encoding defines the interface for the compressor and codec, and functions to register and retrieve compressors and codecs. homepage: https://pkg.go.dev/google.golang.org/grpc/encoding license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/encoding/gzip.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/encoding/gzip.dep.yml index 660b4137..e33678fc 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/encoding/gzip.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/encoding/gzip.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/encoding/gzip -version: v1.75.1 +version: v1.76.0 type: go summary: Package gzip implements and registers the gzip compressor during the initialization. homepage: https://pkg.go.dev/google.golang.org/grpc/encoding/gzip license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/encoding/proto.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/encoding/proto.dep.yml index 7e094b1c..109bd1e6 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/encoding/proto.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/encoding/proto.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/encoding/proto -version: v1.75.1 +version: v1.76.0 type: go summary: Package proto defines the protobuf codec. homepage: https://pkg.go.dev/google.golang.org/grpc/encoding/proto license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/experimental/stats.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/experimental/stats.dep.yml index 80bdb9c0..f814fda9 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/experimental/stats.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/experimental/stats.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/experimental/stats -version: v1.75.1 +version: v1.76.0 type: go summary: Package stats contains experimental metrics/stats API's. homepage: https://pkg.go.dev/google.golang.org/grpc/experimental/stats license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/grpclog.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/grpclog.dep.yml index dab16c58..4e3a290c 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/grpclog.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/grpclog.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/grpclog -version: v1.75.1 +version: v1.76.0 type: go summary: Package grpclog defines logging for grpc. homepage: https://pkg.go.dev/google.golang.org/grpc/grpclog license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/grpclog/internal.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/grpclog/internal.dep.yml index 0815340e..6ae157a2 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/grpclog/internal.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/grpclog/internal.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/grpclog/internal -version: v1.75.1 +version: v1.76.0 type: go summary: Package internal contains functionality internal to the grpclog package. homepage: https://pkg.go.dev/google.golang.org/grpc/grpclog/internal license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/health.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/health.dep.yml index c59f6c9d..15c2c63c 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/health.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/health.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/grpc/health -version: v1.75.1 +version: v1.76.0 type: go summary: Package health provides a service that exposes server's health and it must be imported to enable support for client-side health checks. homepage: https://pkg.go.dev/google.golang.org/grpc/health license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/health/grpc_health_v1.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/health/grpc_health_v1.dep.yml index 20144751..d3d4d57f 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/health/grpc_health_v1.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/health/grpc_health_v1.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/health/grpc_health_v1 -version: v1.75.1 +version: v1.76.0 type: go summary: homepage: https://pkg.go.dev/google.golang.org/grpc/health/grpc_health_v1 license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal.dep.yml index 81a0006d..c1a0b58a 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/grpc/internal -version: v1.75.1 +version: v1.76.0 type: go summary: Package internal contains gRPC-internal code, to avoid polluting the godoc of the top-level grpc package. homepage: https://pkg.go.dev/google.golang.org/grpc/internal license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/backoff.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/backoff.dep.yml index ee9228ff..a12bab6f 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/backoff.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/backoff.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/internal/backoff -version: v1.75.1 +version: v1.76.0 type: go summary: Package backoff implement the backoff strategy for gRPC. homepage: https://pkg.go.dev/google.golang.org/grpc/internal/backoff license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/balancer/gracefulswitch.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/balancer/gracefulswitch.dep.yml index fba608a6..d8360503 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/balancer/gracefulswitch.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/balancer/gracefulswitch.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/internal/balancer/gracefulswitch -version: v1.75.1 +version: v1.76.0 type: go summary: Package gracefulswitch implements a graceful switch load balancer. homepage: https://pkg.go.dev/google.golang.org/grpc/internal/balancer/gracefulswitch license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/balancerload.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/balancerload.dep.yml index f2493287..2db03a49 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/balancerload.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/balancerload.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/internal/balancerload -version: v1.75.1 +version: v1.76.0 type: go summary: Package balancerload defines APIs to parse server loads in trailers. homepage: https://pkg.go.dev/google.golang.org/grpc/internal/balancerload license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/binarylog.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/binarylog.dep.yml index cdcf4fcc..12221ea1 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/binarylog.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/binarylog.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/internal/binarylog -version: v1.75.1 +version: v1.76.0 type: go summary: Package binarylog implementation binary logging as defined in https://github.com/grpc/proposal/blob/master/A16-binary-logging.md. homepage: https://pkg.go.dev/google.golang.org/grpc/internal/binarylog license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/buffer.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/buffer.dep.yml index 2495b47c..f9f71dd1 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/buffer.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/buffer.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/internal/buffer -version: v1.75.1 +version: v1.76.0 type: go summary: Package buffer provides an implementation of an unbounded buffer. homepage: https://pkg.go.dev/google.golang.org/grpc/internal/buffer license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/channelz.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/channelz.dep.yml index 2affa07b..84798ebf 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/channelz.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/channelz.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/grpc/internal/channelz -version: v1.75.1 +version: v1.76.0 type: go summary: Package channelz defines internal APIs for enabling channelz service, entry registration/deletion, and accessing channelz data. homepage: https://pkg.go.dev/google.golang.org/grpc/internal/channelz license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/credentials.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/credentials.dep.yml index c0d2ccac..65249a8a 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/credentials.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/credentials.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/internal/credentials -version: v1.75.1 +version: v1.76.0 type: go summary: Package credentials defines APIs for parsing SPIFFE ID. homepage: https://pkg.go.dev/google.golang.org/grpc/internal/credentials license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/envconfig.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/envconfig.dep.yml index c215da2e..a332bc53 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/envconfig.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/envconfig.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/internal/envconfig -version: v1.75.1 +version: v1.76.0 type: go summary: Package envconfig contains grpc settings configured by environment variables. homepage: https://pkg.go.dev/google.golang.org/grpc/internal/envconfig license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/grpclog.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/grpclog.dep.yml index a2079323..60ca1990 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/grpclog.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/grpclog.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/grpc/internal/grpclog -version: v1.75.1 +version: v1.76.0 type: go summary: Package grpclog provides logging functionality for internal gRPC packages, outside of the functionality provided by the external `grpclog` package. homepage: https://pkg.go.dev/google.golang.org/grpc/internal/grpclog license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/grpcsync.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/grpcsync.dep.yml index 4951758f..9a12781b 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/grpcsync.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/grpcsync.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/grpc/internal/grpcsync -version: v1.75.1 +version: v1.76.0 type: go summary: Package grpcsync implements additional synchronization primitives built upon the sync package. homepage: https://pkg.go.dev/google.golang.org/grpc/internal/grpcsync license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/grpcutil.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/grpcutil.dep.yml index 7abc9ab1..cb88a16f 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/grpcutil.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/grpcutil.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/internal/grpcutil -version: v1.75.1 +version: v1.76.0 type: go summary: Package grpcutil provides utility functions used across the gRPC codebase. homepage: https://pkg.go.dev/google.golang.org/grpc/internal/grpcutil license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/idle.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/idle.dep.yml index 1aabbad1..21b5dd3c 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/idle.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/idle.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/grpc/internal/idle -version: v1.75.1 +version: v1.76.0 type: go summary: Package idle contains a component for managing idleness (entering and exiting) based on RPC activity. homepage: https://pkg.go.dev/google.golang.org/grpc/internal/idle license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/metadata.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/metadata.dep.yml index 40b19783..cd55580a 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/metadata.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/metadata.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/internal/metadata -version: v1.75.1 +version: v1.76.0 type: go summary: Package metadata contains functions to set and get metadata from addresses. homepage: https://pkg.go.dev/google.golang.org/grpc/internal/metadata license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/pretty.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/pretty.dep.yml index f3b480d3..d0cbafa6 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/pretty.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/pretty.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/internal/pretty -version: v1.75.1 +version: v1.76.0 type: go summary: Package pretty defines helper functions to pretty-print structs for logging. homepage: https://pkg.go.dev/google.golang.org/grpc/internal/pretty license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/proxyattributes.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/proxyattributes.dep.yml index a6e3f782..db0b4d18 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/proxyattributes.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/proxyattributes.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/grpc/internal/proxyattributes -version: v1.75.1 +version: v1.76.0 type: go summary: Package proxyattributes contains functions for getting and setting proxy attributes like the CONNECT address and user info. homepage: https://pkg.go.dev/google.golang.org/grpc/internal/proxyattributes license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/resolver.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/resolver.dep.yml index 2c53a536..0e6c780f 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/resolver.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/resolver.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/internal/resolver -version: v1.75.1 +version: v1.76.0 type: go summary: Package resolver provides internal resolver-related functionality. homepage: https://pkg.go.dev/google.golang.org/grpc/internal/resolver license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/resolver/delegatingresolver.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/resolver/delegatingresolver.dep.yml index 5402eb16..eeb5e1ff 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/resolver/delegatingresolver.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/resolver/delegatingresolver.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/grpc/internal/resolver/delegatingresolver -version: v1.75.1 +version: v1.76.0 type: go summary: Package delegatingresolver implements a resolver capable of resolving both target URIs and proxy addresses. homepage: https://pkg.go.dev/google.golang.org/grpc/internal/resolver/delegatingresolver license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/resolver/dns.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/resolver/dns.dep.yml index d1232acc..98cda732 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/resolver/dns.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/resolver/dns.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/grpc/internal/resolver/dns -version: v1.75.1 +version: v1.76.0 type: go summary: Package dns implements a dns resolver to be installed as the default resolver in grpc. homepage: https://pkg.go.dev/google.golang.org/grpc/internal/resolver/dns license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/resolver/dns/internal.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/resolver/dns/internal.dep.yml index 3990f4b0..a91c16e4 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/resolver/dns/internal.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/resolver/dns/internal.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/internal/resolver/dns/internal -version: v1.75.1 +version: v1.76.0 type: go summary: Package internal contains functionality internal to the dns resolver package. homepage: https://pkg.go.dev/google.golang.org/grpc/internal/resolver/dns/internal license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/resolver/passthrough.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/resolver/passthrough.dep.yml index 0ca925d6..720da97b 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/resolver/passthrough.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/resolver/passthrough.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/internal/resolver/passthrough -version: v1.75.1 +version: v1.76.0 type: go summary: Package passthrough implements a pass-through resolver. homepage: https://pkg.go.dev/google.golang.org/grpc/internal/resolver/passthrough license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/resolver/unix.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/resolver/unix.dep.yml index 88c8fe98..3636a2b0 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/resolver/unix.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/resolver/unix.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/internal/resolver/unix -version: v1.75.1 +version: v1.76.0 type: go summary: Package unix implements a resolver for unix targets. homepage: https://pkg.go.dev/google.golang.org/grpc/internal/resolver/unix license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/serviceconfig.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/serviceconfig.dep.yml index eae132b6..9a11cf53 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/serviceconfig.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/serviceconfig.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/internal/serviceconfig -version: v1.75.1 +version: v1.76.0 type: go summary: Package serviceconfig contains utility functions to parse service config. homepage: https://pkg.go.dev/google.golang.org/grpc/internal/serviceconfig license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/stats.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/stats.dep.yml index f98ec289..467752bc 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/stats.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/stats.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/internal/stats -version: v1.75.1 +version: v1.76.0 type: go summary: Package stats provides internal stats related functionality. homepage: https://pkg.go.dev/google.golang.org/grpc/internal/stats license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/status.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/status.dep.yml index 09fd6955..2e08b773 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/status.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/status.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/internal/status -version: v1.75.1 +version: v1.76.0 type: go summary: Package status implements errors returned by gRPC. homepage: https://pkg.go.dev/google.golang.org/grpc/internal/status license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/syscall.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/syscall.dep.yml index 5ebdb8d3..3a9c4c82 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/syscall.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/syscall.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/grpc/internal/syscall -version: v1.75.1 +version: v1.76.0 type: go summary: Package syscall provides functionalities that grpc uses to get low-level operating system stats/info. homepage: https://pkg.go.dev/google.golang.org/grpc/internal/syscall license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/transport.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/transport.dep.yml index ac824907..23447170 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/transport.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/transport.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/grpc/internal/transport -version: v1.75.1 +version: v1.76.0 type: go summary: Package transport defines and implements message oriented communication channel to complete various transactions (e.g., an RPC). homepage: https://pkg.go.dev/google.golang.org/grpc/internal/transport license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/transport/networktype.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/transport/networktype.dep.yml index cdf31e10..2e7fc4ef 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/transport/networktype.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/internal/transport/networktype.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/internal/transport/networktype -version: v1.75.1 +version: v1.76.0 type: go summary: Package networktype declares the network type to be used in the default dialer. homepage: https://pkg.go.dev/google.golang.org/grpc/internal/transport/networktype license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/keepalive.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/keepalive.dep.yml index c64789c6..7872d76c 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/keepalive.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/keepalive.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/keepalive -version: v1.75.1 +version: v1.76.0 type: go summary: Package keepalive defines configurable parameters for point-to-point healthcheck. homepage: https://pkg.go.dev/google.golang.org/grpc/keepalive license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/mem.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/mem.dep.yml index 8313a843..e144d605 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/mem.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/mem.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/grpc/mem -version: v1.75.1 +version: v1.76.0 type: go summary: Package mem provides utilities that facilitate memory reuse in byte slices that are used as buffers. homepage: https://pkg.go.dev/google.golang.org/grpc/mem license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/metadata.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/metadata.dep.yml index ac50ad82..62ac7d93 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/metadata.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/metadata.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/metadata -version: v1.75.1 +version: v1.76.0 type: go summary: Package metadata define the structure of the metadata supported by gRPC library. homepage: https://pkg.go.dev/google.golang.org/grpc/metadata license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/peer.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/peer.dep.yml index e0d765c3..d05646d9 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/peer.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/peer.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/grpc/peer -version: v1.75.1 +version: v1.76.0 type: go summary: Package peer defines various peer information associated with RPCs and corresponding utils. homepage: https://pkg.go.dev/google.golang.org/grpc/peer license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/resolver.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/resolver.dep.yml index 112b2bf4..ad1ced52 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/resolver.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/resolver.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/resolver -version: v1.75.1 +version: v1.76.0 type: go summary: Package resolver defines APIs for name resolution in gRPC. homepage: https://pkg.go.dev/google.golang.org/grpc/resolver license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/resolver/dns.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/resolver/dns.dep.yml index 854d114d..4e56d025 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/resolver/dns.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/resolver/dns.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/grpc/resolver/dns -version: v1.75.1 +version: v1.76.0 type: go summary: Package dns implements a dns resolver to be installed as the default resolver in grpc. homepage: https://pkg.go.dev/google.golang.org/grpc/resolver/dns license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/serviceconfig.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/serviceconfig.dep.yml index a6998c96..9d3593d4 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/serviceconfig.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/serviceconfig.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/grpc/serviceconfig -version: v1.75.1 +version: v1.76.0 type: go summary: Package serviceconfig defines types and methods for operating on gRPC service configs. homepage: https://pkg.go.dev/google.golang.org/grpc/serviceconfig license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/stats.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/stats.dep.yml index 3fc60594..cb2ed7cd 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/stats.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/stats.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/stats -version: v1.75.1 +version: v1.76.0 type: go summary: Package stats is for collecting and reporting various network and RPC stats. homepage: https://pkg.go.dev/google.golang.org/grpc/stats license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/status.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/status.dep.yml index 3665f10c..566b8583 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/status.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/status.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/grpc/status -version: v1.75.1 +version: v1.76.0 type: go summary: Package status implements errors returned by gRPC. homepage: https://pkg.go.dev/google.golang.org/grpc/status license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/grpc/tap.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/grpc/tap.dep.yml index 121f52e8..0756a9a3 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/grpc/tap.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/grpc/tap.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/grpc/tap -version: v1.75.1 +version: v1.76.0 type: go summary: Package tap defines the function handles which are executed on the transport layer of gRPC-Go and related information. homepage: https://pkg.go.dev/google.golang.org/grpc/tap license: apache-2.0 licenses: -- sources: grpc@v1.75.1/LICENSE +- sources: grpc@v1.76.0/LICENSE text: |2 Apache License diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/encoding/protodelim.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/encoding/protodelim.dep.yml index ecabca7d..9641ef35 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/encoding/protodelim.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/encoding/protodelim.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/encoding/protodelim -version: v1.36.9 +version: v1.36.10 type: go summary: Package protodelim marshals and unmarshals varint size-delimited messages. homepage: https://pkg.go.dev/google.golang.org/protobuf/encoding/protodelim license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/encoding/protojson.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/encoding/protojson.dep.yml index 40cec7bf..1363e441 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/encoding/protojson.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/encoding/protojson.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/protobuf/encoding/protojson -version: v1.36.9 +version: v1.36.10 type: go summary: Package protojson marshals and unmarshals protocol buffer messages as JSON format. homepage: https://pkg.go.dev/google.golang.org/protobuf/encoding/protojson license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -36,7 +36,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/encoding/prototext.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/encoding/prototext.dep.yml index faa08e49..107e701e 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/encoding/prototext.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/encoding/prototext.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/protobuf/encoding/prototext -version: v1.36.9 +version: v1.36.10 type: go summary: Package prototext marshals and unmarshals protocol buffer messages as the textproto format. homepage: https://pkg.go.dev/google.golang.org/protobuf/encoding/prototext license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -36,7 +36,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/encoding/protowire.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/encoding/protowire.dep.yml index a199d7a0..802ffb6e 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/encoding/protowire.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/encoding/protowire.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/encoding/protowire -version: v1.36.9 +version: v1.36.10 type: go summary: Package protowire parses and formats the raw wire encoding. homepage: https://pkg.go.dev/google.golang.org/protobuf/encoding/protowire license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/descfmt.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/descfmt.dep.yml index 7f13c52e..9d58428c 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/descfmt.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/descfmt.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/internal/descfmt -version: v1.36.9 +version: v1.36.10 type: go summary: Package descfmt provides functionality to format descriptors. homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/descfmt license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/descopts.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/descopts.dep.yml index 3523b1e0..b7b24bec 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/descopts.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/descopts.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/internal/descopts -version: v1.36.9 +version: v1.36.10 type: go summary: Package descopts contains the nil pointers to concrete descriptor options. homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/descopts license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/detrand.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/detrand.dep.yml index 098d051b..62ccb0c4 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/detrand.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/detrand.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/internal/detrand -version: v1.36.9 +version: v1.36.10 type: go summary: Package detrand provides deterministically random functionality. homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/detrand license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/editiondefaults.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/editiondefaults.dep.yml index 2de75e8a..a7429302 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/editiondefaults.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/editiondefaults.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/protobuf/internal/editiondefaults -version: v1.36.9 +version: v1.36.10 type: go summary: Package editiondefaults contains the binary representation of the editions defaults. homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/editiondefaults license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -36,7 +36,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/editionssupport.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/editionssupport.dep.yml index d48820da..e4841d96 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/editionssupport.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/editionssupport.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/internal/editionssupport -version: v1.36.9 +version: v1.36.10 type: go summary: Package editionssupport defines constants for editions that are supported. homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/editionssupport license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/encoding/defval.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/encoding/defval.dep.yml index 3b70d4c8..7298ab28 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/encoding/defval.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/encoding/defval.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/internal/encoding/defval -version: v1.36.9 +version: v1.36.10 type: go summary: Package defval marshals and unmarshals textual forms of default values. homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/encoding/defval license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/encoding/json.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/encoding/json.dep.yml index 2fabc454..3fe0e2ba 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/encoding/json.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/encoding/json.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/internal/encoding/json -version: v1.36.9 +version: v1.36.10 type: go -summary: +summary: homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/encoding/json license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/encoding/messageset.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/encoding/messageset.dep.yml index e7103e59..31b202a2 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/encoding/messageset.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/encoding/messageset.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/internal/encoding/messageset -version: v1.36.9 +version: v1.36.10 type: go summary: Package messageset encodes and decodes the obsolete MessageSet wire format. homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/encoding/messageset license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/encoding/tag.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/encoding/tag.dep.yml index dade75de..c64c3420 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/encoding/tag.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/encoding/tag.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/protobuf/internal/encoding/tag -version: v1.36.9 +version: v1.36.10 type: go summary: Package tag marshals and unmarshals the legacy struct tags as generated by historical versions of protoc-gen-go. homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/encoding/tag license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -36,7 +36,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/encoding/text.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/encoding/text.dep.yml index f9bf6fca..12a80cb8 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/encoding/text.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/encoding/text.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/internal/encoding/text -version: v1.36.9 +version: v1.36.10 type: go summary: Package text implements the text format for protocol buffers. homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/encoding/text license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/errors.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/errors.dep.yml index 9203dc29..46e3297f 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/errors.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/errors.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/internal/errors -version: v1.36.9 +version: v1.36.10 type: go summary: Package errors implements functions to manipulate errors. homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/errors license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/filedesc.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/filedesc.dep.yml index c6a34669..6e26e1ce 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/filedesc.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/filedesc.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/internal/filedesc -version: v1.36.9 +version: v1.36.10 type: go summary: Package filedesc provides functionality for constructing descriptors. homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/filedesc license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/filetype.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/filetype.dep.yml index d32dc732..f9aaf2c7 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/filetype.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/filetype.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/protobuf/internal/filetype -version: v1.36.9 +version: v1.36.10 type: go summary: Package filetype provides functionality for wrapping descriptors with Go type information. homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/filetype license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -36,7 +36,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/flags.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/flags.dep.yml index 39dd42eb..5e24673f 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/flags.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/flags.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/internal/flags -version: v1.36.9 +version: v1.36.10 type: go summary: Package flags provides a set of flags controlled by build tags. homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/flags license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/genid.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/genid.dep.yml index b4192f74..22bd4d65 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/genid.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/genid.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/protobuf/internal/genid -version: v1.36.9 +version: v1.36.10 type: go summary: Package genid contains constants for declarations in descriptor.proto and the well-known types. homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/genid license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -36,7 +36,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/impl.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/impl.dep.yml index 21d7f3f8..83b7a818 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/impl.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/impl.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/internal/impl -version: v1.36.9 +version: v1.36.10 type: go -summary: +summary: homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/impl license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/order.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/order.dep.yml index 3f673235..ae1f5e3f 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/order.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/order.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/internal/order -version: v1.36.9 +version: v1.36.10 type: go summary: Package order provides ordered access to messages and maps. homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/order license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/pragma.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/pragma.dep.yml index 4bc16ca1..2c25ae27 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/pragma.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/pragma.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/protobuf/internal/pragma -version: v1.36.9 +version: v1.36.10 type: go summary: Package pragma provides types that can be embedded into a struct to statically enforce or prevent certain language properties. homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/pragma license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -36,7 +36,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/protolazy.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/protolazy.dep.yml index 4b508756..f859531b 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/protolazy.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/protolazy.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/internal/protolazy -version: v1.36.9 +version: v1.36.10 type: go summary: Package protolazy contains internal data structures for lazy message decoding. homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/protolazy license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/set.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/set.dep.yml index 73e5486d..deabb98e 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/set.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/set.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/internal/set -version: v1.36.9 +version: v1.36.10 type: go summary: Package set provides simple set data structures for uint64s. homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/set license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/strs.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/strs.dep.yml index ed84ef3e..9cafac67 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/strs.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/strs.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/internal/strs -version: v1.36.9 +version: v1.36.10 type: go summary: Package strs provides string manipulation functionality specific to protobuf. homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/strs license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/version.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/version.dep.yml index d5f22279..a14b429e 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/version.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/internal/version.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/internal/version -version: v1.36.9 +version: v1.36.10 type: go summary: Package version records versioning information about this module. homepage: https://pkg.go.dev/google.golang.org/protobuf/internal/version license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/proto.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/proto.dep.yml index 3a1130c3..bc56b969 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/proto.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/proto.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/proto -version: v1.36.9 +version: v1.36.10 type: go summary: Package proto provides functions operating on protocol buffer messages. homepage: https://pkg.go.dev/google.golang.org/protobuf/proto license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/protoadapt.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/protoadapt.dep.yml index dcf29312..1c76b545 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/protoadapt.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/protoadapt.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/protoadapt -version: v1.36.9 +version: v1.36.10 type: go summary: Package protoadapt bridges the original and new proto APIs. homepage: https://pkg.go.dev/google.golang.org/protobuf/protoadapt license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/reflect/protodesc.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/reflect/protodesc.dep.yml index c527d3dc..d33d258d 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/reflect/protodesc.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/reflect/protodesc.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/protobuf/reflect/protodesc -version: v1.36.9 +version: v1.36.10 type: go summary: Package protodesc provides functionality for converting FileDescriptorProto messages to/from [protoreflect.FileDescriptor] values. homepage: https://pkg.go.dev/google.golang.org/protobuf/reflect/protodesc license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -36,7 +36,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/reflect/protoreflect.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/reflect/protoreflect.dep.yml index 21c4ecb6..0ed78989 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/reflect/protoreflect.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/reflect/protoreflect.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/reflect/protoreflect -version: v1.36.9 +version: v1.36.10 type: go summary: Package protoreflect provides interfaces to dynamically manipulate messages. homepage: https://pkg.go.dev/google.golang.org/protobuf/reflect/protoreflect license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/reflect/protoregistry.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/reflect/protoregistry.dep.yml index b68737f4..37925fd4 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/reflect/protoregistry.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/reflect/protoregistry.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/protobuf/reflect/protoregistry -version: v1.36.9 +version: v1.36.10 type: go summary: Package protoregistry provides data structures to register and lookup protobuf descriptor types. homepage: https://pkg.go.dev/google.golang.org/protobuf/reflect/protoregistry license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -36,7 +36,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/runtime/protoiface.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/runtime/protoiface.dep.yml index b468a8f4..fa6d5b2d 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/runtime/protoiface.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/runtime/protoiface.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/runtime/protoiface -version: v1.36.9 +version: v1.36.10 type: go summary: Package protoiface contains types referenced or implemented by messages. homepage: https://pkg.go.dev/google.golang.org/protobuf/runtime/protoiface license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/runtime/protoimpl.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/runtime/protoimpl.dep.yml index 5003b164..cc4d2211 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/runtime/protoimpl.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/runtime/protoimpl.dep.yml @@ -1,13 +1,13 @@ --- name: google.golang.org/protobuf/runtime/protoimpl -version: v1.36.9 +version: v1.36.10 type: go summary: Package protoimpl contains the default implementation for messages generated by protoc-gen-go. homepage: https://pkg.go.dev/google.golang.org/protobuf/runtime/protoimpl license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -36,7 +36,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/descriptorpb.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/descriptorpb.dep.yml index 7dc55bd9..a52c539e 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/descriptorpb.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/descriptorpb.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/types/descriptorpb -version: v1.36.9 +version: v1.36.10 type: go -summary: +summary: homepage: https://pkg.go.dev/google.golang.org/protobuf/types/descriptorpb license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/gofeaturespb.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/gofeaturespb.dep.yml index a0fb5964..f025f25d 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/gofeaturespb.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/gofeaturespb.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/types/gofeaturespb -version: v1.36.9 +version: v1.36.10 type: go -summary: +summary: homepage: https://pkg.go.dev/google.golang.org/protobuf/types/gofeaturespb license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/anypb.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/anypb.dep.yml index 1548fbfd..d9a99825 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/anypb.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/anypb.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/types/known/anypb -version: v1.36.9 +version: v1.36.10 type: go summary: Package anypb contains generated types for google/protobuf/any.proto. homepage: https://pkg.go.dev/google.golang.org/protobuf/types/known/anypb license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/durationpb.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/durationpb.dep.yml index a4792c2e..c949c6fa 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/durationpb.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/durationpb.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/types/known/durationpb -version: v1.36.9 +version: v1.36.10 type: go summary: Package durationpb contains generated types for google/protobuf/duration.proto. homepage: https://pkg.go.dev/google.golang.org/protobuf/types/known/durationpb license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/emptypb.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/emptypb.dep.yml index 7220ad2a..9bcac3ce 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/emptypb.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/emptypb.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/types/known/emptypb -version: v1.36.9 +version: v1.36.10 type: go -summary: +summary: homepage: https://pkg.go.dev/google.golang.org/protobuf/types/known/emptypb license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/fieldmaskpb.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/fieldmaskpb.dep.yml index 7620d73a..14ff6cd2 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/fieldmaskpb.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/fieldmaskpb.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/types/known/fieldmaskpb -version: v1.36.9 +version: v1.36.10 type: go summary: Package fieldmaskpb contains generated types for google/protobuf/field_mask.proto. homepage: https://pkg.go.dev/google.golang.org/protobuf/types/known/fieldmaskpb license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/structpb.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/structpb.dep.yml index cc8e3711..b5edbfe3 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/structpb.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/structpb.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/types/known/structpb -version: v1.36.9 +version: v1.36.10 type: go summary: Package structpb contains generated types for google/protobuf/struct.proto. homepage: https://pkg.go.dev/google.golang.org/protobuf/types/known/structpb license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/timestamppb.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/timestamppb.dep.yml index d3abc2a3..793021cd 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/timestamppb.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/timestamppb.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/types/known/timestamppb -version: v1.36.9 +version: v1.36.10 type: go summary: Package timestamppb contains generated types for google/protobuf/timestamp.proto. homepage: https://pkg.go.dev/google.golang.org/protobuf/types/known/timestamppb license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/wrapperspb.dep.yml b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/wrapperspb.dep.yml index b89248c8..3226a02a 100644 --- a/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/wrapperspb.dep.yml +++ b/.licenses/arduino-app-cli/go/google.golang.org/protobuf/types/known/wrapperspb.dep.yml @@ -1,12 +1,12 @@ --- name: google.golang.org/protobuf/types/known/wrapperspb -version: v1.36.9 +version: v1.36.10 type: go -summary: +summary: homepage: https://pkg.go.dev/google.golang.org/protobuf/types/known/wrapperspb license: bsd-3-clause licenses: -- sources: protobuf@v1.36.9/LICENSE +- sources: protobuf@v1.36.10/LICENSE text: | Copyright (c) 2018 The Go Authors. All rights reserved. @@ -35,7 +35,7 @@ licenses: 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. -- sources: protobuf@v1.36.9/PATENTS +- sources: protobuf@v1.36.10/PATENTS text: | Additional IP Rights Grant (Patents) diff --git a/README.md b/README.md index d3593b17..0252795a 100644 --- a/README.md +++ b/README.md @@ -1,64 +1,43 @@ # Arduino App CLI -`arduino-app-cli` is a command line tool and a service running on Arduino UNO Q boards, that: +`arduino-app-cli` is a command line tool running on the [Arduino UNO Q](https://docs.arduino.cc/hardware/uno-q/) boards, that manages and runs Arduino Apps (both Linux and microcontroller parts), provides a HTTP daemon mode to expose RestFul APIs, and auto-updates itself and other components. -- manages and runs Arduino Apps on the board (both Linux and microcontroller parts) -- provides multiple APIs to perform actions and fetch data, used by the front-end (ArduinoAppsLab) -- auto-updates itself and other components +[![Test Go status](https://github.com/arduino/arduino-app-cli/actions/workflows/go-test.yml/badge.svg)](https://github.com/arduino/arduino-app-cli/actions/workflows/go-test.yml) -## Environment Variables +## Docs -The following environment variables are used to configure `arduino-app-cli`: +For guidance on installation and development, see the [User documentation]. -### Application Directories +## Quickstart -- **`ARDUINO_APP_CLI__APPS_DIR`** Path to the directory where Arduino Apps created by the user are stored.\ - **Default:** `/home/arduino/ArduinoApps` +// TODO -- **`ARDUINO_APP_CLI__DATA_DIR`** Path to the directory where internal data is stored.\ - **Default:** `/home/arduino/.local/share/arduino-app-cli`\ - This folder contains: - - **`examples/`** default example Apps (_e.g._ `/home/arduino/.local/share/arduino-app-cli/examples`) - - **`assets/`** contains a subfolder for each asset version (_e.g._ `/home/arduino/.local/share/arduino-app-cli/assets/0.4.5`) - - Each asset folder includes: - - `bricks-list.yaml` - - `models-list.yaml` - - **other data** such as `properties.msgpack` containing variable values +## How to contribute -- **`ARDUINO_APP_BRICKS__CUSTOM_MODEL_DIR`** Path to the directory where custom models are stored.\ - **Default:** `$HOME/.arduino-bricks/ei-models`\ - (_e.g._ `/home/arduino/.arduino-bricks/ei-models`) +Contributions are welcome! ---- +Please read the [Contributor Guide] document, which will show you how to build the source code, run the tests, and +contribute your changes to the project. -### Execution Settings +:sparkles: Thanks to all our [contributors]! :sparkles: -- **`ARDUINO_APP_CLI__ALLOW_ROOT`** Allow running `arduino-app-cli` as root.\ - **Default:** `false` **Not recommended to set to true.** +## Security ---- +If you think you found a vulnerability or other security-related bug in the Arduino CLI, please read our [security +policy] and report the bug to our Security Team 🛡️ Thank you! -### External Services +e-mail contact: security@arduino.cc -- **`LIBRARIES_API_URL`** URL of the external service used to search libraries.\ - **Default:** `https://api2.arduino.cc/libraries/v1/libraries` +## License ---- +Arduino App CLI is licensed under the GPL-3.0 license. -### Docker Settings +You can be released from the requirements of the above license by purchasing a commercial license. Buying such a license +is mandatory if you want to modify or otherwise use the software for commercial activities involving the Arduino +software without disclosing the source code of your own applications. To purchase a commercial license, send an email to +license@arduino.cc -- **`DOCKER_REGISTRY_BASE`** Docker registry used to pull images.\ - **Default:** `ghcr.io/arduino/` - -- **`DOCKER_PYTHON_BASE_IMAGE`** Tag of the Docker image for the Python runner.\ - **Default:** `app-bricks/python-apps-base:` - -### App folder and persistent data - -When running an app, persistent files will be saved in the `data` folder inside the app folder; other supporting files, including the Python venv are saved in the `.cache` folder inside the app folder. - -### Docker images registry - -Arduino Apps bricks might required a docker image, in that case the orchestrator will pull those from the registry configured with the `DOCKER_REGISTRY_BASE` environment variable. By default this points to an Arduino GitHub Container Registry (ghcr.io/arduino). - -The only image that needs to be referenced directly is the base Python image (`DOCKER_PYTHON_BASE_IMAGE`), all other containers can be downloaded automatically by the orchestrator depending on the bricks specified as dependencies in the app.yml file. +[user documentation]: docs/user-documentation.md +[contributor guide]: docs/CONTRIBUTING.md +[security policy]: https://github.com/arduino/arduino-app-cli/security/policy +[contributors]: https://github.com/arduino/arduino-app-cli/graphs/contributors diff --git a/Taskfile.yml b/Taskfile.yml index d11bae23..5d7725b1 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -8,8 +8,8 @@ vars: GOLANGCI_LINT_VERSION: v2.4.0 GOIMPORTS_VERSION: v0.29.0 DPRINT_VERSION: 0.48.0 - EXAMPLE_VERSION: "0.5.0" - RUNNER_VERSION: "0.5.0" + EXAMPLE_VERSION: "0.6.0" + RUNNER_VERSION: "0.6.0" VERSION: # if version is not passed we hack the semver by encoding the commit as pre-release sh: echo "${VERSION:-0.0.0-$(git rev-parse --short HEAD)}" @@ -50,9 +50,13 @@ tasks: test:internal: cmds: - - go build ./cmd/arduino-app-cli # needed for e2e tests + - go build ./cmd/arduino-app-cli - task: generate - - go test ./internal/... ./cmd/... -v -race {{ .CLI_ARGS }} + - go test $(go list ./internal/... ./cmd/... | grep -v internal/e2e/updatetest) -v -race {{ .CLI_ARGS }} + + test:update: + cmds: + - go test --timeout 30m -v ./internal/e2e/updatetest test:pkg: desc: Run only tests in the pkg directory @@ -102,9 +106,10 @@ tasks: deps: - build-deb:clone-examples cmds: - - docker build --build-arg BINARY_NAME=arduino-app-cli --build-arg DEB_NAME=arduino-app-cli --build-arg VERSION={{ .VERSION }} --build-arg ARCH={{ .ARCH }} --build-arg RELEASE={{ .RELEASE }} --output=./build -f debian/Dockerfile . + - docker build --build-arg BINARY_NAME=arduino-app-cli --build-arg DEB_NAME=arduino-app-cli --build-arg VERSION={{ .VERSION }} --build-arg ARCH={{ .ARCH }} --build-arg RELEASE={{ .RELEASE }} --output={{ .OUTPUT }} -f debian/Dockerfile . vars: ARCH: '{{.ARCH | default "arm64"}}' + OUTPUT: '{{.OUTPUT | default "./build"}}' build-deb:clone-examples: desc: "Clones the examples repo directly into the debian structure" @@ -123,11 +128,17 @@ tasks: echo "Examples successfully cloned." silent: false - arduino-app-cli:build:local: + build: desc: "Build the arduino-app-cli locally" cmds: - go build -v -o ./build/arduino-app-cli ./cmd/arduino-app-cli + start: + desc: "build and launch the arduino-app-cli in daemon mode" + cmds: + - task build + - ./build/arduino-app-cli daemon --port 8800 + arduino-app-cli:release: desc: Create a tag on the current commit and push it to the remote to create the release cmds: @@ -139,12 +150,6 @@ tasks: - git tag -a "{{.CLI_ARGS}}" -m "Release {{.CLI_ARGS}}" - git push origin "{{.CLI_ARGS}}" - arduino-app-cli:start: - desc: "build and launch the arduino-app-cli in daemon mode" - cmds: - - task arduino-app-cli:build:local - - ./build/arduino-app-cli daemon --port 6060 - # To to forward a port, using ssh, you can use this command: # ssh -L 8800:localhost:8800 arduino@ arduino-app-cli:pprof: diff --git a/cmd/arduino-app-cli/app/app.go b/cmd/arduino-app-cli/app/app.go index 3d6b6341..fca105b8 100644 --- a/cmd/arduino-app-cli/app/app.go +++ b/cmd/arduino-app-cli/app/app.go @@ -38,8 +38,8 @@ func NewAppCmd(cfg config.Configuration) *cobra.Command { appCmd.AddCommand(newRestartCmd(cfg)) appCmd.AddCommand(newLogsCmd(cfg)) appCmd.AddCommand(newListCmd(cfg)) - appCmd.AddCommand(newPsCmd()) appCmd.AddCommand(newMonitorCmd(cfg)) + appCmd.AddCommand(newCacheCleanCmd(cfg)) return appCmd } @@ -50,5 +50,5 @@ func Load(idOrPath string) (app.ArduinoApp, error) { return app.ArduinoApp{}, fmt.Errorf("invalid app path: %s", idOrPath) } - return app.Load(id.ToPath().String()) + return app.Load(id.ToPath()) } diff --git a/cmd/arduino-app-cli/app/clean.go b/cmd/arduino-app-cli/app/clean.go new file mode 100644 index 00000000..adef29c8 --- /dev/null +++ b/cmd/arduino-app-cli/app/clean.go @@ -0,0 +1,65 @@ +package app + +import ( + "context" + "fmt" + + "github.com/spf13/cobra" + + "github.com/arduino/arduino-app-cli/cmd/arduino-app-cli/completion" + "github.com/arduino/arduino-app-cli/cmd/arduino-app-cli/internal/servicelocator" + "github.com/arduino/arduino-app-cli/cmd/feedback" + "github.com/arduino/arduino-app-cli/internal/orchestrator" + "github.com/arduino/arduino-app-cli/internal/orchestrator/app" + "github.com/arduino/arduino-app-cli/internal/orchestrator/config" +) + +func newCacheCleanCmd(cfg config.Configuration) *cobra.Command { + var forceClean bool + appCmd := &cobra.Command{ + Use: "clean-cache ", + Short: "Delete app cache", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + app, err := Load(args[0]) + if err != nil { + return err + } + return cacheCleanHandler(cmd.Context(), app, forceClean) + }, + ValidArgsFunction: completion.ApplicationNames(cfg), + } + appCmd.Flags().BoolVarP(&forceClean, "force", "", false, "Forcefully clean the cache even if the app is running") + + return appCmd +} + +func cacheCleanHandler(ctx context.Context, app app.ArduinoApp, forceClean bool) error { + err := orchestrator.CleanAppCache( + ctx, + servicelocator.GetDockerClient(), + app, + orchestrator.CleanAppCacheRequest{ForceClean: forceClean}, + ) + if err != nil { + feedback.Fatal(err.Error(), feedback.ErrGeneric) + } + feedback.PrintResult(cacheCleanResult{ + AppName: app.Name, + Path: app.ProvisioningStateDir().String(), + }) + return nil +} + +type cacheCleanResult struct { + AppName string `json:"appName"` + Path string `json:"path"` +} + +func (r cacheCleanResult) String() string { + return fmt.Sprintf("✓ Cache of %q App cleaned", r.AppName) +} + +func (r cacheCleanResult) Data() interface{} { + return r +} diff --git a/cmd/arduino-app-cli/app/new.go b/cmd/arduino-app-cli/app/new.go index 066f9a7b..fec533b9 100644 --- a/cmd/arduino-app-cli/app/new.go +++ b/cmd/arduino-app-cli/app/new.go @@ -32,7 +32,6 @@ func newCreateCmd(cfg config.Configuration) *cobra.Command { icon string description string bricks []string - noPyton bool noSketch bool fromApp string ) @@ -44,7 +43,7 @@ func newCreateCmd(cfg config.Configuration) *cobra.Command { RunE: func(cmd *cobra.Command, args []string) error { cobra.MinimumNArgs(1) name := args[0] - return createHandler(cmd.Context(), cfg, name, icon, description, noPyton, noSketch, fromApp) + return createHandler(cmd.Context(), cfg, name, icon, description, noSketch, fromApp) }, } @@ -52,14 +51,12 @@ func newCreateCmd(cfg config.Configuration) *cobra.Command { cmd.Flags().StringVarP(&description, "description", "d", "", "Description for the app") cmd.Flags().StringVarP(&fromApp, "from-app", "", "", "Create the new app from the path of an existing app") cmd.Flags().StringArrayVarP(&bricks, "bricks", "b", []string{}, "List of bricks to include in the app") - cmd.Flags().BoolVarP(&noPyton, "no-python", "", false, "Do not include Python files") cmd.Flags().BoolVarP(&noSketch, "no-sketch", "", false, "Do not include Sketch files") - cmd.MarkFlagsMutuallyExclusive("no-python", "no-sketch") return cmd } -func createHandler(ctx context.Context, cfg config.Configuration, name string, icon string, description string, noPython, noSketch bool, fromApp string) error { +func createHandler(ctx context.Context, cfg config.Configuration, name string, icon string, description string, noSketch bool, fromApp string) error { if fromApp != "" { id, err := servicelocator.GetAppIDProvider().ParseID(fromApp) if err != nil { @@ -88,7 +85,6 @@ func createHandler(ctx context.Context, cfg config.Configuration, name string, i Name: name, Icon: icon, Description: description, - SkipPython: noPython, SkipSketch: noSketch, }, servicelocator.GetAppIDProvider(), cfg) if err != nil { diff --git a/cmd/arduino-app-cli/app/ps.go b/cmd/arduino-app-cli/app/ps.go deleted file mode 100644 index 6549b2b9..00000000 --- a/cmd/arduino-app-cli/app/ps.go +++ /dev/null @@ -1,30 +0,0 @@ -// This file is part of arduino-app-cli. -// -// Copyright 2025 ARDUINO SA (http://www.arduino.cc/) -// -// This software is released under the GNU General Public License version 3, -// which covers the main part of arduino-app-cli. -// The terms of this license can be found at: -// https://www.gnu.org/licenses/gpl-3.0.en.html -// -// You can be released from the requirements of the above licenses by purchasing -// a commercial license. Buying such a license is mandatory if you want to -// modify or otherwise use the software for commercial activities involving the -// Arduino software without disclosing the source code of your own applications. -// To purchase a commercial license, send an email to license@arduino.cc. - -package app - -import ( - "github.com/spf13/cobra" -) - -func newPsCmd() *cobra.Command { - return &cobra.Command{ - Use: "ps", - Short: "Shows the list of running Arduino Apps", - RunE: func(cmd *cobra.Command, args []string) error { - panic("not implemented") - }, - } -} diff --git a/cmd/arduino-app-cli/app/stop.go b/cmd/arduino-app-cli/app/stop.go index debf40e7..eff55dbd 100644 --- a/cmd/arduino-app-cli/app/stop.go +++ b/cmd/arduino-app-cli/app/stop.go @@ -22,6 +22,7 @@ import ( "github.com/spf13/cobra" "github.com/arduino/arduino-app-cli/cmd/arduino-app-cli/completion" + "github.com/arduino/arduino-app-cli/cmd/arduino-app-cli/internal/servicelocator" "github.com/arduino/arduino-app-cli/cmd/feedback" "github.com/arduino/arduino-app-cli/internal/orchestrator" "github.com/arduino/arduino-app-cli/internal/orchestrator/app" @@ -53,7 +54,7 @@ func newStopCmd(cfg config.Configuration) *cobra.Command { func stopHandler(ctx context.Context, app app.ArduinoApp) error { out, _, getResult := feedback.OutputStreams() - for message := range orchestrator.StopApp(ctx, app) { + for message := range orchestrator.StopApp(ctx, servicelocator.GetDockerClient(), app) { switch message.GetType() { case orchestrator.ProgressType: fmt.Fprintf(out, "Progress[%s]: %.0f%%\n", message.GetProgress().Name, message.GetProgress().Progress) diff --git a/cmd/arduino-app-cli/internal/servicelocator/servicelocator.go b/cmd/arduino-app-cli/internal/servicelocator/servicelocator.go index edcd721d..22cbc58b 100644 --- a/cmd/arduino-app-cli/internal/servicelocator/servicelocator.go +++ b/cmd/arduino-app-cli/internal/servicelocator/servicelocator.go @@ -42,11 +42,11 @@ func Init(cfg config.Configuration) { var ( GetBricksIndex = sync.OnceValue(func() *bricksindex.BricksIndex { - return f.Must(bricksindex.GenerateBricksIndexFromFile(GetStaticStore().GetAssetsFolder())) + return f.Must(bricksindex.Load(GetStaticStore().GetAssetsFolder())) }) GetModelsIndex = sync.OnceValue(func() *modelsindex.ModelsIndex { - return f.Must(modelsindex.GenerateModelsIndexFromFile(GetStaticStore().GetAssetsFolder())) + return f.Must(modelsindex.Load(GetStaticStore().GetAssetsFolder())) }) GetProvisioner = sync.OnceValue(func() *orchestrator.Provision { diff --git a/cmd/arduino-app-cli/system/system.go b/cmd/arduino-app-cli/system/system.go index 54c89128..c23d5317 100644 --- a/cmd/arduino-app-cli/system/system.go +++ b/cmd/arduino-app-cli/system/system.go @@ -113,7 +113,13 @@ func newUpdateCmd() *cobra.Command { events := updater.Subscribe() for event := range events { - feedback.Printf("[%s] %s", event.Type.String(), event.Data) + if event.Type == update.ErrorEvent { + // TODO: add colors to error messages + err := event.GetError() + feedback.Printf("Error: %s [%s]", err.Error(), update.GetUpdateErrorCode(err)) + } else { + feedback.Printf("[%s] %s", event.Type.String(), event.GetData()) + } if event.Type == update.DoneEvent { break diff --git a/cmd/gendoc/docs.go b/cmd/gendoc/docs.go index 8e85e2a8..0b36ffe8 100644 --- a/cmd/gendoc/docs.go +++ b/cmd/gendoc/docs.go @@ -609,7 +609,6 @@ Contains a JSON object with the details of an error. Path: "/v1/apps", Request: handlers.CreateAppRequest{}, Parameters: (*struct { - SkipPython bool `query:"skip-python" description:"If true, the app will not be created with the python part."` SkipSketch bool `query:"skip-sketch" description:"If true, the app will not be created with the sketch part."` })(nil), CustomSuccessResponse: &CustomResponseDef{ diff --git a/debian/arduino-app-cli/etc/needrestart/conf.d/arduino-adbd.conf b/debian/arduino-app-cli/etc/needrestart/conf.d/arduino-adbd.conf new file mode 100644 index 00000000..1ffff052 --- /dev/null +++ b/debian/arduino-app-cli/etc/needrestart/conf.d/arduino-adbd.conf @@ -0,0 +1,3 @@ +# exclude adbd from service that need to be restarted. +$nrconf{override_rc}{qr(^adbd\.service$)} = 0; + diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/cloud_llm/API.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/cloud_llm/API.md deleted file mode 100644 index ba9da420..00000000 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/cloud_llm/API.md +++ /dev/null @@ -1,107 +0,0 @@ -# cloud_llm API Reference - -## Index - -- Class `CloudLLM` -- Class `CloudModel` - ---- - -## `CloudLLM` class - -```python -class CloudLLM(api_key: str, model: Union[str, CloudModel], system_prompt: str, temperature: Optional[float], timeout: int) -``` - -A simplified, opinionated wrapper for common LangChain conversational patterns. - -This class provides a single interface to manage stateless chat and chat with memory. - -### Parameters - -- **api_key**: The API key for the LLM service. -- **model**: The model identifier as per LangChain specification (e.g., "anthropic:claude-3-sonnet-20240229") -or by using a CloudModels enum (e.g. CloudModels.OPENAI_GPT). Defaults to CloudModel.ANTHROPIC_CLAUDE. -- **system_prompt**: The global system-level instruction for the AI. -- **temperature**, default=0.7: The sampling temperature for response generation. Defaults to 0.7. -- **timeout**, default=30 seconds: The maximum time to wait for a response from the LLM service, in seconds. Defaults to 30 seconds. - -### Raises - -- **ValueError**: If the API key is missing. - -### Methods - -#### `with_memory(max_messages: int)` - -Enables conversational memory for this instance. - -This allows the chatbot to remember previous user and AI messages. -Calling this modifies the instance to be stateful. - -##### Parameters - -- **max_messages**: The total number of past messages (user + AI) to -keep in the conversation window. Set to 0 to disable memory. - -##### Returns - -- (*self*): The current CloudLLM instance for method chaining. - -#### `chat(message: str)` - -Sends a single message to the AI and gets a complete response synchronously. - -This is the primary way to interact. It automatically handles memory -based on how the instance was configured. - -##### Parameters - -- **message**: The user's message. - -##### Returns - --: The AI's complete response as a string. - -##### Raises - -- **RuntimeError**: If the chat model is not initialized or if text generation fails. - -#### `chat_stream(message: str)` - -Sends a single message to the AI and streams the response as a synchronous generator. - -Use this to get tokens as they are generated, perfect for a streaming UI. - -##### Parameters - -- **message**: The user's message. - -##### Returns - -- (*str*): Chunks of the AI's response as they become available. - -##### Raises - -- **RuntimeError**: If the chat model is not initialized or if text generation fails. -- **AlreadyGenerating**: If the chat model is already streaming a response. - -#### `stop_stream()` - -Signals the LLM to stop generating a response. - -#### `clear_memory()` - -Clears the conversational memory. - -This only has an effect if with_memory() has been called. - - ---- - -## `CloudModel` class - -```python -class CloudModel() -``` - diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/air_quality_monitoring/API.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/air_quality_monitoring/API.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/air_quality_monitoring/API.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/air_quality_monitoring/API.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/arduino_cloud/API.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/arduino_cloud/API.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/arduino_cloud/API.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/arduino_cloud/API.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/audio_classification/API.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/audio_classification/API.md similarity index 91% rename from internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/audio_classification/API.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/audio_classification/API.md index 87a5213e..7573beee 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/audio_classification/API.md +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/audio_classification/API.md @@ -67,7 +67,7 @@ Stop real-time audio classification. Terminates audio capture and releases any associated resources. -#### `classify_from_file(audio_path: str, confidence: int)` +#### `classify_from_file(audio_path: str, confidence: float)` Classify audio content from a WAV file. @@ -80,9 +80,8 @@ Supported sample widths: ##### Parameters - **audio_path** (*str*): Path to the `.wav` audio file to classify. -- **confidence** (*int*) (optional): Confidence threshold (0–1). If None, -the default confidence level specified during initialization -will be applied. +- **confidence** (*float*) (optional): Minimum confidence threshold (0.0–1.0) required +for a detection to be considered valid. Defaults to 0.8 (80%). ##### Returns diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/camera_code_detection/API.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/camera_code_detection/API.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/camera_code_detection/API.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/camera_code_detection/API.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/cloud_llm/API.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/cloud_llm/API.md new file mode 100644 index 00000000..d2dd5903 --- /dev/null +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/cloud_llm/API.md @@ -0,0 +1,120 @@ +# cloud_llm API Reference + +## Index + +- Class `CloudLLM` +- Class `CloudModel` + +--- + +## `CloudLLM` class + +```python +class CloudLLM(api_key: str, model: Union[str, CloudModel], system_prompt: str, temperature: Optional[float], timeout: int) +``` + +A Brick for interacting with cloud-based Large Language Models (LLMs). + +This class wraps LangChain functionality to provide a simplified, unified interface +for chatting with models like Claude, GPT, and Gemini. It supports both synchronous +'one-shot' responses and streaming output, with optional conversational memory. + +### Parameters + +- **api_key** (*str*): The API access key for the target LLM service. Defaults to the +'API_KEY' environment variable. +- **model** (*Union[str, CloudModel]*): The model identifier. Accepts a `CloudModel` +enum member (e.g., `CloudModel.OPENAI_GPT`) or its corresponding raw string +value (e.g., `'gpt-4o-mini'`). Defaults to `CloudModel.ANTHROPIC_CLAUDE`. +- **system_prompt** (*str*): A system-level instruction that defines the AI's persona +and constraints (e.g., "You are a helpful assistant"). Defaults to empty. +- **temperature** (*Optional[float]*): The sampling temperature between 0.0 and 1.0. +Higher values make output more random/creative; lower values make it more +deterministic. Defaults to 0.7. +- **timeout** (*int*): The maximum duration in seconds to wait for a response before +timing out. Defaults to 30. + +### Raises + +- **ValueError**: If `api_key` is not provided (empty string). + +### Methods + +#### `with_memory(max_messages: int)` + +Enables conversational memory for this instance. + +Configures the Brick to retain a window of previous messages, allowing the +AI to maintain context across multiple interactions. + +##### Parameters + +- **max_messages** (*int*): The maximum number of messages (user + AI) to keep +in history. Older messages are discarded. Set to 0 to disable memory. +Defaults to 10. + +##### Returns + +- (*CloudLLM*): The current instance, allowing for method chaining. + +#### `chat(message: str)` + +Sends a message to the AI and blocks until the complete response is received. + +This method automatically manages conversation history if memory is enabled. + +##### Parameters + +- **message** (*str*): The input text prompt from the user. + +##### Returns + +- (*str*): The complete text response generated by the AI. + +##### Raises + +- **RuntimeError**: If the internal chain is not initialized or if the API request fails. + +#### `chat_stream(message: str)` + +Sends a message to the AI and yields response tokens as they are generated. + +This allows for processing or displaying the response in real-time (streaming). +The generation can be interrupted by calling `stop_stream()`. + +##### Parameters + +- **message** (*str*): The input text prompt from the user. + +##### Returns + +- (*str*): Chunks of text (tokens) from the AI response. + +##### Raises + +- **RuntimeError**: If the internal chain is not initialized or if the API request fails. +- **AlreadyGenerating**: If a streaming session is already active. + +#### `stop_stream()` + +Signals the active streaming generation to stop. + +This sets an internal flag that causes the `chat_stream` iterator to break +early. It has no effect if no stream is currently running. + +#### `clear_memory()` + +Clears the conversational memory history. + +Resets the stored context. This is useful for starting a new conversation +topic without previous context interfering. Only applies if memory is enabled. + + +--- + +## `CloudModel` class + +```python +class CloudModel() +``` + diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/dbstorage_sqlstore/API.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/dbstorage_sqlstore/API.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/dbstorage_sqlstore/API.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/dbstorage_sqlstore/API.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/dbstorage_tsstore/API.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/dbstorage_tsstore/API.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/dbstorage_tsstore/API.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/dbstorage_tsstore/API.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/image_classification/API.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/image_classification/API.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/image_classification/API.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/image_classification/API.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/keyword_spotting/API.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/keyword_spotting/API.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/keyword_spotting/API.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/keyword_spotting/API.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/mood_detector/API.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/mood_detector/API.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/mood_detector/API.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/mood_detector/API.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/motion_detection/API.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/motion_detection/API.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/motion_detection/API.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/motion_detection/API.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/mqtt/API.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/mqtt/API.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/mqtt/API.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/mqtt/API.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/object_detection/API.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/object_detection/API.md similarity index 90% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/object_detection/API.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/object_detection/API.md index c8c84812..bf58415c 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/object_detection/API.md +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/object_detection/API.md @@ -19,6 +19,14 @@ This module processes an input image and returns: - Corresponding class labels - Confidence scores for each detection +### Parameters + +- **confidence** (*float*): Minimum confidence threshold for detections. Default is 0.3 (30%). + +### Raises + +- **ValueError**: If model information cannot be retrieved. + ### Methods #### `detect_from_file(image_path: str, confidence: float)` @@ -60,7 +68,7 @@ Draw bounding boxes on an image enclosing detected objects using PIL. ##### Returns -: Image with bounding boxes and key points drawn. -None if no detection or invalid image. +None if input image or detections are invalid. #### `process(item)` diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/streamlit_ui/API.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/streamlit_ui/API.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/streamlit_ui/API.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/streamlit_ui/API.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/vibration_anomaly_detection/API.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/vibration_anomaly_detection/API.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/vibration_anomaly_detection/API.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/vibration_anomaly_detection/API.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/video_imageclassification/API.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/video_imageclassification/API.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/video_imageclassification/API.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/video_imageclassification/API.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/video_objectdetection/API.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/video_objectdetection/API.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/video_objectdetection/API.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/video_objectdetection/API.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/visual_anomaly_detection/API.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/visual_anomaly_detection/API.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/visual_anomaly_detection/API.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/visual_anomaly_detection/API.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/wave_generator/API.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/wave_generator/API.md new file mode 100644 index 00000000..f8977727 --- /dev/null +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/wave_generator/API.md @@ -0,0 +1,151 @@ +# wave_generator API Reference + +## Index + +- Class `WaveGenerator` + +--- + +## `WaveGenerator` class + +```python +class WaveGenerator(sample_rate: int, wave_type: WaveType, block_duration: float, attack: float, release: float, glide: float, speaker: Speaker) +``` + +Continuous wave generator brick for audio synthesis. + +This brick generates continuous audio waveforms (sine, square, sawtooth, triangle) +and streams them to a USB speaker in real-time. It provides smooth transitions +between frequency and amplitude changes using configurable envelope parameters. + +The generator runs continuously in a background thread, producing audio blocks +at a steady rate with minimal latency. + +### Parameters + +- **sample_rate** (*int*): Audio sample rate in Hz (default: 16000). +- **wave_type** (*WaveType*): Initial waveform type (default: "sine"). +- **block_duration** (*float*): Duration of each audio block in seconds (default: 0.01). +- **attack** (*float*): Attack time for amplitude envelope in seconds (default: 0.01). +- **release** (*float*): Release time for amplitude envelope in seconds (default: 0.03). +- **glide** (*float*): Frequency glide time (portamento) in seconds (default: 0.02). +- **speaker** (*Speaker*) (optional): Pre-configured Speaker instance. If None, WaveGenerator +will create an internal Speaker optimized for real-time synthesis with: +- periodsize aligned to block_duration (eliminates buffer mismatch) +- queue_maxsize=8 (low latency: ~80ms max buffer) +- format=FLOAT_LE, channels=1 + +If providing an external Speaker, ensure: +- sample_rate matches WaveGenerator's sample_rate +- periodsize = int(sample_rate × block_duration) for optimal alignment +- Speaker is started/stopped manually (WaveGenerator won't manage its lifecycle) + +Example external Speaker configuration: + speaker = Speaker( + device="plughw:CARD=UH34", + sample_rate=16000, + format="FLOAT_LE", + periodsize=160, # 16000 × 0.01 = 160 frames + queue_maxsize=8 + ) + +### Raises + +- **SpeakerException**: If no USB speaker is found or device is busy. + +### Attributes + +- **sample_rate** (*int*): Audio sample rate in Hz (default: 16000). +- **wave_type** (*WaveType*): Type of waveform to generate. +- **frequency** (*float*): Current output frequency in Hz. +- **amplitude** (*float*): Current output amplitude (0.0-1.0). + +### Methods + +#### `start()` + +Start the wave generator and audio output. + +This starts the speaker device (if internally owned) and launches the producer thread +that continuously generates and streams audio blocks. + +#### `stop()` + +Stop the wave generator and audio output. + +This stops the producer thread and closes the speaker device (if internally owned). + +#### `set_frequency(frequency: float)` + +Set the target output frequency. + +The frequency will smoothly transition to the new value over the +configured glide time. + +##### Parameters + +- **frequency** (*float*): Target frequency in Hz (typically 20-8000 Hz). + +#### `set_amplitude(amplitude: float)` + +Set the target output amplitude. + +The amplitude will smoothly transition to the new value over the +configured attack/release time. + +##### Parameters + +- **amplitude** (*float*): Target amplitude in range [0.0, 1.0]. + +#### `set_wave_type(wave_type: WaveType)` + +Change the waveform type. + +##### Parameters + +- **wave_type** (*WaveType*): One of "sine", "square", "sawtooth", "triangle". + +##### Raises + +- **ValueError**: If wave_type is not valid. + +#### `set_volume(volume: int)` + +Set the speaker volume level. + +This is a wrapper that controls the hardware volume of the USB speaker device. + +##### Parameters + +- **volume** (*int*): Hardware volume level (0-100). + +##### Raises + +- **SpeakerException**: If the mixer is not available or if volume cannot be set. + +#### `get_volume()` + +Get the current speaker volume level. + +##### Returns + +- (*int*): Current hardware volume level (0-100). + +#### `set_envelope_params(attack: float, release: float, glide: float)` + +Update envelope parameters. + +##### Parameters + +- **attack** (*float*) (optional): Attack time in seconds. +- **release** (*float*) (optional): Release time in seconds. +- **glide** (*float*) (optional): Frequency glide time in seconds. + +#### `get_state()` + +Get current generator state. + +##### Returns + +- (*dict*): Dictionary containing current frequency, amplitude, wave type, etc. + diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/weather_forecast/API.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/weather_forecast/API.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/weather_forecast/API.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/weather_forecast/API.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/web_ui/API.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/web_ui/API.md similarity index 76% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/web_ui/API.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/web_ui/API.md index 4619aed5..ec08afdb 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/web_ui/API.md +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_bricks/web_ui/API.md @@ -9,7 +9,7 @@ ## `WebUI` class ```python -class WebUI(addr: str, port: int, ui_path_prefix: str, api_path_prefix: str, assets_dir_path: str, certs_dir_path: str, use_ssl: bool) +class WebUI(addr: str, port: int, ui_path_prefix: str, api_path_prefix: str, assets_dir_path: str, certs_dir_path: str, use_tls: bool, use_ssl: bool | None) ``` Module for deploying a web server that can host a web application and expose APIs to its clients. @@ -24,21 +24,38 @@ and support real-time communication between the client and the server. - **ui_path_prefix** (*str*) (optional), default="" (root): URL prefix for UI routes. Defaults to "" (root). - **api_path_prefix** (*str*) (optional), default="" (root): URL prefix for API routes. Defaults to "" (root). - **assets_dir_path** (*str*) (optional), default="/app/assets": Path to static assets directory. Defaults to "/app/assets". -- **certs_dir_path** (*str*) (optional), default="/app/certs": Path to SSL certificates directory. Defaults to "/app/certs". -- **use_ssl** (*bool*) (optional), default=False: Enable SSL/HTTPS. Defaults to False. +- **certs_dir_path** (*str*) (optional), default="/app/certs": Path to TLS certificates directory. Defaults to "/app/certs". +- **use_tls** (*bool*) (optional), default=False: Enable TLS/HTTPS. Defaults to False. +- **use_ssl** (*bool*) (optional), default=None: Deprecated. Use use_tls instead. Defaults to None. ### Methods +#### `local_url()` + +Get the locally addressable URL of the web server. + +##### Returns + +- (*str*): The server's URL (including protocol, address, and port). + +#### `url()` + +Get the externally addressable URL of the web server. + +##### Returns + +- (*str*): The server's URL (including protocol, address, and port). + #### `start()` Start the web server asynchronously. -This sets up static file routing and WebSocket event handlers, configures SSL if enabled, and launches the server using Uvicorn. +This sets up static file routing and WebSocket event handlers, configures TLS if enabled, and launches the server using Uvicorn. ##### Raises - **RuntimeError**: If 'index.html' is missing in the static assets directory. -- **RuntimeError**: If SSL is enabled but certificates are missing or fail to generate. +- **RuntimeError**: If TLS is enabled but certificates fail to generate. - **RuntimeWarning**: If the server is already running. #### `stop()` @@ -47,7 +64,7 @@ Stop the web server gracefully. Waits up to 5 seconds for current requests to finish before terminating. -#### `expose_api(method: str, path: str, function: callable)` +#### `expose_api(method: str, path: str, function: Callable)` Register a route with the specified HTTP method and path. @@ -57,7 +74,7 @@ The path will be prefixed with the api_path_prefix configured during initializat - **method** (*str*): HTTP method to use (e.g., "GET", "POST"). - **path** (*str*): URL path for the API endpoint (without the prefix). -- **function** (*callable*): Function to execute when the route is accessed. +- **function** (*Callable*): Function to execute when the route is accessed. #### `on_connect(callback: Callable[[str], None])` @@ -79,7 +96,7 @@ The callback should accept a single argument: the session ID (sid) of the discon - **callback** (*Callable[[str], None]*): Function to call when a client disconnects. Receives the session ID (sid) as its only argument. -#### `on_message(message_type: str, callback: Callable[[str, any], any])` +#### `on_message(message_type: str, callback: Callable[[str, Any], Any])` Register a callback function for a specific WebSocket message type received by clients. @@ -91,10 +108,10 @@ with a message type suffix "_response". ##### Parameters - **message_type** (*str*): The message type name to listen for. -- **callback** (*Callable[[str, any], any]*): Function to handle the message. Receives two arguments: +- **callback** (*Callable[[str, Any], Any]*): Function to handle the message. Receives two arguments: the session ID (sid) and the incoming message data. -#### `send_message(message_type: str, message: dict | str, room: str)` +#### `send_message(message_type: str, message: dict | str, room: str | None)` Send a message to connected WebSocket clients. diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_peripherals/microphone/API.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_peripherals/microphone/API.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_peripherals/microphone/API.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_peripherals/microphone/API.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_peripherals/speaker/API.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_peripherals/speaker/API.md similarity index 79% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_peripherals/speaker/API.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_peripherals/speaker/API.md index 3cddad0f..94c64118 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_peripherals/speaker/API.md +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_peripherals/speaker/API.md @@ -21,7 +21,7 @@ Custom exception for Speaker errors. ## `Speaker` class ```python -class Speaker(device: str, sample_rate: int, channels: int, format: str) +class Speaker(device: str, sample_rate: int, channels: int, format: str, periodsize: int, queue_maxsize: int) ``` Speaker class for reproducing audio using ALSA PCM interface. @@ -32,6 +32,12 @@ Speaker class for reproducing audio using ALSA PCM interface. - **sample_rate** (*int*): Sample rate in Hz (default: 16000). - **channels** (*int*): Number of audio channels (default: 1). - **format** (*str*): Audio format (default: "S16_LE"). +- **periodsize** (*int*): ALSA period size in frames (default: None = use hardware default). +For real-time synthesis, set to match generation block size. +For streaming/file playback, leave as None for hardware-optimal value. +- **queue_maxsize** (*int*): Maximum application queue depth in blocks (default: 100). +Lower values (5-20) reduce latency for interactive audio. +Higher values (50-200) provide stability for streaming. ### Raises diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_peripherals/usb_camera/API.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_peripherals/usb_camera/API.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_peripherals/usb_camera/API.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/api-docs/arduino/app_peripherals/usb_camera/API.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/bricks-list.yaml b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/bricks-list.yaml similarity index 93% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/bricks-list.yaml rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/bricks-list.yaml index a4747e86..eaf2186d 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/bricks-list.yaml +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/bricks-list.yaml @@ -5,7 +5,6 @@ bricks: local database. require_container: false require_model: false - require_devices: false mount_devices_into_container: false ports: [] category: storage @@ -17,7 +16,6 @@ bricks: \ or with custom object detection models trained on Edge Impulse platform. \n" require_container: true require_model: true - require_devices: false mount_devices_into_container: false ports: [] category: video @@ -38,7 +36,6 @@ bricks: ' require_container: false require_model: false - require_devices: false mount_devices_into_container: false ports: [] category: text @@ -47,7 +44,6 @@ bricks: description: Scans a camera for barcodes and QR codes require_container: false require_model: false - require_devices: false mount_devices_into_container: false ports: [] category: video @@ -64,7 +60,6 @@ bricks: ' require_container: true require_model: true - require_devices: false mount_devices_into_container: false ports: [] category: audio @@ -81,7 +76,6 @@ bricks: description: Connects to Arduino Cloud require_container: false require_model: false - require_devices: false mount_devices_into_container: false ports: [] category: null @@ -90,6 +84,15 @@ bricks: description: Arduino Cloud Device ID - name: ARDUINO_SECRET description: Arduino Cloud Secret +- id: arduino:wave_generator + name: Wave Generator + description: Continuous wave generator for audio synthesis. Generates sine, square, + sawtooth, and triangle waveforms with smooth frequency and amplitude transitions. + require_container: false + require_model: false + mount_devices_into_container: false + ports: [] + category: audio - id: arduino:image_classification name: Image Classification description: "Brick for image classification using a pre-trained model. It processes\ @@ -98,7 +101,6 @@ bricks: \ image classification models trained on Edge Impulse platform. \n" require_container: true require_model: true - require_devices: false mount_devices_into_container: false ports: [] category: video @@ -115,7 +117,6 @@ bricks: description: A simplified user interface based on Streamlit and Python. require_container: false require_model: false - require_devices: false mount_devices_into_container: false ports: - 7000 @@ -135,7 +136,6 @@ bricks: ' require_container: true require_model: true - require_devices: false mount_devices_into_container: false ports: [] category: null @@ -155,7 +155,6 @@ bricks: APIs and a WebSocket exposed by a web server. require_container: false require_model: false - require_devices: false mount_devices_into_container: false ports: - 7000 @@ -172,7 +171,6 @@ bricks: ' require_container: true require_model: true - require_devices: false mount_devices_into_container: false ports: [] category: audio @@ -202,7 +200,6 @@ bricks: ' require_container: true require_model: true - require_devices: true mount_devices_into_container: true ports: [] category: video @@ -224,7 +221,6 @@ bricks: and weather APIs. Requires an internet connection. require_container: false require_model: false - require_devices: false mount_devices_into_container: false ports: [] category: miscellaneous @@ -241,7 +237,6 @@ bricks: ' require_container: true require_model: true - require_devices: false mount_devices_into_container: false ports: [] category: null @@ -259,7 +254,6 @@ bricks: built on top of InfluxDB. require_container: true require_model: false - require_devices: false mount_devices_into_container: false ports: [] category: storage @@ -283,7 +277,6 @@ bricks: \ detection models trained on the Edge Impulse platform. \n" require_container: true require_model: true - require_devices: false mount_devices_into_container: false ports: [] category: image @@ -312,7 +305,6 @@ bricks: ' require_container: true require_model: true - require_devices: true mount_devices_into_container: true ports: [] category: null @@ -328,3 +320,15 @@ bricks: description: path to the model file - name: VIDEO_DEVICE default_value: /dev/video1 +- id: arduino:cloud_llm + name: Cloud LLM + description: Cloud LLM Brick enables seamless integration with cloud-based Large + Language Models (LLMs) for advanced AI capabilities in your Arduino projects. + require_container: false + require_model: false + mount_devices_into_container: false + ports: [] + category: null + variables: + - name: API_KEY + description: API Key for the cloud-based LLM service diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/audio_classification/brick_compose.yaml b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/audio_classification/brick_compose.yaml similarity index 97% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/audio_classification/brick_compose.yaml rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/audio_classification/brick_compose.yaml index 6dbe38e4..0a710c5f 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/audio_classification/brick_compose.yaml +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/audio_classification/brick_compose.yaml @@ -2,7 +2,7 @@ # CUSTOM_MODEL_PATH = path to the custom model directory services: ei-audio-classifier-runner: - image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.5.0 + image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.6.0 logging: driver: "json-file" options: diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/dbstorage_tsstore/brick_compose.yaml b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/dbstorage_tsstore/brick_compose.yaml similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/dbstorage_tsstore/brick_compose.yaml rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/dbstorage_tsstore/brick_compose.yaml diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/image_classification/brick_compose.yaml b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/image_classification/brick_compose.yaml similarity index 97% rename from internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/image_classification/brick_compose.yaml rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/image_classification/brick_compose.yaml index d8207271..fe20b37e 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/image_classification/brick_compose.yaml +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/image_classification/brick_compose.yaml @@ -2,7 +2,7 @@ # CUSTOM_MODEL_PATH = path to the custom model directory services: ei-classification-runner: - image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.5.0 + image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.6.0 logging: driver: "json-file" options: diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/keyword_spotting/brick_compose.yaml b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/keyword_spotting/brick_compose.yaml similarity index 97% rename from internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/keyword_spotting/brick_compose.yaml rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/keyword_spotting/brick_compose.yaml index b4dd7963..4340871e 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/keyword_spotting/brick_compose.yaml +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/keyword_spotting/brick_compose.yaml @@ -2,7 +2,7 @@ # CUSTOM_MODEL_PATH = path to the custom model directory services: ei-keyword-spot-runner: - image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.5.0 + image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.6.0 logging: driver: "json-file" options: diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/motion_detection/brick_compose.yaml b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/motion_detection/brick_compose.yaml similarity index 97% rename from internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/motion_detection/brick_compose.yaml rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/motion_detection/brick_compose.yaml index ef7fc730..abc10e77 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/motion_detection/brick_compose.yaml +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/motion_detection/brick_compose.yaml @@ -2,7 +2,7 @@ # CUSTOM_MODEL_PATH = path to the custom model directory services: ei-motion-detection-runner: - image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.5.0 + image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.6.0 logging: driver: "json-file" options: diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/object_detection/brick_compose.yaml b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/object_detection/brick_compose.yaml similarity index 97% rename from internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/object_detection/brick_compose.yaml rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/object_detection/brick_compose.yaml index 9d418913..99871411 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/object_detection/brick_compose.yaml +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/object_detection/brick_compose.yaml @@ -2,7 +2,7 @@ # CUSTOM_MODEL_PATH = path to the custom model directory services: ei-obj-detection-runner: - image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.5.0 + image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.6.0 logging: driver: "json-file" options: diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/vibration_anomaly_detection/brick_compose.yaml b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/vibration_anomaly_detection/brick_compose.yaml similarity index 97% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/vibration_anomaly_detection/brick_compose.yaml rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/vibration_anomaly_detection/brick_compose.yaml index aca4e2a2..e07c2890 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/vibration_anomaly_detection/brick_compose.yaml +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/vibration_anomaly_detection/brick_compose.yaml @@ -2,7 +2,7 @@ # CUSTOM_MODEL_PATH = path to the custom model directory services: ei-anomaly-detection-runner: - image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.5.0 + image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.6.0 logging: driver: "json-file" options: diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/video_image_classification/brick_compose.yaml b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/video_image_classification/brick_compose.yaml similarity index 97% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/video_image_classification/brick_compose.yaml rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/video_image_classification/brick_compose.yaml index 7e054acc..3dd8139a 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/video_image_classification/brick_compose.yaml +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/video_image_classification/brick_compose.yaml @@ -2,7 +2,7 @@ # CUSTOM_MODEL_PATH = path to the custom model directory services: ei-video-classification-runner: - image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.5.0 + image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.6.0 logging: driver: "json-file" options: diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/video_object_detection/brick_compose.yaml b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/video_object_detection/brick_compose.yaml similarity index 86% rename from internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/video_object_detection/brick_compose.yaml rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/video_object_detection/brick_compose.yaml index dbca6363..804bc638 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/video_object_detection/brick_compose.yaml +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/video_object_detection/brick_compose.yaml @@ -2,7 +2,7 @@ # CUSTOM_MODEL_PATH = path to the custom model directory services: ei-video-obj-detection-runner: - image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.5.0 + image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.6.0 logging: driver: "json-file" options: @@ -13,7 +13,7 @@ services: volumes: - "${CUSTOM_MODEL_PATH:-/home/arduino/.arduino-bricks/ei-models/}:${CUSTOM_MODEL_PATH:-/home/arduino/.arduino-bricks/ei-models/}" - "/run/udev:/run/udev" - command: ["--model-file", "${EI_OBJ_DETECTION_MODEL:-/models/ootb/ei/yolo-x-nano.eim}", "--dont-print-predictions", "--mode", "streaming", "--force-target", "--preview-original-resolution", "--camera", "${VIDEO_DEVICE:-/dev/video1}"] + command: ["--model-file", "${EI_OBJ_DETECTION_MODEL:-/models/ootb/ei/yolo-x-nano.eim}", "--dont-print-predictions", "--mode", "streaming", "--preview-original-resolution", "--camera", "${VIDEO_DEVICE:-/dev/video1}"] healthcheck: test: [ "CMD-SHELL", "wget -q --spider http://ei-video-obj-detection-runner:4912 || exit 1" ] interval: 2s diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/visual_anomaly_detection/brick_compose.yaml b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/visual_anomaly_detection/brick_compose.yaml similarity index 97% rename from internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/visual_anomaly_detection/brick_compose.yaml rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/visual_anomaly_detection/brick_compose.yaml index 0e71d75a..ced99fcb 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/visual_anomaly_detection/brick_compose.yaml +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/compose/arduino/visual_anomaly_detection/brick_compose.yaml @@ -2,7 +2,7 @@ # CUSTOM_MODEL_PATH = path to the custom model directory services: ei-obj-video-anomalies-det-runner: - image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.5.0 + image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.6.0 logging: driver: "json-file" options: diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/arduino_cloud/README.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/arduino_cloud/README.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/arduino_cloud/README.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/arduino_cloud/README.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/audio_classification/README.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/audio_classification/README.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/audio_classification/README.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/audio_classification/README.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/camera_code_detection/README.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/camera_code_detection/README.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/camera_code_detection/README.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/camera_code_detection/README.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/cloud_llm/README.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/cloud_llm/README.md new file mode 100644 index 00000000..add84514 --- /dev/null +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/cloud_llm/README.md @@ -0,0 +1,109 @@ +# Cloud LLM Brick + +The Cloud LLM Brick provides a seamless interface to interact with cloud-based Large Language Models (LLMs) such as OpenAI's GPT, Anthropic's Claude, and Google's Gemini. It abstracts the complexity of REST APIs, enabling you to send prompts, receive responses, and maintain conversational context within your Arduino projects. + +## Overview + +This Brick acts as a gateway to powerful AI models hosted in the cloud. It is designed to handle the nuances of network communication, authentication, and session management. Whether you need a simple one-off answer or a continuous conversation with memory, the Cloud LLM Brick provides a unified API for different providers. + +## Features + +- **Multi-Provider Support**: Compatible with major LLM providers including Anthropic (Claude), OpenAI (GPT), and Google (Gemini). +- **Conversational Memory**: Built-in support for windowed history, allowing the AI to remember context from previous exchanges. +- **Streaming Responses**: Receive text chunks in real-time as they are generated, ideal for responsive user interfaces. +- **Configurable Behavior**: Customize system prompts, temperature (creativity), and request timeouts. +- **Simple API**: Unified `chat` and `chat_stream` methods regardless of the underlying model provider. + +## Prerequisites + +- **Internet Connection**: The board must be connected to the internet to reach the LLM provider's API. +- **API Key**: A valid API key for the chosen service (e.g., OpenAI API Key, Anthropic API Key). +- **Python Dependencies**: The Brick relies on LangChain integration packages (`langchain-anthropic`, `langchain-openai`, `langchain-google-genai`). + +## Code Example and Usage + +### Basic Conversation + +This example initializes the Brick with an OpenAI model and performs a simple chat interaction. + +**Note:** The API key is not hardcoded. It is retrieved automatically from the **Brick Configuration** in App Lab. + +```python +import os +from arduino.app_bricks.cloud_llm import CloudLLM, CloudModel +from arduino.app_utils import App + +# Initialize the Brick (API key is loaded from configuration) +llm = CloudLLM( + model=CloudModel.OPENAI_GPT, + system_prompt="You are a helpful assistant for an IoT device." +) + +def simple_chat(): + # Send a prompt and print the response + response = llm.chat("What is the capital of Italy?") + print(f"AI: {response}") + +# Run the application +App.run(simple_chat) +``` + +### Streaming with Memory + +This example demonstrates how to enable conversational memory and process the response as a stream of tokens. + +```python +from arduino.app_bricks.cloud_llm import CloudLLM, CloudModel +from arduino.app_utils import App + +# Initialize with memory enabled (keeps last 10 messages) +# API Key is retrieved automatically from Brick Configuration +llm = CloudLLM( + model=CloudModel.ANTHROPIC_CLAUDE +).with_memory(max_messages=10) + +def chat_loop(): + while True: + user_input = input("You: ") + if user_input.lower() in ["exit", "quit"]: + break + + print("AI: ", end="", flush=True) + + # Stream the response token by token + for token in llm.chat_stream(user_input): + print(token, end="", flush=True) + print() # Newline after response + +App.run(chat_loop) +``` + +## Configuration + +The Brick is initialized with the following parameters: + +| Parameter | Type | Default | Description | +| :-------------- | :-------------------- | :---------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------- | +| `api_key` | `str` | `os.getenv("API_KEY")` | The authentication key for the LLM provider. **Recommended:** Set this via the **Brick Configuration** menu in App Lab instead of code. | +| `model` | `str` \| `CloudModel` | `CloudModel.ANTHROPIC_CLAUDE` | The specific model to use. Accepts a `CloudModel` enum or its string value. | +| `system_prompt` | `str` | `""` | A base instruction that defines the AI's behavior and persona. | +| `temperature` | `float` | `0.7` | Controls randomness. `0.0` is deterministic, `1.0` is creative. | +| `timeout` | `int` | `30` | Maximum time (in seconds) to wait for a response. | + +### Supported Models + +You can select a model using the `CloudModel` enum or by passing the corresponding raw string identifier. + +| Enum Constant | Raw String ID | Provider Documentation | +| :---------------------------- | :------------------------- | :-------------------------------------------------------------------------- | +| `CloudModel.ANTHROPIC_CLAUDE` | `claude-3-7-sonnet-latest` | [Anthropic Models](https://docs.anthropic.com/en/docs/about-claude/models) | +| `CloudModel.OPENAI_GPT` | `gpt-4o-mini` | [OpenAI Models](https://platform.openai.com/docs/models) | +| `CloudModel.GOOGLE_GEMINI` | `gemini-2.5-flash` | [Google Gemini Models](https://ai.google.dev/gemini-api/docs/models/gemini) | + +## Methods + +- **`chat(message)`**: Sends a message and returns the complete response string. Blocks until generation is finished. +- **`chat_stream(message)`**: Returns a generator yielding response tokens as they arrive. +- **`stop_stream()`**: Interrupts an active streaming generation. +- **`with_memory(max_messages)`**: Enables history tracking. `max_messages` defines the context window size. +- **`clear_memory()`**: Resets the conversation history. \ No newline at end of file diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/dbstorage_sqlstore/README.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/dbstorage_sqlstore/README.md similarity index 97% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/dbstorage_sqlstore/README.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/dbstorage_sqlstore/README.md index 704a9e62..53a837d0 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/dbstorage_sqlstore/README.md +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/dbstorage_sqlstore/README.md @@ -35,7 +35,7 @@ db = SQLStore("example.db") # ... Do work # Close database -db.close() +db.stop() ``` To create a new table: @@ -65,4 +65,4 @@ db.store("users", data) The SQLStore automatically creates a directory structure for database storage, placing files in `data/dbstorage_sqlstore/` within your application directory. The brick supports automatic type inference when creating tables, mapping Python types (*int*, *float*, *str*, *bytes*) to corresponding SQLite column types (*INTEGER*, *REAL*, *TEXT*, *BLOB*). -The `store()` method can automatically create tables if they don't exist by analyzing the data types of the provided values. This makes it easy to get started without defining schemas upfront, while still allowing explicit table creation for more control over column definitions and constraints. \ No newline at end of file +The `store()` method can automatically create tables if they don't exist by analyzing the data types of the provided values. This makes it easy to get started without defining schemas upfront, while still allowing explicit table creation for more control over column definitions and constraints. diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/dbstorage_tsstore/README.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/dbstorage_tsstore/README.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/dbstorage_tsstore/README.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/dbstorage_tsstore/README.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/image_classification/README.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/image_classification/README.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/image_classification/README.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/image_classification/README.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/keyword_spotting/README.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/keyword_spotting/README.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/keyword_spotting/README.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/keyword_spotting/README.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/mood_detector/README.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/mood_detector/README.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/mood_detector/README.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/mood_detector/README.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/motion_detection/README.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/motion_detection/README.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/motion_detection/README.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/motion_detection/README.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/object_detection/README.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/object_detection/README.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/object_detection/README.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/object_detection/README.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/streamlit_ui/README.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/streamlit_ui/README.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/streamlit_ui/README.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/streamlit_ui/README.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/vibration_anomaly_detection/README.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/vibration_anomaly_detection/README.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/vibration_anomaly_detection/README.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/vibration_anomaly_detection/README.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/video_image_classification/README.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/video_image_classification/README.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/video_image_classification/README.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/video_image_classification/README.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/video_object_detection/README.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/video_object_detection/README.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/video_object_detection/README.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/video_object_detection/README.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/visual_anomaly_detection/README.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/visual_anomaly_detection/README.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/visual_anomaly_detection/README.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/visual_anomaly_detection/README.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/wave_generator/README.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/wave_generator/README.md new file mode 100644 index 00000000..23a1f9f8 --- /dev/null +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/wave_generator/README.md @@ -0,0 +1,119 @@ +# Wave Generator brick + +This brick provides continuous wave generation for real-time audio synthesis with multiple waveform types and smooth transitions. + +## Overview + +The Wave Generator brick allows you to: + +- Generate continuous audio waveforms in real-time +- Select between different waveform types (sine, square, sawtooth, triangle) +- Control frequency and amplitude dynamically during playback +- Configure smooth transitions with attack, release, and glide (portamento) parameters +- Stream audio to USB speakers with minimal latency + +It runs continuously in a background thread, producing audio blocks at a steady rate with configurable envelope parameters for professional-sounding synthesis. + +## Features + +- Four waveform types: sine, square, sawtooth, and triangle +- Real-time frequency and amplitude control with smooth transitions +- Configurable envelope parameters (attack, release, glide) +- Hardware volume control support +- Thread-safe operation for concurrent access +- Efficient audio generation using NumPy vectorization +- Custom speaker configuration support + +## Prerequisites + +Before using the Wave Generator brick, ensure you have the following: + +- USB-C® Hub with external power supply (5V, 3A) +- USB audio device (USB speaker or USB-C → 3.5mm adapter) +- Arduino UNO Q running in Network Mode or SBC Mode (USB-C port needed for the hub) + +## Code example and usage + +Here is a basic example for generating a 440 Hz sine wave tone: + +```python +from arduino.app_bricks.wave_generator import WaveGenerator +from arduino.app_utils import App + +wave_gen = WaveGenerator() + +App.start_brick(wave_gen) + +# Set frequency to A4 note (440 Hz) +wave_gen.set_frequency(440.0) + +# Set amplitude to 80% +wave_gen.set_amplitude(0.8) + +App.run() +``` + +You can customize the waveform type and envelope parameters: + +```python +wave_gen = WaveGenerator( + wave_type="square", + attack=0.01, + release=0.03, + glide=0.02 +) + +App.start_brick(wave_gen) + +# Change waveform during playback +wave_gen.set_wave_type("triangle") + +# Adjust envelope parameters +wave_gen.set_envelope_params(attack=0.05, release=0.1, glide=0.05) + +App.run() +``` + +For specific hardware configurations, you can provide a custom Speaker instance: + +```python +from arduino.app_bricks.wave_generator import WaveGenerator +from arduino.app_peripherals.speaker import Speaker +from arduino.app_utils import App + +# Create Speaker with optimal real-time configuration +speaker = Speaker( + device=Speaker.USB_SPEAKER_2, + sample_rate=16000, + channels=1, + format="FLOAT_LE", + periodsize=480, # 16000 Hz × 0.03s = 480 frames (eliminates buffer mismatch) + queue_maxsize=10 # Low latency configuration +) + +# Start external Speaker manually (WaveGenerator won't manage its lifecycle) +speaker.start() + +wave_gen = WaveGenerator(sample_rate=16000, speaker=speaker) + +App.start_brick(wave_gen) +wave_gen.set_frequency(440.0) +wave_gen.set_amplitude(0.7) + +App.run() + +# Stop external Speaker manually +speaker.stop() +``` + +**Note:** When providing an external Speaker, you manage its lifecycle (start/stop). WaveGenerator only validates configuration and uses it for playback. + +## Understanding Wave Generation + +The Wave Generator brick produces audio through continuous waveform synthesis. + +The `frequency` parameter controls the pitch of the output sound, measured in Hertz (Hz), where typical audible frequencies range from 20 Hz to 8000 Hz. + +The `amplitude` parameter controls the volume as a value between 0.0 (silent) and 1.0 (maximum), with smooth transitions handled by the attack and release envelope parameters. + +The `glide` parameter (also known as portamento) smoothly transitions between frequencies over time, creating sliding pitch effects similar to a theremin or synthesizer. Setting glide to 0 disables this effect but may cause audible clicks during fast frequency changes. diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/weather_forecast/README.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/weather_forecast/README.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/weather_forecast/README.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/weather_forecast/README.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/web_ui/README.md b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/web_ui/README.md similarity index 100% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/docs/arduino/web_ui/README.md rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/docs/arduino/web_ui/README.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/arduino_cloud/1_led_blink.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/arduino_cloud/1_led_blink.py similarity index 90% rename from internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/arduino_cloud/1_led_blink.py rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/arduino_cloud/1_led_blink.py index 58cd9470..3a9df8ca 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/arduino_cloud/1_led_blink.py +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/arduino_cloud/1_led_blink.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/arduino_cloud/2_light_with_colors_monitor.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/arduino_cloud/2_light_with_colors_monitor.py similarity index 88% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/arduino_cloud/2_light_with_colors_monitor.py rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/arduino_cloud/2_light_with_colors_monitor.py index 40371db7..1fce305b 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/arduino_cloud/2_light_with_colors_monitor.py +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/arduino_cloud/2_light_with_colors_monitor.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/arduino_cloud/3_light_with_colors_command.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/arduino_cloud/3_light_with_colors_command.py similarity index 92% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/arduino_cloud/3_light_with_colors_command.py rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/arduino_cloud/3_light_with_colors_command.py index 5e730ea9..4b8c5bf9 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/arduino_cloud/3_light_with_colors_command.py +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/arduino_cloud/3_light_with_colors_command.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/audio_classification/1_glass_breaking_from_mic.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/audio_classification/1_glass_breaking_from_mic.py similarity index 84% rename from internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/audio_classification/1_glass_breaking_from_mic.py rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/audio_classification/1_glass_breaking_from_mic.py index 36b2be12..1eed6c3a 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/audio_classification/1_glass_breaking_from_mic.py +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/audio_classification/1_glass_breaking_from_mic.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/audio_classification/2_glass_breaking_from_file.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/audio_classification/2_glass_breaking_from_file.py similarity index 60% rename from internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/audio_classification/2_glass_breaking_from_file.py rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/audio_classification/2_glass_breaking_from_file.py index 68bdd710..237aaba1 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/audio_classification/2_glass_breaking_from_file.py +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/audio_classification/2_glass_breaking_from_file.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 @@ -6,7 +6,5 @@ # EXAMPLE_REQUIRES = "Requires an audio file with the glass breaking sound." from arduino.app_bricks.audio_classification import AudioClassification -classifier = AudioClassification() - -classification = classifier.classify_from_file("glass_breaking.wav") +classification = AudioClassification.classify_from_file("glass_breaking.wav") print("Result:", classification) diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/camera_code_detection/1_detection.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/camera_code_detection/1_detection.py similarity index 89% rename from internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/camera_code_detection/1_detection.py rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/camera_code_detection/1_detection.py index 6dfdb41a..1facd326 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/camera_code_detection/1_detection.py +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/camera_code_detection/1_detection.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/camera_code_detection/2_detection_list.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/camera_code_detection/2_detection_list.py similarity index 90% rename from internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/camera_code_detection/2_detection_list.py rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/camera_code_detection/2_detection_list.py index 6288d571..7d63bb46 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/camera_code_detection/2_detection_list.py +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/camera_code_detection/2_detection_list.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/camera_code_detection/3_detection_with_overrides.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/camera_code_detection/3_detection_with_overrides.py similarity index 91% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/camera_code_detection/3_detection_with_overrides.py rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/camera_code_detection/3_detection_with_overrides.py index 8a672470..d128cd96 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/camera_code_detection/3_detection_with_overrides.py +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/camera_code_detection/3_detection_with_overrides.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/cloud_llm/1_simple_prompt.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/cloud_llm/1_simple_prompt.py new file mode 100644 index 00000000..7c325de8 --- /dev/null +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/cloud_llm/1_simple_prompt.py @@ -0,0 +1,24 @@ +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) +# +# SPDX-License-Identifier: MPL-2.0 + +# EXAMPLE_NAME = "Chat with an LLM" +# EXAMPLE_REQUIRES = "Requires a valid API key to a cloud LLM service." + +from arduino.app_bricks.cloud_llm import CloudLLM +from arduino.app_utils import App + +llm = CloudLLM( + api_key="YOUR_API_KEY", # Replace with your actual API key +) + + +def ask_prompt(): + prompt = input("Enter your prompt (or type 'exit' to quit): ") + if prompt.lower() == "exit": + raise StopIteration() + print(llm.chat(prompt)) + print() + + +App.run(ask_prompt) diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/cloud_llm/2_streaming_responses.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/cloud_llm/2_streaming_responses.py new file mode 100644 index 00000000..9538cbda --- /dev/null +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/cloud_llm/2_streaming_responses.py @@ -0,0 +1,25 @@ +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) +# +# SPDX-License-Identifier: MPL-2.0 + +# EXAMPLE_NAME = "Streaming responses from an LLM" +# EXAMPLE_REQUIRES = "Requires a valid API key to a cloud LLM service." + +from arduino.app_bricks.cloud_llm import CloudLLM +from arduino.app_utils import App + +llm = CloudLLM( + api_key="YOUR_API_KEY", # Replace with your actual API key +) + + +def ask_prompt(): + prompt = input("Enter your prompt (or type 'exit' to quit): ") + if prompt.lower() == "exit": + raise StopIteration() + for token in llm.chat_stream(prompt): + print(token, end="", flush=True) + print() + + +App.run(ask_prompt) diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/cloud_llm/3_no_memory.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/cloud_llm/3_no_memory.py new file mode 100644 index 00000000..f30419bf --- /dev/null +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/cloud_llm/3_no_memory.py @@ -0,0 +1,24 @@ +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) +# +# SPDX-License-Identifier: MPL-2.0 + +# EXAMPLE_NAME = "Conversation with memory" +# EXAMPLE_REQUIRES = "Requires a valid API key to a cloud LLM service." + +from arduino.app_bricks.cloud_llm import CloudLLM +from arduino.app_utils import App + +llm = CloudLLM( + api_key="YOUR_API_KEY", # Replace with your actual API key +) +llm.with_memory(0) + + +def ask_prompt(): + prompt = input("Enter your prompt (or type 'exit' to quit): ") + if prompt.lower() == "exit": + raise StopIteration() + print(llm.chat(prompt)) + + +App.run(ask_prompt) diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/dbstorage_sqlstore/store_and_read_example.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/dbstorage_sqlstore/store_and_read_example.py similarity index 85% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/dbstorage_sqlstore/store_and_read_example.py rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/dbstorage_sqlstore/store_and_read_example.py index e3e31edb..54d070cd 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/dbstorage_sqlstore/store_and_read_example.py +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/dbstorage_sqlstore/store_and_read_example.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/dbstorage_tsstore/1_write_read.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/dbstorage_tsstore/1_write_read.py similarity index 84% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/dbstorage_tsstore/1_write_read.py rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/dbstorage_tsstore/1_write_read.py index 9b4185d6..42c19b90 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/dbstorage_tsstore/1_write_read.py +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/dbstorage_tsstore/1_write_read.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/dbstorage_tsstore/2_read_all_samples.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/dbstorage_tsstore/2_read_all_samples.py similarity index 93% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/dbstorage_tsstore/2_read_all_samples.py rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/dbstorage_tsstore/2_read_all_samples.py index 2adee9d9..21ee99a2 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/dbstorage_tsstore/2_read_all_samples.py +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/dbstorage_tsstore/2_read_all_samples.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/image_classification/image_classification_example.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/image_classification/image_classification_example.py similarity index 90% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/image_classification/image_classification_example.py rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/image_classification/image_classification_example.py index 7dd28c57..7597172e 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/image_classification/image_classification_example.py +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/image_classification/image_classification_example.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/keyword_spotting/1_hello_world.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/keyword_spotting/1_hello_world.py similarity index 82% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/keyword_spotting/1_hello_world.py rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/keyword_spotting/1_hello_world.py index b5687f86..346cf45d 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/keyword_spotting/1_hello_world.py +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/keyword_spotting/1_hello_world.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/object_detection/object_detection_example.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/object_detection/object_detection_example.py similarity index 91% rename from internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/object_detection/object_detection_example.py rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/object_detection/object_detection_example.py index f2ca3b9f..166f5b7c 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/object_detection/object_detection_example.py +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/object_detection/object_detection_example.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/visual_anomaly_detection/object_detection_example.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/visual_anomaly_detection/object_detection_example.py similarity index 91% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/visual_anomaly_detection/object_detection_example.py rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/visual_anomaly_detection/object_detection_example.py index 5dc0d2cc..42a8864e 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/visual_anomaly_detection/object_detection_example.py +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/visual_anomaly_detection/object_detection_example.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/wave_generator/01_basic_tone.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/wave_generator/01_basic_tone.py new file mode 100644 index 00000000..5acd492f --- /dev/null +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/wave_generator/01_basic_tone.py @@ -0,0 +1,34 @@ +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) +# +# SPDX-License-Identifier: MPL-2.0 + +""" +Basic Wave Generator Example + +Generates a simple 440Hz sine wave (A4 note) and demonstrates +basic frequency and amplitude control. +""" + +from arduino.app_bricks.wave_generator import WaveGenerator +from arduino.app_utils import App + +# Create wave generator with default settings +wave_gen = WaveGenerator( + sample_rate=16000, + wave_type="sine", + glide=0.02, # 20ms smooth frequency transitions +) + +# Start the generator +App.start_brick(wave_gen) + +# Set initial frequency and amplitude +wave_gen.set_frequency(440.0) # A4 note (440 Hz) +wave_gen.set_amplitude(0.7) # 70% amplitude +wave_gen.set_volume(80) # 80% hardware volume + +print("Playing 440Hz sine wave (A4 note)") +print("Press Ctrl+C to stop") + +# Keep the application running +App.run() diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/wave_generator/02_waveform_types.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/wave_generator/02_waveform_types.py new file mode 100644 index 00000000..320757c3 --- /dev/null +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/wave_generator/02_waveform_types.py @@ -0,0 +1,41 @@ +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) +# +# SPDX-License-Identifier: MPL-2.0 + +""" +Waveform Comparison Example + +Cycles through different waveform types to hear the difference +between sine, square, sawtooth, and triangle waves. +""" + +import time +from arduino.app_bricks.wave_generator import WaveGenerator +from arduino.app_utils import App + +wave_gen = WaveGenerator(sample_rate=16000, glide=0.02) +App.start_brick(wave_gen) + +# Set constant frequency and amplitude +wave_gen.set_frequency(440.0) +wave_gen.set_amplitude(0.6) + +waveforms = ["sine", "square", "sawtooth", "triangle"] + + +def cycle_waveforms(): + """Cycle through different waveform types.""" + for wave_type in waveforms: + print(f"Playing {wave_type} wave...") + wave_gen.set_wave_type(wave_type) + time.sleep(3) + # Silence + wave_gen.set_amplitude(0.0) + time.sleep(2) + + +print("Cycling through waveforms:") +print("sine → square → sawtooth → triangle") +print("Press Ctrl+C to stop") + +App.run(user_loop=cycle_waveforms) diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/wave_generator/03_frequency_sweep.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/wave_generator/03_frequency_sweep.py new file mode 100644 index 00000000..614d9962 --- /dev/null +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/wave_generator/03_frequency_sweep.py @@ -0,0 +1,51 @@ +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) +# +# SPDX-License-Identifier: MPL-2.0 + +""" +Frequency Sweep Example + +Demonstrates smooth frequency transitions (glide/portamento effect) +by sweeping through different frequency ranges. +""" + +import time +from arduino.app_bricks.wave_generator import WaveGenerator +from arduino.app_utils import App + +wave_gen = WaveGenerator( + wave_type="sine", + glide=0.05, # 50ms glide for noticeable portamento +) + +App.start_brick(wave_gen) +wave_gen.set_amplitude(0.7) + + +def frequency_sweep(): + """Sweep through frequency ranges.""" + + # Low to high sweep + print("Sweeping low to high (220Hz → 880Hz)...") + for freq in range(220, 881, 20): + wave_gen.set_frequency(float(freq)) + time.sleep(0.1) + + time.sleep(0.5) + + # High to low sweep + print("Sweeping high to low (880Hz → 220Hz)...") + for freq in range(880, 219, -20): + wave_gen.set_frequency(float(freq)) + time.sleep(0.1) + # Fade out + print("Fading out...") + wave_gen.set_amplitude(0.0) + time.sleep(2) + + +print("Frequency sweep demonstration") +print("Listen for smooth glide between frequencies") +print("Press Ctrl+C to stop") + +App.run(user_loop=frequency_sweep) diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/wave_generator/04_envelope_control.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/wave_generator/04_envelope_control.py new file mode 100644 index 00000000..395099fb --- /dev/null +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/wave_generator/04_envelope_control.py @@ -0,0 +1,63 @@ +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) +# +# SPDX-License-Identifier: MPL-2.0 + +""" +Envelope Control Example + +Demonstrates amplitude envelope control with different +attack and release times for various sonic effects. +""" + +import time +from arduino.app_bricks.wave_generator import WaveGenerator +from arduino.app_utils import App + +wave_gen = WaveGenerator(wave_type="sine") +App.start_brick(wave_gen) + +wave_gen.set_frequency(440.0) +wave_gen.set_volume(80) + + +def envelope_demo(): + """Demonstrate different envelope settings.""" + + # Fast attack, fast release (percussive) + print("1. Percussive (fast attack/release)...") + wave_gen.set_envelope_params(attack=0.001, release=0.01, glide=0.0) + wave_gen.set_amplitude(0.8) + time.sleep(0.5) + wave_gen.set_amplitude(0.0) + time.sleep(1) + + # Slow attack, fast release (pad-like) + print("2. Pad-like (slow attack, fast release)...") + wave_gen.set_envelope_params(attack=0.2, release=0.05, glide=0.0) + wave_gen.set_amplitude(0.8) + time.sleep(1) + wave_gen.set_amplitude(0.0) + time.sleep(1) + + # Fast attack, slow release (sustained) + print("3. Sustained (fast attack, slow release)...") + wave_gen.set_envelope_params(attack=0.01, release=0.3, glide=0.0) + wave_gen.set_amplitude(0.8) + time.sleep(0.5) + wave_gen.set_amplitude(0.0) + time.sleep(1.5) + + # Medium attack and release (balanced) + print("4. Balanced (medium attack/release)...") + wave_gen.set_envelope_params(attack=0.05, release=0.05, glide=0.0) + wave_gen.set_amplitude(0.8) + time.sleep(0.8) + wave_gen.set_amplitude(0.0) + time.sleep(2) + + +print("Envelope Control Demonstration") +print("Listen to different attack/release characteristics") +print("Press Ctrl+C to stop") + +App.run(user_loop=envelope_demo) diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/wave_generator/05_external_speaker.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/wave_generator/05_external_speaker.py new file mode 100644 index 00000000..715e9cc3 --- /dev/null +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/wave_generator/05_external_speaker.py @@ -0,0 +1,77 @@ +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) +# +# SPDX-License-Identifier: MPL-2.0 + +""" +Custom Speaker Configuration Example + +Demonstrates how to use a pre-configured Speaker instance with WaveGenerator. +Use this approach when you need: +- Specific USB speaker selection (USB_SPEAKER_2, etc.) +- Different audio format (S16_LE, etc.) +- Explicit device name ("plughw:CARD=Device,DEV=0") +""" + +import time +from arduino.app_bricks.wave_generator import WaveGenerator +from arduino.app_peripherals.speaker import Speaker +from arduino.app_utils import App + +# List available USB speakers +available_speakers = Speaker.list_usb_devices() +print(f"Available USB speakers: {available_speakers}") + +# Create and configure a Speaker with specific parameters +# For optimal real-time synthesis, align periodsize with WaveGenerator block_duration +block_duration = 0.03 # Default WaveGenerator block duration +sample_rate = 16000 +periodsize = int(sample_rate * block_duration) # 480 frames @ 16kHz + +speaker = Speaker( + device=Speaker.USB_SPEAKER_1, # or explicit device like "plughw:CARD=Device" + sample_rate=sample_rate, + channels=1, + format="FLOAT_LE", + periodsize=periodsize, # Align with WaveGenerator blocks (eliminates glitches) + queue_maxsize=10, # Low latency for real-time audio +) + +# Start the external Speaker manually +# WaveGenerator won't manage its lifecycle (ownership pattern) +speaker.start() + +# Create WaveGenerator with the external speaker +wave_gen = WaveGenerator( + sample_rate=sample_rate, + speaker=speaker, # Pass pre-configured speaker + wave_type="sine", + glide=0.02, +) + +# Start the WaveGenerator (speaker already started above) +App.start_brick(wave_gen) + + +def play_sequence(): + """Play a simple frequency sequence.""" + frequencies = [261.63, 293.66, 329.63, 349.23, 392.00, 440.00, 493.88, 523.25] # C4 to C5 + + for freq in frequencies: + print(f"Playing {freq:.2f} Hz") + wave_gen.set_frequency(freq) + wave_gen.set_amplitude(0.7) + time.sleep(0.5) + + # Fade out + wave_gen.set_amplitude(0.0) + time.sleep(1) + + +print("Playing musical scale with external speaker...") +print("Press Ctrl+C to stop") + +App.run(user_loop=play_sequence) + +# Stop external Speaker manually (WaveGenerator doesn't manage external lifecycle) +speaker.stop() +print("Done") diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/weather_forecast/weather_forecast_by_city_example.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/weather_forecast/weather_forecast_by_city_example.py similarity index 81% rename from internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/weather_forecast/weather_forecast_by_city_example.py rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/weather_forecast/weather_forecast_by_city_example.py index 44241a76..cb9a1081 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/weather_forecast/weather_forecast_by_city_example.py +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/weather_forecast/weather_forecast_by_city_example.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/weather_forecast/weather_forecast_by_coords_example.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/weather_forecast/weather_forecast_by_coords_example.py similarity index 81% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/weather_forecast/weather_forecast_by_coords_example.py rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/weather_forecast/weather_forecast_by_coords_example.py index 740740a3..11b8ca9d 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/weather_forecast/weather_forecast_by_coords_example.py +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/weather_forecast/weather_forecast_by_coords_example.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/web_ui/1_serve_webapp.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/web_ui/1_serve_webapp.py similarity index 80% rename from internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/web_ui/1_serve_webapp.py rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/web_ui/1_serve_webapp.py index 55fb6ca7..4d8768aa 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/web_ui/1_serve_webapp.py +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/web_ui/1_serve_webapp.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/web_ui/2_serve_webapp_and_api.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/web_ui/2_serve_webapp_and_api.py similarity index 79% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/web_ui/2_serve_webapp_and_api.py rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/web_ui/2_serve_webapp_and_api.py index ff1c7cc0..19afb676 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/web_ui/2_serve_webapp_and_api.py +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/web_ui/2_serve_webapp_and_api.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/web_ui/3_connect_disconnect.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/web_ui/3_connect_disconnect.py similarity index 81% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/web_ui/3_connect_disconnect.py rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/web_ui/3_connect_disconnect.py index 0a98cd99..74906149 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/web_ui/3_connect_disconnect.py +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/web_ui/3_connect_disconnect.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/web_ui/4_on_message.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/web_ui/4_on_message.py similarity index 80% rename from internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/web_ui/4_on_message.py rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/web_ui/4_on_message.py index cfec4c7c..7eb1316f 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/web_ui/4_on_message.py +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/web_ui/4_on_message.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/web_ui/5_send_message.py b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/web_ui/5_send_message.py similarity index 80% rename from internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/web_ui/5_send_message.py rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/web_ui/5_send_message.py index 9bb52450..00e19bc7 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/web_ui/5_send_message.py +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/examples/arduino/web_ui/5_send_message.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/models-list.yaml b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/models-list.yaml similarity index 94% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/models-list.yaml rename to debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/models-list.yaml index 7c511011..b4109df2 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/models-list.yaml +++ b/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.6.0/models-list.yaml @@ -18,7 +18,7 @@ models: - yolox-object-detection: runner: brick name : "General purpose object detection - YoloX" - description: "General purpose object detection model based on YoloX Nano. This model is trained on the COCO dataset and can detect 80 different object classes." + description: "General purpose object detection model based on YoloX-Nano. This model is trained on the COCO dataset and can detect 80 different object classes." model_configuration: "EI_OBJ_DETECTION_MODEL": "/models/ootb/ei/yolo-x-nano.eim" model_labels: @@ -105,6 +105,7 @@ models: metadata: source: "edgeimpulse" ei-project-id: 717280 + ei-model-url: "https://studio.edgeimpulse.com/public/717280/live" source-model-id: "YOLOX-Nano" source-model-url: "https://github.com/Megvii-BaseDetection/YOLOX" bricks: @@ -1071,6 +1072,7 @@ models: metadata: source: "edgeimpulse" ei-project-id: 708500 + ei-model-url: "https://studio.edgeimpulse.com/public/708500/live" ei-gpu-mode: true source-model-id: "MobileNetV2" source-model-url: "https://www.tensorflow.org/api_docs/python/tf/keras/applications/MobileNetV2" @@ -1089,9 +1091,10 @@ models: metadata: source: "edgeimpulse" ei-project-id: 755016 + ei-model-url: "https://studio.edgeimpulse.com/public/755016/live" ei-gpu-mode: true source-model-id: "person-classification-wakevision" - source-model-url: "https://studio.edgeimpulse.com/studio/755016" + source-model-url: "https://studio.edgeimpulse.com/public/755016/live" bricks: - arduino:image_classification - arduino:video_image_classification @@ -1103,15 +1106,16 @@ models: "EI_V_ANOMALY_DETECTION_MODEL": "/models/ootb/ei/concrete-crack-anomaly-detection.eim" metadata: source: "edgeimpulse" - ei-project-id: 288658 + ei-project-id: 800941 + ei-model-url: "https://studio.edgeimpulse.com/public/800941/live" source-model-id: "concrete-crack-anomaly-detection" - source-model-url: "https://studio.edgeimpulse.com/public/288658" + source-model-url: "https://studio.edgeimpulse.com/public/800941/live" bricks: - arduino:visual_anomaly_detection - keyword-spotting-hey-arduino: runner: brick name : "Keyword spotting - Hey Arduino!" - description: "A keyword-spotting model to detect the 'Hey Arduino!' in audio recordings" + description: "A keyword-spotting model to detect the 'Hey Arduino!' in audio streams." model_configuration: "EI_KEYWORD_SPOTTING_MODEL": "/models/ootb/ei/keyword-spotting-hey-arduino.eim" model_labels: @@ -1120,12 +1124,14 @@ models: - "other" metadata: source: "edgeimpulse" - ei-project-id: 757509 + ei-project-id: 757509 + ei-model-url: "https://studio.edgeimpulse.com/studio/757509/live" ei-impulse-id: 30 source-model-id: "hey-arduino" - source-model-url: "https://studio.edgeimpulse.com/studio/757509" + source-model-url: "https://studio.edgeimpulse.com/studio/757509/live" + private: true bricks: - - arduino:keyword_spotter + - arduino:keyword_spotting - updown-wave-motion-detection: runner: brick name : "Continuous motion detection" @@ -1140,9 +1146,11 @@ models: metadata: source: "edgeimpulse" ei-project-id: 734960 + ei-model-url: "https://studio.edgeimpulse.com/public/734960/live" source-model-id: "continuous-motion-detection" - source-model-url: "https://studio.edgeimpulse.com/studio/734960" - brick: arduino:motion_detection + source-model-url: "https://studio.edgeimpulse.com/public/734960/live" + bricks: + - arduino:motion_detection - fan-anomaly-detection: runner: brick name : "Fan anomaly detection" @@ -1152,8 +1160,9 @@ models: metadata: source: "edgeimpulse" ei-project-id: 774707 + ei-model-url: "https://studio.edgeimpulse.com/public/774707/live" source-model-id: "fan-anomaly-detection" - source-model-url: "https://studio.edgeimpulse.com/studio/774707" + source-model-url: "https://studio.edgeimpulse.com/public/774707/live" bricks: - arduino:vibration_anomaly_detection - glass-breaking: @@ -1168,7 +1177,9 @@ models: metadata: source: "edgeimpulse" ei-project-id: 749446 + ei-model-url: "https://studio.edgeimpulse.com/public/749446/live" source-model-id: "glass-breaking" - source-model-url: "https://studio.edgeimpulse.com/studio/749446" + source-model-url: "https://studio.edgeimpulse.com/public/749446/live" + private: true bricks: - - arduino:audio_classifier + - arduino:audio_classification diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md new file mode 100644 index 00000000..7ef47fc5 --- /dev/null +++ b/docs/CONTRIBUTING.md @@ -0,0 +1,23 @@ +# Contributor Guide + +Thanks for your interest in contributing to this project! + +There are several ways you can get involved: + +| Type of contribution | Contribution method | +| ----------------------------------------- | ----------------------------------------------- | +| - Support
- Question
- Discussion | Post on the [**Arduino Forum**][forum] | +| - Bug report
- Feature request | Issue report (see the guide [**here**][issues]) | +| Testing | PR review (see the guide [**here**][prs]) | +| - Bug fix
- Enhancement | Pull request (see the guide [**here**][prs]) | +| Monetary | [Buy official products][store] | + +[forum]: https://forum.arduino.cc +[issues]: contributor-guide/issues.md#issue-report-guide +[beta-testing]: contributor-guide/beta-testing.md#beta-testing-guide +[prs]: contributor-guide/pull-requests.md#pull-request-guide +[store]: https://store.arduino.cc + +## Resources + +- [**Development Guide**](contributor-guide/development.md#development-guide) diff --git a/docs/contributor-guide/assets/checks.png b/docs/contributor-guide/assets/checks.png new file mode 100644 index 00000000..888e711b Binary files /dev/null and b/docs/contributor-guide/assets/checks.png differ diff --git a/docs/contributor-guide/development.md b/docs/contributor-guide/development.md new file mode 100644 index 00000000..371ba0a2 --- /dev/null +++ b/docs/contributor-guide/development.md @@ -0,0 +1,70 @@ + + +# Development Guide + +> [!NOTE] +> The `arduino-app-cli` is designed to run on the Board and access peripherals that are not available on a development PC. +> +> For easier testing, using an **Arduino UNO Q** is recommended, as local testing is limited to functionalities that do not require board-specific features. + +## Prerequisites + +The following development tools must be available in your local environment: + +- [Go](https://go.dev/dl/) +- [Docker](https://docs.docker.com/engine/install/) +- [adb client](https://developer.android.com/tools/adb) [optionally] + +## Building the Project + +--- +❗ Building on Windows machines is not supported. +--- + +Build the project (run once): + +- `go tool task init` +- `go tool task build` +- `go tool task generate:assets` to download locally the assets of the [Arduino Bricks](https://github.com/arduino/app-bricks-py) + +Start the arduino-app-cli in daemon mode: + +- `ARDUINO_APP_CLI__DATA_DIR=debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli go tool task start` + +NOTE: only a subset of HTTP APIs are working by running the daemon mode on a development PC. To run Arduino App CLI on the board see the **Running Arduino App CLI on the board** section below. + +## Running Checks + +> [!NOTE] +> Since Arduino App CLI runs on a Debian-based OS, some tests do not work on Windows and macOS + +Checks and tests are set up to ensure the project content is functional and compliant with the established standards. + +- `go tool task fmt-check` +- `go tool task lint` +- `go tool task test` + +In particular, `go tool task test` runs the following tests + +- `test:pkg` which exposes a cross-platform API for working with the board (those should run for every platform) +- `test:internal` runs tests of the internal components, which targets only Linux + +## Running Arduino App CLI on the board + +This is reccomended way to test a local development version of Arduino App CLI on a board. + +1. Connect an [Arduino UNO Q](https://docs.arduino.cc/hardware/uno-q/) board via USB. +1. `go tool task board:install` installs the current version of Arduino App CLI on the board (`adb` is needed). The password of the `arduino` username of the board is requested. + +## Automatic Corrections + +Tools are provided to automatically bring the project into compliance with some of the required checks. + +- `go tool task fmt` + +## Generate API docs + +If a PR, change the HTTP API definitions, the following steps are needed: + +1. Open the `cmd/gendoc/docs.go` and modify/add/remove the definitions +1. Run `go tool task doc` to generate the docs (i.e., the files `internal/api/docs/openapi.yaml` and `internal/e2e/client/client.gen.go` are generated) diff --git a/docs/contributor-guide/issues.md b/docs/contributor-guide/issues.md new file mode 100644 index 00000000..c430864e --- /dev/null +++ b/docs/contributor-guide/issues.md @@ -0,0 +1,33 @@ + + +# Issue Report Guide + +--- + +❗ Do you need help or have a question about using this project? Support requests should be made to the [Arduino Forum](https://forum.arduino.cc). + +--- + +High quality bug reports and feature requests are valuable contributions to this project. These can be made by submitting an issue report to the project's GitHub repository: + +https://github.com/arduino/arduino-app-cli/issues/new/choose + +## Before Reporting an Issue + +- Give the latest development version t (pre-releases) a test drive to see if your issue was already resolved:
+ https://github.com/arduino/arduino-app-cli/releases?q=prerelease%3Atrue +- Search [existing pull requests and issues](https://github.com/arduino/arduino-app-cli/issues?q=) to see if it was already reported.
+ If you have additional information to provide about an existing issue, please comment there instead of creating a duplicate. You can use [GitHub's "Reactions" feature](https://github.blog/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/) if you only want to express support 👍. + +## Qualities of an Excellent Report + +- Concise and descriptive issue title.
+ Vague titles make it difficult to decipher the purpose of the issue when looking through the list of reports, which might result in your issue not being given proper attention. +- Describe the issue and what behavior you were expecting.
+ Include the full and exact text of any relevant error or warning messages you might have encountered. +- Provide a full set of steps necessary to reproduce the issue.
+ Demonstration code or commands should be complete and simplified to the minimum necessary to reproduce the issue. +- Be responsive.
+ We may need you to provide additional information in order to investigate and resolve the issue.
+ Make sure your GitHub account is configured so that you will receive notifications of responses to your issue report. +- If you find a solution to your problem, please comment on your issue report with an explanation of how you were able to fix it, then close the issue. diff --git a/docs/contributor-guide/pull-requests.md b/docs/contributor-guide/pull-requests.md new file mode 100644 index 00000000..0adae385 --- /dev/null +++ b/docs/contributor-guide/pull-requests.md @@ -0,0 +1,199 @@ + + +# Pull Request Guide + +A [**pull request**](https://docs.github.com/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests) (PR) is the mechanism used to propose changes to the content of this project's repository. + +If you are looking for ideas of what to work on, check [the list of open issue reports](https://github.com/arduino/arduino-app-cli/issues). Pull requests addressing any of those bug reports and feature requests are welcome. + +## Contribution Workflow + +Each contribution travels through a formal process which allows it to be efficiently incorporated into the project. + +### 1. Plan + +#### Research + +Start by searching the repository for existing pull requests and issues related to your planned contribution so you can see any related conversations and proposals and avoid duplicate effort: + +https://github.com/arduino/arduino-app-cli/issues?q= + +#### Discussion + +It can sometimes be useful to get feedback from others during the planning process. There are a couple good options for discussing planned development work: + +- Talk with the user community on the [Arduino Forum](https://forum.arduino.cc/). +- Talk with Arduino developers on the [Arduino Developers Mailing List](https://groups.google.com/a/arduino.cc/g/developers). + +### 2. Fork + +Forking a GitHub repository creates a copy of it under your account. You will stage contributions in your fork of this project. + +[More information about forking repositories](https://docs.github.com/get-started/quickstart/fork-a-repo) + +#### Enabling CI in Your Fork + +The repository is configured to run automated [continuous integration](https://wikipedia.org/wiki/Continuous_integration) (CI) checks and tests. It's a good idea to enable CI in your fork so you can make sure your work will pass the checks before you submit a pull request: + +1. Open the homepage of your fork in the browser. +1. Click the "**Actions**" tab. +1. Click the **I understand my workflows, go ahead and enable them** button. +1. Some of the workflows will now need to be activated individually. Perform the following steps for each of the useful workflows listed on the left side of the page that have a "**!**" icon: + 1. Click on the workflow name. + 1. Click the **Enable workflow** button. + +### 3. Clone + +Cloning a repository creates a copy of it on your computer. + +It is possible to make simple changes to your repository using the GitHub web interface without cloning the repository. However, the GitHub web interface is quite limiting so you will likely find the need to work with a clone (using **Git** directly or your choice of [Git client software](https://git-scm.com/downloads/guis)) for any significant development work. + +[More information about cloning repositories](https://git-scm.com/docs/git-clone) + +### 4. Branch + +Create a branch in your fork to contain the changes for your contribution. You must make a separate branch in your fork for each pull request you submit. + +[More information about branches](https://docs.github.com/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-branches) + +### 5. Make a change + +Some things to keep in mind: + +- Make sure your change complies with the project's established style conventions. +- Remember to also update the documentation content in the repository if required by your changes. +- If the project contains a test suite, update or add tests according to your change as appropriate. + +See [the development guide](../development.md#development-guide) for more information. + +### 6. Test + +Test your change carefully to make sure it works correctly and did not break other components of the project. + +As a supplement for general testing, the project is set up with automated checks and tests to facilitate development. + +See [the development guide](../development.md#development-guide) for instructions. + +### 7. Commit + +Once the work on your change is complete, add it to the revision history of the Git repository by making a commit. + +Make sure to follow the [Commit Guidelines](#commit-guidelines). + +[More information about commits](https://git-scm.com/docs/git-commit) + +### 8. Push + +If you're working from a [clone](#3-clone), you will need to push your commit to your fork on GitHub. + +[More information about pushing commits](https://git-scm.com/docs/git-push) + +#### Checking CI Results + +If you have [enabled CI in your repository](#enabling-ci-in-your-fork), GitHub will run the relevant checks automatically every time you push a commit to your fork. + +You can see the results of these checks by doing either of the following: + +- Clicking the status icon (✔️ or ❌) shown to the right of a commit. +- Opening the repository's "**Actions**" tab. + +### 9. Pull request + +A pull request (PR) is a proposal to make a change in a repository. The repository maintainer is able to accept the changes you propose in a pull request by simply clicking a button. + +[More information about pull requests](https://docs.github.com/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests) + +#### Scope + +Each pull request should address a single bug fix or enhancement. If you have multiple unrelated fixes or enhancements to contribute, submit them as separate pull requests. + +#### Description + +Pull request title and description should follow [the same guidelines as commit messages](#commit-message). + +If your pull request fixes an issue in the issue tracker, use [a closing keyword](https://docs.github.com/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword) in the body to indicate this. + +In some cases, it might make sense to request feedback on a proposal before it is ready to be merged. You can indicate this by starting the pull request title with **[WIP]** (work in progress). Once the pull request is ready to be merged, edit the title and remove the "[WIP]". + +#### Cross-repository Contributions + +Some proposals may require changes to multiple repositories. Pull requests should be submitted in parallel to each repository. + +Clearly note any dependencies on other PRs in the description so that these can be evaluated by the reviewer and the merges coordinated. + +--- + +Please check whether any changes are required to the related documentation content hosted in the separate dedicated repositories: + +- [**arduino/docs-content**](https://github.com/arduino/docs-content) +- [**arduino/help-center-content**](https://github.com/arduino/help-center-content) + +### 10. Resolve CI failures + +Relevant checks will run automatically once you have submitted the pull request. Once these checks are finished, you can see a summary of the results near the bottom of the pull request page: + +![checks](assets/checks.png) + +Failed checks will be indicated with an ❌. If any checks failed, please fix whatever caused it to fail. Click the "**Details**" link to the right of the check name to open the logs, which provide details about the failure. + +--- + +**ⓘ** In some rare cases, a CI failure may be unrelated to the changes made in your pull request. So if the information in the logs doesn't seem relevant, please comment on the pull request to ask a maintainer to take a look. + +--- + +When you push to the branch of your fork the pull request was submitted from, the commit is automatically added to the pull request. Don't create a new pull request to fix problems; update the existing pull request. + +### 11. Resolve changes requested from reviews + +Interested parties may review your pull request and suggest improvements. + +To act on general review suggestions, you can add commits to the branch you submitted the pull request from, which will automatically be added to the pull request. Don't create a new pull request to act on review suggestions; update the existing pull request. + +Reviewers may suggest specific changes, which can be applied by [clicking the **Commit suggestion** button](https://docs.github.com/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/incorporating-feedback-in-your-pull-request#applying-suggested-changes). + +[More information about pull request reviews](https://docs.github.com/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/about-pull-request-reviews) + +### 12. Merge + +One of the repository maintainers can now choose to accept your proposed change. Once the pull request is [merged](https://docs.github.com/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/merging-a-pull-request), you can delete the branch you created in your fork for the pull request and delete the fork as well if you like. + +Thanks so much for your contribution! + +--- + +It is possible that the maintainers may decide a pull request doesn't align with Arduino's goals for the project and close it rather than merging. A record of the proposed changes will always be available on GitHub for future reference. If you think your modifications will be of use to others, you are welcome to maintain your own fork of the repository. + +--- + +## Commit Guidelines + +The commit history of a repository is an important resource for developers. Repositories may accumulate thousands of commits over the course of decades. Each individual commit contributes either to the commit history being pleasant and efficient to work with, or to it being a confusing mess. For this reason, it's essential for contributors to create clean, high quality commits. + +### Scope + +Commits must be "atomic". This means that the commit completely accomplishes a single task. Each commit should result in fully functional code. Multiple tasks should not be combined in a single commit, but a single task should not be split over multiple commits (e.g., one commit per file modified is not a good practice). + +[More information about atomic commits](https://www.freshconsulting.com/insights/blog/atomic-commits/) + +### Commit Message + +The commit message documents what the change was and why it was done. A little effort now writing a good commit message can save future developers from wasted time and frustration trying to understand the purpose of a poorly documented commit. + +#### Commit Message Title + +- Use the [imperative mood](https://cbea.ms/git-commit/#imperative) in the title.
+ For example: + > Use LED_BUILTIN macro in LED pin definition +- Capitalize the title. +- Do not end the title with punctuation. +- Do not use GitHub's default commit titles (e.g., "Update examples/Foo/Foo.ino"). + +#### Commit Message Body + +- Separate title from the body with a blank line. If you're committing via GitHub or [GitHub Desktop](https://desktop.github.com/) this will be done automatically. +- Wrap body at 120 characters. +- Completely explain the purpose of the commit.
+ Include a rationale for the change, any caveats, side-effects, etc. + +[More information on commit messages](https://cbea.ms/git-commit/) diff --git a/docs/user-documentation.md b/docs/user-documentation.md new file mode 100644 index 00000000..ba6d15b5 --- /dev/null +++ b/docs/user-documentation.md @@ -0,0 +1,62 @@ +# Arduino App CLI + +## Environment Variables + +The following environment variables are used to configure Arduino App CLI: + +| Environment Variable | Default Value | Description | +| -------------------------------------- | ------------------------------------------------ | ---------------------------------------------------------------------------------- | +| `ARDUINO_APP_CLI__APPS_DIR` | `/home/arduino/ArduinoApps` | Path to the directory where Arduino Apps created by the user are stored | +| `ARDUINO_APP_CLI__DATA_DIR` | `/home/arduino/.local/share/arduino-app-cli` | Path to the directory where internal data is stored (examples, assets, properties) | +| `ARDUINO_APP_BRICKS__CUSTOM_MODEL_DIR` | `$HOME/.arduino-bricks/ei-models` | Path to the directory where custom AI models are stored | +| `ARDUINO_APP_CLI__ALLOW_ROOT` | `false` | Allow running `arduino-app-cli` as root (**Not recommended to set to true**) | +| `LIBRARIES_API_URL` | `https://api2.arduino.cc/libraries/v1/libraries` | URL of the external service used to search Arduino libraries | +| `DOCKER_REGISTRY_BASE` | `ghcr.io/arduino/` | Docker registry used to pull docker images | +| `DOCKER_PYTHON_BASE_IMAGE` | `app-bricks/python-apps-base:` | Tag of the Docker image for the Python runner | + +## Directory Structures + +Examples of user-defined Arduino Apps stored under the `ARDUINO_APP_CLI__APPS_DIR` folder. + +``` +├── my-first-app +│   ├── app.yaml +│   ├── README.md +│   ├── python +│   │   └── main.py +│   ├── sketch +│   │ ├── sketch.ino +│   │ └── sketch.yaml +| └── .cache/ # Temporary files and dependencies of the App +└── my-second-app + ├── app.yaml + ├── python +    └── main.py +``` + +Examples of the `assets` and the builtin `examples` stored under the `ARDUINO_APP_CLI__DATA_DIR` folder. + +``` +/home/arduino/.local/share/arduino-app-cli/ +├── assets +│   └── 0.5.0 # Version-specific assets +│   ├── bricks-list.yaml # Available bricks +│   ├── models-list.yaml # Available models +│   └── ... +├── bootloader_burned.flag +├── default.app # Default App +├── properties.msgpack # Variable values +├── examples # Built-in App examples +│   ├── air-quality-monitoring +│   │   ├── app.yaml +│   │   ├── assets +│   │   ├── python +│   │   ├── README.md +│   │   └── sketch +│   ├── anomaly-detection +│   │   ├── app.yaml +│   │   ├── assets +│   │   ├── python +│   │   └── README.md +│   └── ... +``` diff --git a/go.mod b/go.mod index be40aceb..e28dc683 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ replace ( ) // Required until https://github.com/arduino/arduino-cli/pull/3019 is merged and released -replace github.com/arduino/arduino-cli => github.com/cmaglie/arduino-cli v0.0.0-20251006122726-27fe68b0a18a +replace github.com/arduino/arduino-cli => github.com/cmaglie/arduino-cli v0.0.0-20251112150352-0d62cc4d0b45 require ( github.com/Andrew-M-C/go.emoji v1.1.4 @@ -48,9 +48,9 @@ require ( go.bug.st/cleanup v1.0.0 go.bug.st/f v0.4.0 go.bug.st/relaxed-semver v0.15.0 - golang.org/x/crypto v0.41.0 + golang.org/x/crypto v0.42.0 golang.org/x/sync v0.17.0 - golang.org/x/text v0.29.0 + golang.org/x/text v0.30.0 ) require ( @@ -129,10 +129,10 @@ require ( github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/fvbommel/sortorder v1.1.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect - github.com/getkin/kin-openapi v0.132.0 // indirect + github.com/getkin/kin-openapi v0.133.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.6.2 // indirect - github.com/go-git/go-git/v5 v5.16.2 // indirect + github.com/go-git/go-git/v5 v5.16.3 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect @@ -206,7 +206,7 @@ require ( github.com/morikuni/aec v1.0.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect - github.com/oapi-codegen/oapi-codegen/v2 v2.5.0 // indirect + github.com/oapi-codegen/oapi-codegen/v2 v2.5.1 // indirect github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 // indirect github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect @@ -225,7 +225,7 @@ require ( github.com/prometheus/procfs v0.15.1 // indirect github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/sagikazarmark/locafero v0.7.0 // indirect + github.com/sagikazarmark/locafero v0.11.0 // indirect github.com/sajari/fuzzy v1.0.0 // indirect github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 // indirect github.com/schollz/closestmatch v2.1.0+incompatible // indirect @@ -235,13 +235,13 @@ require ( github.com/shibumi/go-pathspec v1.3.0 // indirect github.com/skeema/knownhosts v1.3.1 // indirect github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 // indirect - github.com/sourcegraph/conc v0.3.0 // indirect + github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect github.com/speakeasy-api/jsonpath v0.6.0 // indirect github.com/speakeasy-api/openapi-overlay v0.10.2 // indirect - github.com/spf13/afero v1.12.0 // indirect - github.com/spf13/cast v1.7.1 // indirect - github.com/spf13/pflag v1.0.9 // indirect - github.com/spf13/viper v1.20.1 // indirect + github.com/spf13/afero v1.15.0 // indirect + github.com/spf13/cast v1.10.0 // indirect + github.com/spf13/pflag v1.0.10 // indirect + github.com/spf13/viper v1.21.0 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/swaggest/refl v1.4.0 // indirect @@ -257,6 +257,7 @@ require ( github.com/ulikunitz/xz v0.5.15 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect github.com/vmware-labs/yaml-jsonpath v0.3.2 // indirect + github.com/woodsbury/decimal128 v1.3.0 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect @@ -283,20 +284,19 @@ require ( go.opentelemetry.io/otel/sdk/metric v1.37.0 // indirect go.opentelemetry.io/otel/trace v1.37.0 // indirect go.opentelemetry.io/proto/otlp v1.5.0 // indirect - go.uber.org/atomic v1.9.0 // indirect go.uber.org/mock v0.5.2 // indirect - go.uber.org/multierr v1.9.0 // indirect - golang.org/x/mod v0.27.0 // indirect - golang.org/x/net v0.43.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/mod v0.28.0 // indirect + golang.org/x/net v0.44.0 // indirect golang.org/x/oauth2 v0.30.0 // indirect - golang.org/x/sys v0.36.0 // indirect - golang.org/x/term v0.35.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/term v0.36.0 // indirect golang.org/x/time v0.11.0 // indirect - golang.org/x/tools v0.36.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect - google.golang.org/grpc v1.75.1 // indirect - google.golang.org/protobuf v1.36.9 // indirect + golang.org/x/tools v0.37.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b // indirect + google.golang.org/grpc v1.76.0 // indirect + google.golang.org/protobuf v1.36.10 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/go.sum b/go.sum index 98b1009f..535ebe39 100644 --- a/go.sum +++ b/go.sum @@ -170,8 +170,8 @@ github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004 h1:lkAMpLVBDaj17e github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004/go.mod h1:yMWuSON2oQp+43nFtAV/uvKQIFpSPerB57DCt9t8sSA= github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= -github.com/cmaglie/arduino-cli v0.0.0-20251006122726-27fe68b0a18a h1:xjGwmLNEUTb+QWUmUxwrb24Awbt4/rdpFG7lVUR3skI= -github.com/cmaglie/arduino-cli v0.0.0-20251006122726-27fe68b0a18a/go.mod h1:aH/Lfub80ymf3vpF0gUWx/sckVUNB0gDoPlABAx97SE= +github.com/cmaglie/arduino-cli v0.0.0-20251112150352-0d62cc4d0b45 h1:dBBw3070OvawAfcJMz7o+mOfZAR6O5DzUKdqV1C5Cmg= +github.com/cmaglie/arduino-cli v0.0.0-20251112150352-0d62cc4d0b45/go.mod h1:V7Rm93M89nl4hdOXQ47aj/jvEkxfWVwDYiav6i0UOkk= github.com/cmaglie/pb v1.0.27 h1:ynGj8vBXR+dtj4B7Q/W/qGt31771Ux5iFfRQBnwdQiA= github.com/cmaglie/pb v1.0.27/go.mod h1:GilkKZMXYjBA4NxItWFfO+lwkp59PLHQ+IOW/b/kmZI= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -310,8 +310,8 @@ github.com/fvbommel/sortorder v1.1.0 h1:fUmoe+HLsBTctBDoaBwpQo5N+nrCp8g/BjKb/6ZQ github.com/fvbommel/sortorder v1.1.0/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= -github.com/getkin/kin-openapi v0.132.0 h1:3ISeLMsQzcb5v26yeJrBcdTCEQTag36ZjaGk7MIRUwk= -github.com/getkin/kin-openapi v0.132.0/go.mod h1:3OlG51PCYNsPByuiMB0t4fjnNlIDnaEDsjiKUV8nL58= +github.com/getkin/kin-openapi v0.133.0 h1:pJdmNohVIJ97r4AUFtEXRXwESr8b0bD721u/Tz6k8PQ= +github.com/getkin/kin-openapi v0.133.0/go.mod h1:boAciF6cXk5FhPqe/NQeBTeenbjqU4LhWBf09ILVvWE= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= @@ -321,8 +321,8 @@ github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UN github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.16.2 h1:fT6ZIOjE5iEnkzKyxTHK1W4HGAsPhqEqiSAssSO77hM= -github.com/go-git/go-git/v5 v5.16.2/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8= +github.com/go-git/go-git/v5 v5.16.3 h1:Z8BtvxZ09bYm/yYNgPKCzgWtaRqDTgIKRgIRHBfU6Z8= +github.com/go-git/go-git/v5 v5.16.3/go.mod h1:4Ge4alE/5gPs30F2H1esi2gPd69R0C39lolkucHBOp8= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -676,8 +676,8 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLA github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oapi-codegen/oapi-codegen/v2 v2.5.0 h1:iJvF8SdB/3/+eGOXEpsWkD8FQAHj6mqkb6Fnsoc8MFU= -github.com/oapi-codegen/oapi-codegen/v2 v2.5.0/go.mod h1:fwlMxUEMuQK5ih9aymrxKPQqNm2n8bdLk1ppjH+lr9w= +github.com/oapi-codegen/oapi-codegen/v2 v2.5.1 h1:5vHNY1uuPBRBWqB2Dp0G7YB03phxLQZupZTIZaeorjc= +github.com/oapi-codegen/oapi-codegen/v2 v2.5.1/go.mod h1:ro0npU1BWkcGpCgGD9QwPp44l5OIZ94tB3eabnT7DjQ= github.com/oapi-codegen/runtime v1.1.1 h1:EXLHh0DXIJnWhdRPN2w4MXAzFyE4CskzhNLUmtpMYro= github.com/oapi-codegen/runtime v1.1.1/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg= github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 h1:G7ERwszslrBzRxj//JalHPu/3yz+De2J+4aLtSRlHiY= @@ -771,8 +771,8 @@ github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo= -github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k= +github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDcg+AAIFXc= +github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik= github.com/sajari/fuzzy v1.0.0 h1:+FmwVvJErsd0d0hAPlj4CxqxUtQY/fOoY0DwX4ykpRY= github.com/sajari/fuzzy v1.0.0/go.mod h1:OjYR6KxoWOe9+dOlXeiCJd4dIbED4Oo8wpS89o0pwOo= github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 h1:PKK9DyHxif4LZo+uQSgXNqs0jj5+xZwwfKHgph2lxBw= @@ -814,8 +814,8 @@ github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYl github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg= github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM= -github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= -github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw= +github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U= github.com/spdx/tools-golang v0.5.5 h1:61c0KLfAcNqAjlg6UNMdkwpMernhw3zVRwDZ2x9XOmk= github.com/spdx/tools-golang v0.5.5/go.mod h1:MVIsXx8ZZzaRWNQpUDhC4Dud34edUYJYecciXgrw5vE= github.com/speakeasy-api/jsonpath v0.6.0 h1:IhtFOV9EbXplhyRqsVhHoBmmYjblIRh5D1/g8DHMXJ8= @@ -823,12 +823,12 @@ github.com/speakeasy-api/jsonpath v0.6.0/go.mod h1:ymb2iSkyOycmzKwbEAYPJV/yi2rSm github.com/speakeasy-api/openapi-overlay v0.10.2 h1:VOdQ03eGKeiHnpb1boZCGm7x8Haj6gST0P3SGTX95GU= github.com/speakeasy-api/openapi-overlay v0.10.2/go.mod h1:n0iOU7AqKpNFfEt6tq7qYITC4f0yzVVdFw0S7hukemg= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= -github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4= +github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= +github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= github.com/spf13/cast v0.0.0-20150508191742-4d07383ffe94/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= -github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= +github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= github.com/spf13/cobra v0.0.1/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s= @@ -837,12 +837,13 @@ github.com/spf13/jwalterweatherman v0.0.0-20141219030609-3d60171a6431/go.mod h1: github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.0/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY= github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v0.0.0-20150530192845-be5ff3e4840c/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4= -github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= +github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= +github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -909,6 +910,8 @@ github.com/warthog618/go-gpiocdev v0.9.1 h1:pwHPaqjJfhCipIQl78V+O3l9OKHivdRDdmgX github.com/warthog618/go-gpiocdev v0.9.1/go.mod h1:dN3e3t/S2aSNC+hgigGE/dBW8jE1ONk9bDSEYfoPyl8= github.com/warthog618/go-gpiosim v0.1.1 h1:MRAEv+T+itmw+3GeIGpQJBfanUVyg0l3JCTwHtwdre4= github.com/warthog618/go-gpiosim v0.1.1/go.mod h1:YXsnB+I9jdCMY4YAlMSRrlts25ltjmuIsrnoUrBLdqU= +github.com/woodsbury/decimal128 v1.3.0 h1:8pffMNWIlC0O5vbyHWFZAt5yWvWcrHA+3ovIIjVWss0= +github.com/woodsbury/decimal128 v1.3.0/go.mod h1:C5UTmyTjW3JftjUFzOVhC20BEQa2a4ZKOB5I6Zjb+ds= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= @@ -993,16 +996,14 @@ go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXe go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= -go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko= go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= -go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -1017,8 +1018,8 @@ golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= -golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= +golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= +golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1055,8 +1056,8 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ= -golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc= +golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U= +golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1101,8 +1102,8 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= -golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= +golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I= +golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1197,13 +1198,13 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= -golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ= -golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA= +golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1214,8 +1215,8 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= -golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1275,8 +1276,8 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= -golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= +golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE= +golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1353,10 +1354,10 @@ google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 h1:FiusG7LWj+4byqhbvmB+Q93B/mOxJLN2DTozDuZm4EU= -google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:kXqgZtrWaf6qS3jZOCnCH7WYfrvFjkC51bM8fz3RsCA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b h1:ULiyYQ0FdsJhwwZUwbaXpZF5yUE3h+RA+gxvBu37ucc= +google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b/go.mod h1:oDOGiMSXHL4sDTJvFvIB9nRQCGdLP1o/iVaqQK8zB+M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b h1:zPKJod4w6F1+nRGDI9ubnXYhU9NSWoFAijkHkUXeTK8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.0.5/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -1378,8 +1379,8 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.75.1 h1:/ODCNEuf9VghjgO3rqLcfg8fiOP0nSluljWFlDxELLI= -google.golang.org/grpc v1.75.1/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A= +google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94ULZ6c= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1392,8 +1393,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw= -google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/cenkalti/backoff.v2 v2.2.1 h1:eJ9UAg01/HIHG987TwxvnzK2MgxXq97YY6rYDpY9aII= diff --git a/internal/api/api.go b/internal/api/api.go index 08d31d84..65c66771 100644 --- a/internal/api/api.go +++ b/internal/api/api.go @@ -81,7 +81,7 @@ func NewHTTPRouter( mux.Handle("POST /v1/apps/{appID}/start", handlers.HandleAppStart(dockerClient, provisioner, modelsIndex, bricksIndex, idProvider, cfg, staticStore)) mux.Handle("POST /v1/apps/{appID}/stop", handlers.HandleAppStop(dockerClient, idProvider)) mux.Handle("POST /v1/apps/{appID}/clone", handlers.HandleAppClone(dockerClient, idProvider, cfg)) - mux.Handle("DELETE /v1/apps/{appID}", handlers.HandleAppDelete(idProvider)) + mux.Handle("DELETE /v1/apps/{appID}", handlers.HandleAppDelete(dockerClient, idProvider)) mux.Handle("GET /v1/apps/{appID}/exposed-ports", handlers.HandleAppPorts(bricksIndex, idProvider)) mux.Handle("PUT /v1/apps/{appID}/sketch/libraries/{libRef}", handlers.HandleSketchAddLibrary(idProvider)) mux.Handle("DELETE /v1/apps/{appID}/sketch/libraries/{libRef}", handlers.HandleSketchRemoveLibrary(idProvider)) diff --git a/internal/api/docs/openapi.yaml b/internal/api/docs/openapi.yaml index f2b3a999..fdecc22d 100644 --- a/internal/api/docs/openapi.yaml +++ b/internal/api/docs/openapi.yaml @@ -45,12 +45,6 @@ paths: description: Creates a new app in the default app location. operationId: createApp parameters: - - description: If true, the app will not be created with the python part. - in: query - name: skip-python - schema: - description: If true, the app will not be created with the python part. - type: boolean - description: If true, the app will not be created with the sketch part. in: query name: skip-sketch @@ -1147,6 +1141,15 @@ components: $ref: '#/components/schemas/ErrorResponse' description: Precondition Failed schemas: + AIModel: + properties: + description: + type: string + id: + type: string + name: + type: string + type: object AIModelItem: properties: brick_ids: @@ -1183,7 +1186,7 @@ components: properties: bricks: items: - $ref: '#/components/schemas/BrickInstance' + $ref: '#/components/schemas/BrickInstanceListItem' nullable: true type: array type: object @@ -1195,6 +1198,8 @@ components: type: string name: type: string + require_model: + type: boolean required: - id - name @@ -1310,6 +1315,16 @@ components: $ref: '#/components/schemas/CodeExample' nullable: true type: array + compatible_models: + items: + $ref: '#/components/schemas/AIModel' + nullable: true + type: array + config_variables: + items: + $ref: '#/components/schemas/BrickConfigVariable' + nullable: true + type: array description: type: string id: @@ -1318,6 +1333,8 @@ components: type: string readme: type: string + require_model: + type: boolean status: type: string used_by_apps: @@ -1328,6 +1345,9 @@ components: variables: additionalProperties: $ref: '#/components/schemas/BrickVariable' + description: 'Deprecated: use config_variables instead. This field is kept + for backward compatibility.' + nullable: true type: object type: object BrickInstance: @@ -1336,6 +1356,11 @@ components: type: string category: type: string + compatible_models: + items: + $ref: '#/components/schemas/AIModel' + nullable: true + type: array config_variables: items: $ref: '#/components/schemas/BrickConfigVariable' @@ -1346,6 +1371,35 @@ components: type: string name: type: string + require_model: + type: boolean + status: + type: string + variables: + additionalProperties: + type: string + description: 'Deprecated: use config_variables instead. This field is kept + for backward compatibility.' + type: object + type: object + BrickInstanceListItem: + properties: + author: + type: string + category: + type: string + config_variables: + items: + $ref: '#/components/schemas/BrickConfigVariable' + type: array + id: + type: string + model: + type: string + name: + type: string + require_model: + type: boolean status: type: string variables: @@ -1365,13 +1419,10 @@ components: type: string id: type: string - models: - items: - type: string - nullable: true - type: array name: type: string + require_model: + type: boolean status: type: string type: object diff --git a/internal/api/handlers/app_create.go b/internal/api/handlers/app_create.go index ed26ee61..9e757bfe 100644 --- a/internal/api/handlers/app_create.go +++ b/internal/api/handlers/app_create.go @@ -44,17 +44,9 @@ func HandleAppCreate( defer r.Body.Close() queryParams := r.URL.Query() - skipPythonStr := queryParams.Get("skip-python") skipSketchStr := queryParams.Get("skip-sketch") - - skipPython := queryParamsValidator(skipPythonStr) skipSketch := queryParamsValidator(skipSketchStr) - if skipPython && skipSketch { - render.EncodeResponse(w, http.StatusBadRequest, models.ErrorResponse{Details: "cannot skip both python and sketch"}) - return - } - var req CreateAppRequest if err := json.NewDecoder(r.Body).Decode(&req); err != nil { slog.Error("unable to decode app create request", slog.String("error", err.Error())) @@ -68,7 +60,6 @@ func HandleAppCreate( Name: req.Name, Icon: req.Icon, Description: req.Description, - SkipPython: skipPython, SkipSketch: skipSketch, }, idProvider, diff --git a/internal/api/handlers/app_delete.go b/internal/api/handlers/app_delete.go index 864dd405..99d72cf1 100644 --- a/internal/api/handlers/app_delete.go +++ b/internal/api/handlers/app_delete.go @@ -19,13 +19,18 @@ import ( "log/slog" "net/http" + "github.com/docker/cli/cli/command" + "github.com/arduino/arduino-app-cli/internal/api/models" "github.com/arduino/arduino-app-cli/internal/orchestrator" "github.com/arduino/arduino-app-cli/internal/orchestrator/app" "github.com/arduino/arduino-app-cli/internal/render" ) -func HandleAppDelete(idProvider *app.IDProvider) http.HandlerFunc { +func HandleAppDelete( + dockerClient command.Cli, + idProvider *app.IDProvider, +) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { id, err := idProvider.IDFromBase64(r.PathValue("appID")) if err != nil { @@ -37,14 +42,14 @@ func HandleAppDelete(idProvider *app.IDProvider) http.HandlerFunc { return } - app, err := app.Load(id.ToPath().String()) + app, err := app.Load(id.ToPath()) if err != nil { slog.Error("Unable to parse the app.yaml", slog.String("error", err.Error()), slog.String("path", id.String())) render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"}) return } - err = orchestrator.DeleteApp(r.Context(), app) + err = orchestrator.DeleteApp(r.Context(), dockerClient, app) if err != nil { slog.Error("Unable to delete the app", slog.String("error", err.Error())) render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to delete the app"}) diff --git a/internal/api/handlers/app_details.go b/internal/api/handlers/app_details.go index 72c74bdd..1795ae42 100644 --- a/internal/api/handlers/app_details.go +++ b/internal/api/handlers/app_details.go @@ -45,7 +45,7 @@ func HandleAppDetails( return } - app, err := app.Load(id.ToPath().String()) + app, err := app.Load(id.ToPath()) if err != nil { slog.Error("Unable to parse the app.yaml", slog.String("error", err.Error()), slog.String("path", id.String())) render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"}) @@ -81,7 +81,7 @@ func HandleAppDetailsEdits( render.EncodeResponse(w, http.StatusPreconditionFailed, models.ErrorResponse{Details: "invalid id"}) return } - appToEdit, err := app.Load(id.ToPath().String()) + appToEdit, err := app.Load(id.ToPath()) if err != nil { slog.Error("Unable to parse the app.yaml", slog.String("error", err.Error()), slog.String("path", id.String())) render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"}) diff --git a/internal/api/handlers/app_logs.go b/internal/api/handlers/app_logs.go index 2cf44c87..0fece050 100644 --- a/internal/api/handlers/app_logs.go +++ b/internal/api/handlers/app_logs.go @@ -43,7 +43,7 @@ func HandleAppLogs( return } - app, err := app.Load(id.ToPath().String()) + app, err := app.Load(id.ToPath()) if err != nil { slog.Error("Unable to parse the app.yaml", slog.String("error", err.Error()), slog.String("path", id.String())) render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"}) diff --git a/internal/api/handlers/app_ports.go b/internal/api/handlers/app_ports.go index 8671cd7e..c405c3a3 100644 --- a/internal/api/handlers/app_ports.go +++ b/internal/api/handlers/app_ports.go @@ -47,7 +47,7 @@ func HandleAppPorts( return } - app, err := app.Load(id.ToPath().String()) + app, err := app.Load(id.ToPath()) if err != nil { slog.Error("Unable to parse the app.yaml", slog.String("error", err.Error()), slog.String("path", id.String())) render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"}) diff --git a/internal/api/handlers/app_sketch_libs.go b/internal/api/handlers/app_sketch_libs.go index 43969572..7e280a2f 100644 --- a/internal/api/handlers/app_sketch_libs.go +++ b/internal/api/handlers/app_sketch_libs.go @@ -36,7 +36,7 @@ func HandleSketchAddLibrary(idProvider *app.IDProvider) http.HandlerFunc { render.EncodeResponse(w, http.StatusBadRequest, models.ErrorResponse{Details: "cannot alter examples"}) return } - app, err := app.Load(id.ToPath().String()) + app, err := app.Load(id.ToPath()) // Get query param addDeps (default false) addDeps, _ := strconv.ParseBool(r.URL.Query().Get("add_deps")) @@ -78,7 +78,7 @@ func HandleSketchRemoveLibrary(idProvider *app.IDProvider) http.HandlerFunc { render.EncodeResponse(w, http.StatusBadRequest, models.ErrorResponse{Details: "cannot alter examples"}) return } - app, err := app.Load(id.ToPath().String()) + app, err := app.Load(id.ToPath()) if err != nil { render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"}) return @@ -114,7 +114,7 @@ func HandleSketchListLibraries(idProvider *app.IDProvider) http.HandlerFunc { render.EncodeResponse(w, http.StatusPreconditionFailed, models.ErrorResponse{Details: "invalid id"}) return } - app, err := app.Load(id.ToPath().String()) + app, err := app.Load(id.ToPath()) if err != nil { render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"}) return diff --git a/internal/api/handlers/app_start.go b/internal/api/handlers/app_start.go index 0293aff0..bfd8a034 100644 --- a/internal/api/handlers/app_start.go +++ b/internal/api/handlers/app_start.go @@ -47,7 +47,7 @@ func HandleAppStart( return } - app, err := app.Load(id.ToPath().String()) + app, err := app.Load(id.ToPath()) if err != nil { slog.Error("Unable to parse the app.yaml", slog.String("error", err.Error()), slog.String("path", id.String())) render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"}) diff --git a/internal/api/handlers/app_stop.go b/internal/api/handlers/app_stop.go index 0b9ec8c0..a013ef9e 100644 --- a/internal/api/handlers/app_stop.go +++ b/internal/api/handlers/app_stop.go @@ -38,7 +38,7 @@ func HandleAppStop( return } - app, err := app.Load(id.ToPath().String()) + app, err := app.Load(id.ToPath()) if err != nil { slog.Error("Unable to parse the app.yaml", slog.String("error", err.Error()), slog.String("path", id.String())) render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"}) @@ -60,7 +60,7 @@ func HandleAppStop( type log struct { Message string `json:"message"` } - for item := range orchestrator.StopApp(r.Context(), app) { + for item := range orchestrator.StopApp(r.Context(), dockerClient, app) { switch item.GetType() { case orchestrator.ProgressType: sseStream.Send(render.SSEEvent{Type: "progress", Data: progress(*item.GetProgress())}) diff --git a/internal/api/handlers/bricks.go b/internal/api/handlers/bricks.go index 7e95753a..f3d22c6d 100644 --- a/internal/api/handlers/bricks.go +++ b/internal/api/handlers/bricks.go @@ -55,7 +55,7 @@ func HandleAppBrickInstancesList( } appPath := appId.ToPath() - app, err := app.Load(appPath.String()) + app, err := app.Load(appPath) if err != nil { slog.Error("Unable to parse the app.yaml", slog.String("error", err.Error()), slog.String("path", appId.String())) render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"}) @@ -85,7 +85,7 @@ func HandleAppBrickInstanceDetails( } appPath := appId.ToPath() - app, err := app.Load(appPath.String()) + app, err := app.Load(appPath) if err != nil { slog.Error("Unable to parse the app.yaml", slog.String("error", err.Error()), slog.String("path", appId.String())) render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"}) @@ -120,7 +120,7 @@ func HandleBrickCreate( } appPath := appId.ToPath() - app, err := app.Load(appPath.String()) + app, err := app.Load(appPath) if err != nil { slog.Error("Unable to parse the app.yaml", slog.String("error", err.Error()), slog.String("path", appId.String())) render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"}) @@ -146,7 +146,7 @@ func HandleBrickCreate( err = brickService.BrickCreate(req, app) if err != nil { // TODO: handle specific errors - slog.Error("Unable to parse the app.yaml", slog.String("error", err.Error())) + slog.Error("Unable to create brick", slog.String("error", err.Error())) render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "error while creating or updating brick"}) return } @@ -190,7 +190,7 @@ func HandleBrickUpdates( } appPath := appId.ToPath() - app, err := app.Load(appPath.String()) + app, err := app.Load(appPath) if err != nil { slog.Error("Unable to parse the app.yaml", slog.String("error", err.Error()), slog.String("path", appId.String())) render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"}) @@ -213,7 +213,7 @@ func HandleBrickUpdates( req.ID = id err = brickService.BrickUpdate(req, app) if err != nil { - slog.Error("Unable to parse the app.yaml", slog.String("error", err.Error())) + slog.Error("Unable to update the brick", slog.String("error", err.Error())) render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to update the brick"}) return @@ -236,7 +236,7 @@ func HandleBrickDelete( } appPath := appId.ToPath() - app, err := app.Load(appPath.String()) + app, err := app.Load(appPath) if err != nil { slog.Error("Unable to parse the app.yaml", slog.String("error", err.Error()), slog.String("path", appId.String())) render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "unable to find the app"}) diff --git a/internal/api/handlers/update.go b/internal/api/handlers/update.go index 41ac992b..49ec1b29 100644 --- a/internal/api/handlers/update.go +++ b/internal/api/handlers/update.go @@ -16,7 +16,6 @@ package handlers import ( - "errors" "net/http" "strings" @@ -43,14 +42,20 @@ func HandleCheckUpgradable(updater *update.Manager) http.HandlerFunc { pkgs, err := updater.ListUpgradablePackages(r.Context(), filterFunc) if err != nil { - if errors.Is(err, update.ErrOperationAlreadyInProgress) { - render.EncodeResponse(w, http.StatusConflict, models.ErrorResponse{Details: err.Error()}) + code := update.GetUpdateErrorCode(err) + if code == update.OperationInProgressCode { + render.EncodeResponse(w, http.StatusConflict, models.ErrorResponse{ + Code: string(code), + Details: err.Error(), + }) return } - render.EncodeResponse(w, http.StatusBadRequest, models.ErrorResponse{Details: "Error checking for upgradable packages: " + err.Error()}) + render.EncodeResponse(w, http.StatusBadRequest, models.ErrorResponse{ + Code: string(code), + Details: err.Error(), + }) return } - if len(pkgs) == 0 { render.EncodeResponse(w, http.StatusNoContent, nil) return @@ -79,27 +84,40 @@ func HandleUpdateApply(updater *update.Manager) http.HandlerFunc { pkgs, err := updater.ListUpgradablePackages(r.Context(), filterFunc) if err != nil { - if errors.Is(err, update.ErrOperationAlreadyInProgress) { - render.EncodeResponse(w, http.StatusConflict, models.ErrorResponse{Details: err.Error()}) + code := update.GetUpdateErrorCode(err) + if code == update.OperationInProgressCode { + render.EncodeResponse(w, http.StatusConflict, models.ErrorResponse{ + Code: string(code), + Details: err.Error(), + }) return } slog.Error("Unable to get upgradable packages", slog.String("error", err.Error())) - render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "Error checking for upgradable packages"}) + render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{ + Code: string(code), + Details: err.Error(), + }) return } - if len(pkgs) == 0 { - render.EncodeResponse(w, http.StatusNoContent, models.ErrorResponse{Details: "System is up to date, no upgradable packages found"}) + render.EncodeResponse(w, http.StatusNoContent, nil) return } err = updater.UpgradePackages(r.Context(), pkgs) if err != nil { - if errors.Is(err, update.ErrOperationAlreadyInProgress) { - render.EncodeResponse(w, http.StatusConflict, models.ErrorResponse{Details: err.Error()}) + code := update.GetUpdateErrorCode(err) + if code == update.OperationInProgressCode { + render.EncodeResponse(w, http.StatusConflict, models.ErrorResponse{ + Code: string(code), + Details: err.Error(), + }) return } - render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{Details: "Error upgrading packages"}) + render.EncodeResponse(w, http.StatusInternalServerError, models.ErrorResponse{ + Code: string(code), + Details: err.Error(), + }) return } @@ -109,6 +127,13 @@ func HandleUpdateApply(updater *update.Manager) http.HandlerFunc { func HandleUpdateEvents(updater *update.Manager) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + // HOTFIX: app-lab use HEAD requests to check endpoint availability + // so we need to handle them here by early return without opening SSE stream + if r.Method == http.MethodHead { + render.EncodeResponse(w, http.StatusOK, nil) + return + } + sseStream, err := render.NewSSEStream(r.Context(), w) if err != nil { slog.Error("Unable to create SSE stream", slog.String("error", err.Error())) @@ -128,14 +153,19 @@ func HandleUpdateEvents(updater *update.Manager) http.HandlerFunc { return } if event.Type == update.ErrorEvent { + err := event.GetError() + code := render.InternalServiceErr + if c := update.GetUpdateErrorCode(err); c != update.UnknownErrorCode { + code = render.SSEErrCode(string(c)) + } sseStream.SendError(render.SSEErrorData{ - Code: render.InternalServiceErr, - Message: event.Data, + Code: code, + Message: err.Error(), }) } else { sseStream.Send(render.SSEEvent{ Type: event.Type.String(), - Data: event.Data, + Data: event.GetData(), }) } diff --git a/internal/api/models/errors.go b/internal/api/models/errors.go index e87aafe1..1bbe3ec5 100644 --- a/internal/api/models/errors.go +++ b/internal/api/models/errors.go @@ -16,5 +16,6 @@ package models type ErrorResponse struct { + Code string `json:"code,omitempty"` Details string `json:"details"` } diff --git a/internal/e2e/client/client.gen.go b/internal/e2e/client/client.gen.go index f6094430..eb1a7971 100644 --- a/internal/e2e/client/client.gen.go +++ b/internal/e2e/client/client.gen.go @@ -1,6 +1,6 @@ // Package client provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.0 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.5.1 DO NOT EDIT. package client import ( @@ -41,6 +41,13 @@ const ( StarsDesc ListLibrariesParamsSort = "stars_desc" ) +// AIModel defines model for AIModel. +type AIModel struct { + Description *string `json:"description,omitempty"` + Id *string `json:"id,omitempty"` + Name *string `json:"name,omitempty"` +} + // AIModelItem defines model for AIModelItem. type AIModelItem struct { BrickIds *[]string `json:"brick_ids"` @@ -59,14 +66,15 @@ type AIModelsListResult struct { // AppBrickInstancesResult defines model for AppBrickInstancesResult. type AppBrickInstancesResult struct { - Bricks *[]BrickInstance `json:"bricks"` + Bricks *[]BrickInstanceListItem `json:"bricks"` } // AppDetailedBrick defines model for AppDetailedBrick. type AppDetailedBrick struct { - Category *string `json:"category,omitempty"` - Id string `json:"id"` - Name string `json:"name"` + Category *string `json:"category,omitempty"` + Id string `json:"id"` + Name string `json:"name"` + RequireModel *bool `json:"require_model,omitempty"` } // AppDetailedInfo defines model for AppDetailedInfo. @@ -135,27 +143,49 @@ type BrickCreateUpdateRequest struct { // BrickDetailsResult defines model for BrickDetailsResult. type BrickDetailsResult struct { - ApiDocsPath *string `json:"api_docs_path,omitempty"` - Author *string `json:"author,omitempty"` - Category *string `json:"category,omitempty"` - CodeExamples *[]CodeExample `json:"code_examples"` - Description *string `json:"description,omitempty"` - Id *string `json:"id,omitempty"` - Name *string `json:"name,omitempty"` - Readme *string `json:"readme,omitempty"` - Status *string `json:"status,omitempty"` - UsedByApps *[]AppReference `json:"used_by_apps"` - Variables *map[string]BrickVariable `json:"variables,omitempty"` + ApiDocsPath *string `json:"api_docs_path,omitempty"` + Author *string `json:"author,omitempty"` + Category *string `json:"category,omitempty"` + CodeExamples *[]CodeExample `json:"code_examples"` + CompatibleModels *[]AIModel `json:"compatible_models"` + ConfigVariables *[]BrickConfigVariable `json:"config_variables"` + Description *string `json:"description,omitempty"` + Id *string `json:"id,omitempty"` + Name *string `json:"name,omitempty"` + Readme *string `json:"readme,omitempty"` + RequireModel *bool `json:"require_model,omitempty"` + Status *string `json:"status,omitempty"` + UsedByApps *[]AppReference `json:"used_by_apps"` + + // Variables Deprecated: use config_variables instead. This field is kept for backward compatibility. + Variables *map[string]BrickVariable `json:"variables"` } // BrickInstance defines model for BrickInstance. type BrickInstance struct { + Author *string `json:"author,omitempty"` + Category *string `json:"category,omitempty"` + CompatibleModels *[]AIModel `json:"compatible_models"` + ConfigVariables *[]BrickConfigVariable `json:"config_variables,omitempty"` + Id *string `json:"id,omitempty"` + Model *string `json:"model,omitempty"` + Name *string `json:"name,omitempty"` + RequireModel *bool `json:"require_model,omitempty"` + Status *string `json:"status,omitempty"` + + // Variables Deprecated: use config_variables instead. This field is kept for backward compatibility. + Variables *map[string]string `json:"variables,omitempty"` +} + +// BrickInstanceListItem defines model for BrickInstanceListItem. +type BrickInstanceListItem struct { Author *string `json:"author,omitempty"` Category *string `json:"category,omitempty"` ConfigVariables *[]BrickConfigVariable `json:"config_variables,omitempty"` Id *string `json:"id,omitempty"` Model *string `json:"model,omitempty"` Name *string `json:"name,omitempty"` + RequireModel *bool `json:"require_model,omitempty"` Status *string `json:"status,omitempty"` // Variables Deprecated: use config_variables instead. This field is kept for backward compatibility. @@ -164,13 +194,13 @@ type BrickInstance struct { // BrickListItem defines model for BrickListItem. type BrickListItem struct { - Author *string `json:"author,omitempty"` - Category *string `json:"category,omitempty"` - Description *string `json:"description,omitempty"` - Id *string `json:"id,omitempty"` - Models *[]string `json:"models"` - Name *string `json:"name,omitempty"` - Status *string `json:"status,omitempty"` + Author *string `json:"author,omitempty"` + Category *string `json:"category,omitempty"` + Description *string `json:"description,omitempty"` + Id *string `json:"id,omitempty"` + Name *string `json:"name,omitempty"` + RequireModel *bool `json:"require_model,omitempty"` + Status *string `json:"status,omitempty"` } // BrickListResult defines model for BrickListResult. @@ -396,9 +426,6 @@ type GetAppsParams struct { // CreateAppParams defines parameters for CreateApp. type CreateAppParams struct { - // SkipPython If true, the app will not be created with the python part. - SkipPython *bool `form:"skip-python,omitempty" json:"skip-python,omitempty"` - // SkipSketch If true, the app will not be created with the sketch part. SkipSketch *bool `form:"skip-sketch,omitempty" json:"skip-sketch,omitempty"` } @@ -1260,22 +1287,6 @@ func NewCreateAppRequestWithBody(server string, params *CreateAppParams, content if params != nil { queryValues := queryURL.Query() - if params.SkipPython != nil { - - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "skip-python", runtime.ParamLocationQuery, *params.SkipPython); err != nil { - return nil, err - } else if parsed, err := url.ParseQuery(queryFrag); err != nil { - return nil, err - } else { - for k, v := range parsed { - for _, v2 := range v { - queryValues.Add(k, v2) - } - } - } - - } - if params.SkipSketch != nil { if queryFrag, err := runtime.StyleParamWithLocation("form", true, "skip-sketch", runtime.ParamLocationQuery, *params.SkipSketch); err != nil { diff --git a/internal/e2e/daemon/app_test.go b/internal/e2e/daemon/app_test.go index 1de8ff64..86479fc9 100644 --- a/internal/e2e/daemon/app_test.go +++ b/internal/e2e/daemon/app_test.go @@ -93,7 +93,6 @@ func TestCreateApp(t *testing.T) { { name: "should return 400 bad request when icon is not a single emoji", parameters: client.CreateAppParams{ - SkipPython: f.Ptr(false), SkipSketch: f.Ptr(false), }, body: client.CreateAppRequest{ @@ -107,7 +106,6 @@ func TestCreateApp(t *testing.T) { { name: "should create app successfully when icon is empty", parameters: client.CreateAppParams{ - SkipPython: f.Ptr(false), SkipSketch: f.Ptr(false), }, body: client.CreateAppRequest{ @@ -121,7 +119,6 @@ func TestCreateApp(t *testing.T) { { name: "should return 201 Created on first successful creation", parameters: client.CreateAppParams{ - SkipPython: f.Ptr(false), SkipSketch: f.Ptr(false), }, body: defaultRequestBody, @@ -130,30 +127,15 @@ func TestCreateApp(t *testing.T) { { name: "should return 409 Conflict when creating a duplicate app", parameters: client.CreateAppParams{ - SkipPython: f.Ptr(false), SkipSketch: f.Ptr(false), }, body: defaultRequestBody, expectedStatusCode: http.StatusConflict, expectedErrorDetails: f.Ptr("app already exists"), }, - { - name: "should return 201 Created on successful creation with skip_python", - parameters: client.CreateAppParams{ - SkipPython: f.Ptr(true), - SkipSketch: f.Ptr(false), - }, - body: client.CreateAppRequest{ - Icon: f.Ptr("🌎"), - Name: "HelloWorld_2", - Description: f.Ptr("My HelloWorld_2 description"), - }, - expectedStatusCode: http.StatusCreated, - }, { name: "should return 201 Created on successful creation with skip_sketch", parameters: client.CreateAppParams{ - SkipPython: f.Ptr(false), SkipSketch: f.Ptr(true), }, body: client.CreateAppRequest{ @@ -163,16 +145,6 @@ func TestCreateApp(t *testing.T) { }, expectedStatusCode: http.StatusCreated, }, - { - name: "should return 400 Bad Request when creating an app with both filters set to true", - parameters: client.CreateAppParams{ - SkipPython: f.Ptr(true), - SkipSketch: f.Ptr(true), - }, - body: defaultRequestBody, - expectedStatusCode: http.StatusBadRequest, - expectedErrorDetails: f.Ptr("cannot skip both python and sketch"), - }, } for _, tc := range testCases { @@ -783,9 +755,10 @@ func TestAppDetails(t *testing.T) { require.Len(t, *detailsResp.JSON200.Bricks, 1) require.Equal(t, client.AppDetailedBrick{ - Id: ImageClassifactionBrickID, - Name: "Image Classification", - Category: f.Ptr("video"), + Id: ImageClassifactionBrickID, + Name: "Image Classification", + Category: f.Ptr("video"), + RequireModel: f.Ptr(true), }, (*detailsResp.JSON200.Bricks)[0], ) @@ -984,7 +957,6 @@ func TestAppList(t *testing.T) { expectedAppNumber := 5 for i := 0; i < expectedAppNumber; i++ { r, err := httpClient.CreateApp(t.Context(), &client.CreateAppParams{ - SkipPython: f.Ptr(false), SkipSketch: f.Ptr(false), }, client.CreateAppRequest{ Icon: f.Ptr("🌎"), @@ -1002,7 +974,6 @@ func TestAppList(t *testing.T) { t.Run("AppListDefault_success", func(t *testing.T) { r, err := httpClient.CreateApp(t.Context(), &client.CreateAppParams{ - SkipPython: f.Ptr(false), SkipSketch: f.Ptr(false), }, client.CreateAppRequest{ Icon: f.Ptr("🌎"), diff --git a/internal/e2e/daemon/brick_test.go b/internal/e2e/daemon/brick_test.go index fa1cab40..c0a13390 100644 --- a/internal/e2e/daemon/brick_test.go +++ b/internal/e2e/daemon/brick_test.go @@ -72,7 +72,7 @@ func TestBricksList(t *testing.T) { require.NoError(t, err) staticStore := store.NewStaticStore(paths.New("testdata", "assets", cfg.RunnerVersion).String()) - brickIndex, err := bricksindex.GenerateBricksIndexFromFile(staticStore.GetAssetsFolder()) + brickIndex, err := bricksindex.Load(staticStore.GetAssetsFolder()) require.NoError(t, err) // Compare the response with the bricks index @@ -83,6 +83,7 @@ func TestBricksList(t *testing.T) { require.Equal(t, bIdx.Description, *brick.Description) require.Equal(t, "Arduino", *brick.Author) require.Equal(t, "installed", *brick.Status) + require.Equal(t, bIdx.RequireModel, *brick.RequireModel) } } @@ -115,6 +116,32 @@ func TestBricksDetails(t *testing.T) { }, } + expectedModelLiteInfo := []client.AIModel{ + { + Id: f.Ptr("mobilenet-image-classification"), + Name: f.Ptr("General purpose image classification"), + Description: f.Ptr("General purpose image classification model based on MobileNetV2. This model is trained on the ImageNet dataset and can classify images into 1000 categories."), + }, + { + Id: f.Ptr("person-classification"), + Name: f.Ptr("Person classification"), + Description: f.Ptr("Person classification model based on WakeVision dataset. This model is trained to classify images into two categories: person and not-person."), + }} + expectConfigVariables := []client.BrickConfigVariable{ + { + Name: f.Ptr("CUSTOM_MODEL_PATH"), + Value: f.Ptr("/home/arduino/.arduino-bricks/ei-models"), + Description: f.Ptr("path to the custom model directory"), + Required: f.Ptr(false), + }, + { + Name: f.Ptr("EI_CLASSIFICATION_MODEL"), + Value: f.Ptr("/models/ootb/ei/mobilenet-v2-224px.eim"), + Description: f.Ptr("path to the model file"), + Required: f.Ptr(false), + }, + } + response, err := httpClient.GetBrickDetailsWithResponse(t.Context(), validBrickID, func(ctx context.Context, req *http.Request) error { return nil }) require.NoError(t, err) require.Equal(t, http.StatusOK, response.StatusCode(), "status code should be 200 ok") @@ -133,5 +160,9 @@ func TestBricksDetails(t *testing.T) { require.NotEmpty(t, *response.JSON200.Readme) require.NotNil(t, response.JSON200.UsedByApps, "UsedByApps should not be nil") require.Equal(t, expectedUsedByApps, *(response.JSON200.UsedByApps)) + require.NotNil(t, response.JSON200.CompatibleModels, "Models should not be nil") + require.Equal(t, expectedModelLiteInfo, *(response.JSON200.CompatibleModels)) + require.NotNil(t, response.JSON200.ConfigVariables, "ConfigVariables should not be nil") + require.Equal(t, expectConfigVariables, *(response.JSON200.ConfigVariables)) }) } diff --git a/internal/e2e/daemon/instance_bricks_test.go b/internal/e2e/daemon/bricks_instance_test.go similarity index 91% rename from internal/e2e/daemon/instance_bricks_test.go rename to internal/e2e/daemon/bricks_instance_test.go index c210a9e6..1b8ee7c5 100644 --- a/internal/e2e/daemon/instance_bricks_test.go +++ b/internal/e2e/daemon/bricks_instance_test.go @@ -51,6 +51,18 @@ var ( Value: f.Ptr("/models/ootb/ei/mobilenet-v2-224px.eim"), }, } + + expectedModelInfo = []client.AIModel{ + { + Id: f.Ptr("mobilenet-image-classification"), + Name: f.Ptr("General purpose image classification"), + Description: f.Ptr("General purpose image classification model based on MobileNetV2. This model is trained on the ImageNet dataset and can classify images into 1000 categories."), + }, + { + Id: f.Ptr("person-classification"), + Name: f.Ptr("Person classification"), + Description: f.Ptr("Person classification model based on WakeVision dataset. This model is trained to classify images into two categories: person and not-person."), + }} ) func setupTestApp(t *testing.T) (*client.CreateAppResp, *client.ClientWithResponses) { @@ -78,7 +90,6 @@ func setupTestApp(t *testing.T) (*client.CreateAppResp, *client.ClientWithRespon ) require.NoError(t, err) require.Equal(t, http.StatusOK, resp.StatusCode()) - return createResp, httpClient } @@ -86,11 +97,20 @@ func TestGetAppBrickInstances(t *testing.T) { var actualBody models.ErrorResponse createResp, httpClient := setupTestApp(t) t.Run("GetAppBrickInstances_Success", func(t *testing.T) { + expectedVariables := map[string]string{ + "CUSTOM_MODEL_PATH": "/home/arduino/.arduino-bricks/ei-models", + "EI_CLASSIFICATION_MODEL": "/models/ootb/ei/mobilenet-v2-224px.eim", + } + brickInstances, err := httpClient.GetAppBrickInstancesWithResponse(t.Context(), *createResp.JSON201.Id, func(ctx context.Context, req *http.Request) error { return nil }) require.NoError(t, err) require.Len(t, *brickInstances.JSON200.Bricks, 1) require.Equal(t, ImageClassifactionBrickID, *(*brickInstances.JSON200.Bricks)[0].Id) require.Equal(t, expectedConfigVariables, *(*brickInstances.JSON200.Bricks)[0].ConfigVariables) + require.Equal(t, "Arduino", *(*brickInstances.JSON200.Bricks)[0].Author) + require.Equal(t, "video", *(*brickInstances.JSON200.Bricks)[0].Category) + require.True(t, *(*brickInstances.JSON200.Bricks)[0].RequireModel) + require.Equal(t, expectedVariables, *(*brickInstances.JSON200.Bricks)[0].Variables) }) @@ -135,6 +155,20 @@ func TestGetAppBrickInstanceById(t *testing.T) { require.NotEmpty(t, brickInstance.JSON200) require.Equal(t, ImageClassifactionBrickID, *brickInstance.JSON200.Id) require.Equal(t, expectedConfigVariables, (*brickInstance.JSON200.ConfigVariables)) + require.NotNil(t, brickInstance.JSON200.CompatibleModels) + require.Equal(t, expectedModelInfo, *(brickInstance.JSON200.CompatibleModels)) + }) + t.Run("GetAppBrickInstanceByBrickIDWithCompatibleModels_Success", func(t *testing.T) { + brickInstance, err := httpClient.GetAppBrickInstanceByBrickIDWithResponse( + t.Context(), + *createResp.JSON201.Id, + ImageClassifactionBrickID, + func(ctx context.Context, req *http.Request) error { return nil }) + require.NoError(t, err) + require.NotEmpty(t, brickInstance.JSON200) + require.Equal(t, ImageClassifactionBrickID, *brickInstance.JSON200.Id) + require.NotNil(t, brickInstance.JSON200.CompatibleModels) + require.Equal(t, expectedModelInfo, *(brickInstance.JSON200.CompatibleModels)) }) t.Run("GetAppBrickInstanceByBrickID_InvalidAppID_Fails", func(t *testing.T) { diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/cloud_llm/API.md b/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/cloud_llm/API.md deleted file mode 100644 index ba9da420..00000000 --- a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/cloud_llm/API.md +++ /dev/null @@ -1,107 +0,0 @@ -# cloud_llm API Reference - -## Index - -- Class `CloudLLM` -- Class `CloudModel` - ---- - -## `CloudLLM` class - -```python -class CloudLLM(api_key: str, model: Union[str, CloudModel], system_prompt: str, temperature: Optional[float], timeout: int) -``` - -A simplified, opinionated wrapper for common LangChain conversational patterns. - -This class provides a single interface to manage stateless chat and chat with memory. - -### Parameters - -- **api_key**: The API key for the LLM service. -- **model**: The model identifier as per LangChain specification (e.g., "anthropic:claude-3-sonnet-20240229") -or by using a CloudModels enum (e.g. CloudModels.OPENAI_GPT). Defaults to CloudModel.ANTHROPIC_CLAUDE. -- **system_prompt**: The global system-level instruction for the AI. -- **temperature**, default=0.7: The sampling temperature for response generation. Defaults to 0.7. -- **timeout**, default=30 seconds: The maximum time to wait for a response from the LLM service, in seconds. Defaults to 30 seconds. - -### Raises - -- **ValueError**: If the API key is missing. - -### Methods - -#### `with_memory(max_messages: int)` - -Enables conversational memory for this instance. - -This allows the chatbot to remember previous user and AI messages. -Calling this modifies the instance to be stateful. - -##### Parameters - -- **max_messages**: The total number of past messages (user + AI) to -keep in the conversation window. Set to 0 to disable memory. - -##### Returns - -- (*self*): The current CloudLLM instance for method chaining. - -#### `chat(message: str)` - -Sends a single message to the AI and gets a complete response synchronously. - -This is the primary way to interact. It automatically handles memory -based on how the instance was configured. - -##### Parameters - -- **message**: The user's message. - -##### Returns - --: The AI's complete response as a string. - -##### Raises - -- **RuntimeError**: If the chat model is not initialized or if text generation fails. - -#### `chat_stream(message: str)` - -Sends a single message to the AI and streams the response as a synchronous generator. - -Use this to get tokens as they are generated, perfect for a streaming UI. - -##### Parameters - -- **message**: The user's message. - -##### Returns - -- (*str*): Chunks of the AI's response as they become available. - -##### Raises - -- **RuntimeError**: If the chat model is not initialized or if text generation fails. -- **AlreadyGenerating**: If the chat model is already streaming a response. - -#### `stop_stream()` - -Signals the LLM to stop generating a response. - -#### `clear_memory()` - -Clears the conversational memory. - -This only has an effect if with_memory() has been called. - - ---- - -## `CloudModel` class - -```python -class CloudModel() -``` - diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/air_quality_monitoring/API.md b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/air_quality_monitoring/API.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/air_quality_monitoring/API.md rename to internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/air_quality_monitoring/API.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/arduino_cloud/API.md b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/arduino_cloud/API.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/arduino_cloud/API.md rename to internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/arduino_cloud/API.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/audio_classification/API.md b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/audio_classification/API.md similarity index 91% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/audio_classification/API.md rename to internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/audio_classification/API.md index 87a5213e..7573beee 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/api-docs/arduino/app_bricks/audio_classification/API.md +++ b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/audio_classification/API.md @@ -67,7 +67,7 @@ Stop real-time audio classification. Terminates audio capture and releases any associated resources. -#### `classify_from_file(audio_path: str, confidence: int)` +#### `classify_from_file(audio_path: str, confidence: float)` Classify audio content from a WAV file. @@ -80,9 +80,8 @@ Supported sample widths: ##### Parameters - **audio_path** (*str*): Path to the `.wav` audio file to classify. -- **confidence** (*int*) (optional): Confidence threshold (0–1). If None, -the default confidence level specified during initialization -will be applied. +- **confidence** (*float*) (optional): Minimum confidence threshold (0.0–1.0) required +for a detection to be considered valid. Defaults to 0.8 (80%). ##### Returns diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/camera_code_detection/API.md b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/camera_code_detection/API.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/camera_code_detection/API.md rename to internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/camera_code_detection/API.md diff --git a/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/cloud_llm/API.md b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/cloud_llm/API.md new file mode 100644 index 00000000..d2dd5903 --- /dev/null +++ b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/cloud_llm/API.md @@ -0,0 +1,120 @@ +# cloud_llm API Reference + +## Index + +- Class `CloudLLM` +- Class `CloudModel` + +--- + +## `CloudLLM` class + +```python +class CloudLLM(api_key: str, model: Union[str, CloudModel], system_prompt: str, temperature: Optional[float], timeout: int) +``` + +A Brick for interacting with cloud-based Large Language Models (LLMs). + +This class wraps LangChain functionality to provide a simplified, unified interface +for chatting with models like Claude, GPT, and Gemini. It supports both synchronous +'one-shot' responses and streaming output, with optional conversational memory. + +### Parameters + +- **api_key** (*str*): The API access key for the target LLM service. Defaults to the +'API_KEY' environment variable. +- **model** (*Union[str, CloudModel]*): The model identifier. Accepts a `CloudModel` +enum member (e.g., `CloudModel.OPENAI_GPT`) or its corresponding raw string +value (e.g., `'gpt-4o-mini'`). Defaults to `CloudModel.ANTHROPIC_CLAUDE`. +- **system_prompt** (*str*): A system-level instruction that defines the AI's persona +and constraints (e.g., "You are a helpful assistant"). Defaults to empty. +- **temperature** (*Optional[float]*): The sampling temperature between 0.0 and 1.0. +Higher values make output more random/creative; lower values make it more +deterministic. Defaults to 0.7. +- **timeout** (*int*): The maximum duration in seconds to wait for a response before +timing out. Defaults to 30. + +### Raises + +- **ValueError**: If `api_key` is not provided (empty string). + +### Methods + +#### `with_memory(max_messages: int)` + +Enables conversational memory for this instance. + +Configures the Brick to retain a window of previous messages, allowing the +AI to maintain context across multiple interactions. + +##### Parameters + +- **max_messages** (*int*): The maximum number of messages (user + AI) to keep +in history. Older messages are discarded. Set to 0 to disable memory. +Defaults to 10. + +##### Returns + +- (*CloudLLM*): The current instance, allowing for method chaining. + +#### `chat(message: str)` + +Sends a message to the AI and blocks until the complete response is received. + +This method automatically manages conversation history if memory is enabled. + +##### Parameters + +- **message** (*str*): The input text prompt from the user. + +##### Returns + +- (*str*): The complete text response generated by the AI. + +##### Raises + +- **RuntimeError**: If the internal chain is not initialized or if the API request fails. + +#### `chat_stream(message: str)` + +Sends a message to the AI and yields response tokens as they are generated. + +This allows for processing or displaying the response in real-time (streaming). +The generation can be interrupted by calling `stop_stream()`. + +##### Parameters + +- **message** (*str*): The input text prompt from the user. + +##### Returns + +- (*str*): Chunks of text (tokens) from the AI response. + +##### Raises + +- **RuntimeError**: If the internal chain is not initialized or if the API request fails. +- **AlreadyGenerating**: If a streaming session is already active. + +#### `stop_stream()` + +Signals the active streaming generation to stop. + +This sets an internal flag that causes the `chat_stream` iterator to break +early. It has no effect if no stream is currently running. + +#### `clear_memory()` + +Clears the conversational memory history. + +Resets the stored context. This is useful for starting a new conversation +topic without previous context interfering. Only applies if memory is enabled. + + +--- + +## `CloudModel` class + +```python +class CloudModel() +``` + diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/dbstorage_sqlstore/API.md b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/dbstorage_sqlstore/API.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/dbstorage_sqlstore/API.md rename to internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/dbstorage_sqlstore/API.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/dbstorage_tsstore/API.md b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/dbstorage_tsstore/API.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/dbstorage_tsstore/API.md rename to internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/dbstorage_tsstore/API.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/image_classification/API.md b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/image_classification/API.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/image_classification/API.md rename to internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/image_classification/API.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/keyword_spotting/API.md b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/keyword_spotting/API.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/keyword_spotting/API.md rename to internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/keyword_spotting/API.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/mood_detector/API.md b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/mood_detector/API.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/mood_detector/API.md rename to internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/mood_detector/API.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/motion_detection/API.md b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/motion_detection/API.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/motion_detection/API.md rename to internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/motion_detection/API.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/mqtt/API.md b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/mqtt/API.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/mqtt/API.md rename to internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/mqtt/API.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/object_detection/API.md b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/object_detection/API.md similarity index 90% rename from internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/object_detection/API.md rename to internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/object_detection/API.md index c8c84812..bf58415c 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/object_detection/API.md +++ b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/object_detection/API.md @@ -19,6 +19,14 @@ This module processes an input image and returns: - Corresponding class labels - Confidence scores for each detection +### Parameters + +- **confidence** (*float*): Minimum confidence threshold for detections. Default is 0.3 (30%). + +### Raises + +- **ValueError**: If model information cannot be retrieved. + ### Methods #### `detect_from_file(image_path: str, confidence: float)` @@ -60,7 +68,7 @@ Draw bounding boxes on an image enclosing detected objects using PIL. ##### Returns -: Image with bounding boxes and key points drawn. -None if no detection or invalid image. +None if input image or detections are invalid. #### `process(item)` diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/streamlit_ui/API.md b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/streamlit_ui/API.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/streamlit_ui/API.md rename to internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/streamlit_ui/API.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/vibration_anomaly_detection/API.md b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/vibration_anomaly_detection/API.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/vibration_anomaly_detection/API.md rename to internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/vibration_anomaly_detection/API.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/video_imageclassification/API.md b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/video_imageclassification/API.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/video_imageclassification/API.md rename to internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/video_imageclassification/API.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/video_objectdetection/API.md b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/video_objectdetection/API.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/video_objectdetection/API.md rename to internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/video_objectdetection/API.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/visual_anomaly_detection/API.md b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/visual_anomaly_detection/API.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/visual_anomaly_detection/API.md rename to internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/visual_anomaly_detection/API.md diff --git a/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/wave_generator/API.md b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/wave_generator/API.md new file mode 100644 index 00000000..f8977727 --- /dev/null +++ b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/wave_generator/API.md @@ -0,0 +1,151 @@ +# wave_generator API Reference + +## Index + +- Class `WaveGenerator` + +--- + +## `WaveGenerator` class + +```python +class WaveGenerator(sample_rate: int, wave_type: WaveType, block_duration: float, attack: float, release: float, glide: float, speaker: Speaker) +``` + +Continuous wave generator brick for audio synthesis. + +This brick generates continuous audio waveforms (sine, square, sawtooth, triangle) +and streams them to a USB speaker in real-time. It provides smooth transitions +between frequency and amplitude changes using configurable envelope parameters. + +The generator runs continuously in a background thread, producing audio blocks +at a steady rate with minimal latency. + +### Parameters + +- **sample_rate** (*int*): Audio sample rate in Hz (default: 16000). +- **wave_type** (*WaveType*): Initial waveform type (default: "sine"). +- **block_duration** (*float*): Duration of each audio block in seconds (default: 0.01). +- **attack** (*float*): Attack time for amplitude envelope in seconds (default: 0.01). +- **release** (*float*): Release time for amplitude envelope in seconds (default: 0.03). +- **glide** (*float*): Frequency glide time (portamento) in seconds (default: 0.02). +- **speaker** (*Speaker*) (optional): Pre-configured Speaker instance. If None, WaveGenerator +will create an internal Speaker optimized for real-time synthesis with: +- periodsize aligned to block_duration (eliminates buffer mismatch) +- queue_maxsize=8 (low latency: ~80ms max buffer) +- format=FLOAT_LE, channels=1 + +If providing an external Speaker, ensure: +- sample_rate matches WaveGenerator's sample_rate +- periodsize = int(sample_rate × block_duration) for optimal alignment +- Speaker is started/stopped manually (WaveGenerator won't manage its lifecycle) + +Example external Speaker configuration: + speaker = Speaker( + device="plughw:CARD=UH34", + sample_rate=16000, + format="FLOAT_LE", + periodsize=160, # 16000 × 0.01 = 160 frames + queue_maxsize=8 + ) + +### Raises + +- **SpeakerException**: If no USB speaker is found or device is busy. + +### Attributes + +- **sample_rate** (*int*): Audio sample rate in Hz (default: 16000). +- **wave_type** (*WaveType*): Type of waveform to generate. +- **frequency** (*float*): Current output frequency in Hz. +- **amplitude** (*float*): Current output amplitude (0.0-1.0). + +### Methods + +#### `start()` + +Start the wave generator and audio output. + +This starts the speaker device (if internally owned) and launches the producer thread +that continuously generates and streams audio blocks. + +#### `stop()` + +Stop the wave generator and audio output. + +This stops the producer thread and closes the speaker device (if internally owned). + +#### `set_frequency(frequency: float)` + +Set the target output frequency. + +The frequency will smoothly transition to the new value over the +configured glide time. + +##### Parameters + +- **frequency** (*float*): Target frequency in Hz (typically 20-8000 Hz). + +#### `set_amplitude(amplitude: float)` + +Set the target output amplitude. + +The amplitude will smoothly transition to the new value over the +configured attack/release time. + +##### Parameters + +- **amplitude** (*float*): Target amplitude in range [0.0, 1.0]. + +#### `set_wave_type(wave_type: WaveType)` + +Change the waveform type. + +##### Parameters + +- **wave_type** (*WaveType*): One of "sine", "square", "sawtooth", "triangle". + +##### Raises + +- **ValueError**: If wave_type is not valid. + +#### `set_volume(volume: int)` + +Set the speaker volume level. + +This is a wrapper that controls the hardware volume of the USB speaker device. + +##### Parameters + +- **volume** (*int*): Hardware volume level (0-100). + +##### Raises + +- **SpeakerException**: If the mixer is not available or if volume cannot be set. + +#### `get_volume()` + +Get the current speaker volume level. + +##### Returns + +- (*int*): Current hardware volume level (0-100). + +#### `set_envelope_params(attack: float, release: float, glide: float)` + +Update envelope parameters. + +##### Parameters + +- **attack** (*float*) (optional): Attack time in seconds. +- **release** (*float*) (optional): Release time in seconds. +- **glide** (*float*) (optional): Frequency glide time in seconds. + +#### `get_state()` + +Get current generator state. + +##### Returns + +- (*dict*): Dictionary containing current frequency, amplitude, wave type, etc. + diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/weather_forecast/API.md b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/weather_forecast/API.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/weather_forecast/API.md rename to internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/weather_forecast/API.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/web_ui/API.md b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/web_ui/API.md similarity index 76% rename from internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/web_ui/API.md rename to internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/web_ui/API.md index 4619aed5..ec08afdb 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_bricks/web_ui/API.md +++ b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_bricks/web_ui/API.md @@ -9,7 +9,7 @@ ## `WebUI` class ```python -class WebUI(addr: str, port: int, ui_path_prefix: str, api_path_prefix: str, assets_dir_path: str, certs_dir_path: str, use_ssl: bool) +class WebUI(addr: str, port: int, ui_path_prefix: str, api_path_prefix: str, assets_dir_path: str, certs_dir_path: str, use_tls: bool, use_ssl: bool | None) ``` Module for deploying a web server that can host a web application and expose APIs to its clients. @@ -24,21 +24,38 @@ and support real-time communication between the client and the server. - **ui_path_prefix** (*str*) (optional), default="" (root): URL prefix for UI routes. Defaults to "" (root). - **api_path_prefix** (*str*) (optional), default="" (root): URL prefix for API routes. Defaults to "" (root). - **assets_dir_path** (*str*) (optional), default="/app/assets": Path to static assets directory. Defaults to "/app/assets". -- **certs_dir_path** (*str*) (optional), default="/app/certs": Path to SSL certificates directory. Defaults to "/app/certs". -- **use_ssl** (*bool*) (optional), default=False: Enable SSL/HTTPS. Defaults to False. +- **certs_dir_path** (*str*) (optional), default="/app/certs": Path to TLS certificates directory. Defaults to "/app/certs". +- **use_tls** (*bool*) (optional), default=False: Enable TLS/HTTPS. Defaults to False. +- **use_ssl** (*bool*) (optional), default=None: Deprecated. Use use_tls instead. Defaults to None. ### Methods +#### `local_url()` + +Get the locally addressable URL of the web server. + +##### Returns + +- (*str*): The server's URL (including protocol, address, and port). + +#### `url()` + +Get the externally addressable URL of the web server. + +##### Returns + +- (*str*): The server's URL (including protocol, address, and port). + #### `start()` Start the web server asynchronously. -This sets up static file routing and WebSocket event handlers, configures SSL if enabled, and launches the server using Uvicorn. +This sets up static file routing and WebSocket event handlers, configures TLS if enabled, and launches the server using Uvicorn. ##### Raises - **RuntimeError**: If 'index.html' is missing in the static assets directory. -- **RuntimeError**: If SSL is enabled but certificates are missing or fail to generate. +- **RuntimeError**: If TLS is enabled but certificates fail to generate. - **RuntimeWarning**: If the server is already running. #### `stop()` @@ -47,7 +64,7 @@ Stop the web server gracefully. Waits up to 5 seconds for current requests to finish before terminating. -#### `expose_api(method: str, path: str, function: callable)` +#### `expose_api(method: str, path: str, function: Callable)` Register a route with the specified HTTP method and path. @@ -57,7 +74,7 @@ The path will be prefixed with the api_path_prefix configured during initializat - **method** (*str*): HTTP method to use (e.g., "GET", "POST"). - **path** (*str*): URL path for the API endpoint (without the prefix). -- **function** (*callable*): Function to execute when the route is accessed. +- **function** (*Callable*): Function to execute when the route is accessed. #### `on_connect(callback: Callable[[str], None])` @@ -79,7 +96,7 @@ The callback should accept a single argument: the session ID (sid) of the discon - **callback** (*Callable[[str], None]*): Function to call when a client disconnects. Receives the session ID (sid) as its only argument. -#### `on_message(message_type: str, callback: Callable[[str, any], any])` +#### `on_message(message_type: str, callback: Callable[[str, Any], Any])` Register a callback function for a specific WebSocket message type received by clients. @@ -91,10 +108,10 @@ with a message type suffix "_response". ##### Parameters - **message_type** (*str*): The message type name to listen for. -- **callback** (*Callable[[str, any], any]*): Function to handle the message. Receives two arguments: +- **callback** (*Callable[[str, Any], Any]*): Function to handle the message. Receives two arguments: the session ID (sid) and the incoming message data. -#### `send_message(message_type: str, message: dict | str, room: str)` +#### `send_message(message_type: str, message: dict | str, room: str | None)` Send a message to connected WebSocket clients. diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_peripherals/microphone/API.md b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_peripherals/microphone/API.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_peripherals/microphone/API.md rename to internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_peripherals/microphone/API.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_peripherals/speaker/API.md b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_peripherals/speaker/API.md similarity index 79% rename from internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_peripherals/speaker/API.md rename to internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_peripherals/speaker/API.md index 3cddad0f..94c64118 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_peripherals/speaker/API.md +++ b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_peripherals/speaker/API.md @@ -21,7 +21,7 @@ Custom exception for Speaker errors. ## `Speaker` class ```python -class Speaker(device: str, sample_rate: int, channels: int, format: str) +class Speaker(device: str, sample_rate: int, channels: int, format: str, periodsize: int, queue_maxsize: int) ``` Speaker class for reproducing audio using ALSA PCM interface. @@ -32,6 +32,12 @@ Speaker class for reproducing audio using ALSA PCM interface. - **sample_rate** (*int*): Sample rate in Hz (default: 16000). - **channels** (*int*): Number of audio channels (default: 1). - **format** (*str*): Audio format (default: "S16_LE"). +- **periodsize** (*int*): ALSA period size in frames (default: None = use hardware default). +For real-time synthesis, set to match generation block size. +For streaming/file playback, leave as None for hardware-optimal value. +- **queue_maxsize** (*int*): Maximum application queue depth in blocks (default: 100). +Lower values (5-20) reduce latency for interactive audio. +Higher values (50-200) provide stability for streaming. ### Raises diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_peripherals/usb_camera/API.md b/internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_peripherals/usb_camera/API.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/api-docs/arduino/app_peripherals/usb_camera/API.md rename to internal/e2e/daemon/testdata/assets/0.6.0/api-docs/arduino/app_peripherals/usb_camera/API.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/bricks-list.yaml b/internal/e2e/daemon/testdata/assets/0.6.0/bricks-list.yaml similarity index 93% rename from internal/e2e/daemon/testdata/assets/0.5.0/bricks-list.yaml rename to internal/e2e/daemon/testdata/assets/0.6.0/bricks-list.yaml index a4747e86..eaf2186d 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/bricks-list.yaml +++ b/internal/e2e/daemon/testdata/assets/0.6.0/bricks-list.yaml @@ -5,7 +5,6 @@ bricks: local database. require_container: false require_model: false - require_devices: false mount_devices_into_container: false ports: [] category: storage @@ -17,7 +16,6 @@ bricks: \ or with custom object detection models trained on Edge Impulse platform. \n" require_container: true require_model: true - require_devices: false mount_devices_into_container: false ports: [] category: video @@ -38,7 +36,6 @@ bricks: ' require_container: false require_model: false - require_devices: false mount_devices_into_container: false ports: [] category: text @@ -47,7 +44,6 @@ bricks: description: Scans a camera for barcodes and QR codes require_container: false require_model: false - require_devices: false mount_devices_into_container: false ports: [] category: video @@ -64,7 +60,6 @@ bricks: ' require_container: true require_model: true - require_devices: false mount_devices_into_container: false ports: [] category: audio @@ -81,7 +76,6 @@ bricks: description: Connects to Arduino Cloud require_container: false require_model: false - require_devices: false mount_devices_into_container: false ports: [] category: null @@ -90,6 +84,15 @@ bricks: description: Arduino Cloud Device ID - name: ARDUINO_SECRET description: Arduino Cloud Secret +- id: arduino:wave_generator + name: Wave Generator + description: Continuous wave generator for audio synthesis. Generates sine, square, + sawtooth, and triangle waveforms with smooth frequency and amplitude transitions. + require_container: false + require_model: false + mount_devices_into_container: false + ports: [] + category: audio - id: arduino:image_classification name: Image Classification description: "Brick for image classification using a pre-trained model. It processes\ @@ -98,7 +101,6 @@ bricks: \ image classification models trained on Edge Impulse platform. \n" require_container: true require_model: true - require_devices: false mount_devices_into_container: false ports: [] category: video @@ -115,7 +117,6 @@ bricks: description: A simplified user interface based on Streamlit and Python. require_container: false require_model: false - require_devices: false mount_devices_into_container: false ports: - 7000 @@ -135,7 +136,6 @@ bricks: ' require_container: true require_model: true - require_devices: false mount_devices_into_container: false ports: [] category: null @@ -155,7 +155,6 @@ bricks: APIs and a WebSocket exposed by a web server. require_container: false require_model: false - require_devices: false mount_devices_into_container: false ports: - 7000 @@ -172,7 +171,6 @@ bricks: ' require_container: true require_model: true - require_devices: false mount_devices_into_container: false ports: [] category: audio @@ -202,7 +200,6 @@ bricks: ' require_container: true require_model: true - require_devices: true mount_devices_into_container: true ports: [] category: video @@ -224,7 +221,6 @@ bricks: and weather APIs. Requires an internet connection. require_container: false require_model: false - require_devices: false mount_devices_into_container: false ports: [] category: miscellaneous @@ -241,7 +237,6 @@ bricks: ' require_container: true require_model: true - require_devices: false mount_devices_into_container: false ports: [] category: null @@ -259,7 +254,6 @@ bricks: built on top of InfluxDB. require_container: true require_model: false - require_devices: false mount_devices_into_container: false ports: [] category: storage @@ -283,7 +277,6 @@ bricks: \ detection models trained on the Edge Impulse platform. \n" require_container: true require_model: true - require_devices: false mount_devices_into_container: false ports: [] category: image @@ -312,7 +305,6 @@ bricks: ' require_container: true require_model: true - require_devices: true mount_devices_into_container: true ports: [] category: null @@ -328,3 +320,15 @@ bricks: description: path to the model file - name: VIDEO_DEVICE default_value: /dev/video1 +- id: arduino:cloud_llm + name: Cloud LLM + description: Cloud LLM Brick enables seamless integration with cloud-based Large + Language Models (LLMs) for advanced AI capabilities in your Arduino projects. + require_container: false + require_model: false + mount_devices_into_container: false + ports: [] + category: null + variables: + - name: API_KEY + description: API Key for the cloud-based LLM service diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/audio_classification/brick_compose.yaml b/internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/audio_classification/brick_compose.yaml similarity index 97% rename from internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/audio_classification/brick_compose.yaml rename to internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/audio_classification/brick_compose.yaml index 6dbe38e4..0a710c5f 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/audio_classification/brick_compose.yaml +++ b/internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/audio_classification/brick_compose.yaml @@ -2,7 +2,7 @@ # CUSTOM_MODEL_PATH = path to the custom model directory services: ei-audio-classifier-runner: - image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.5.0 + image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.6.0 logging: driver: "json-file" options: diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/dbstorage_tsstore/brick_compose.yaml b/internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/dbstorage_tsstore/brick_compose.yaml similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/dbstorage_tsstore/brick_compose.yaml rename to internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/dbstorage_tsstore/brick_compose.yaml diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/image_classification/brick_compose.yaml b/internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/image_classification/brick_compose.yaml similarity index 97% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/image_classification/brick_compose.yaml rename to internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/image_classification/brick_compose.yaml index d8207271..fe20b37e 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/image_classification/brick_compose.yaml +++ b/internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/image_classification/brick_compose.yaml @@ -2,7 +2,7 @@ # CUSTOM_MODEL_PATH = path to the custom model directory services: ei-classification-runner: - image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.5.0 + image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.6.0 logging: driver: "json-file" options: diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/keyword_spotting/brick_compose.yaml b/internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/keyword_spotting/brick_compose.yaml similarity index 97% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/keyword_spotting/brick_compose.yaml rename to internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/keyword_spotting/brick_compose.yaml index b4dd7963..4340871e 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/keyword_spotting/brick_compose.yaml +++ b/internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/keyword_spotting/brick_compose.yaml @@ -2,7 +2,7 @@ # CUSTOM_MODEL_PATH = path to the custom model directory services: ei-keyword-spot-runner: - image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.5.0 + image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.6.0 logging: driver: "json-file" options: diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/motion_detection/brick_compose.yaml b/internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/motion_detection/brick_compose.yaml similarity index 97% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/motion_detection/brick_compose.yaml rename to internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/motion_detection/brick_compose.yaml index ef7fc730..abc10e77 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/motion_detection/brick_compose.yaml +++ b/internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/motion_detection/brick_compose.yaml @@ -2,7 +2,7 @@ # CUSTOM_MODEL_PATH = path to the custom model directory services: ei-motion-detection-runner: - image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.5.0 + image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.6.0 logging: driver: "json-file" options: diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/object_detection/brick_compose.yaml b/internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/object_detection/brick_compose.yaml similarity index 97% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/object_detection/brick_compose.yaml rename to internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/object_detection/brick_compose.yaml index 9d418913..99871411 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/object_detection/brick_compose.yaml +++ b/internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/object_detection/brick_compose.yaml @@ -2,7 +2,7 @@ # CUSTOM_MODEL_PATH = path to the custom model directory services: ei-obj-detection-runner: - image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.5.0 + image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.6.0 logging: driver: "json-file" options: diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/vibration_anomaly_detection/brick_compose.yaml b/internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/vibration_anomaly_detection/brick_compose.yaml similarity index 97% rename from internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/vibration_anomaly_detection/brick_compose.yaml rename to internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/vibration_anomaly_detection/brick_compose.yaml index aca4e2a2..e07c2890 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/vibration_anomaly_detection/brick_compose.yaml +++ b/internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/vibration_anomaly_detection/brick_compose.yaml @@ -2,7 +2,7 @@ # CUSTOM_MODEL_PATH = path to the custom model directory services: ei-anomaly-detection-runner: - image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.5.0 + image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.6.0 logging: driver: "json-file" options: diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/video_image_classification/brick_compose.yaml b/internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/video_image_classification/brick_compose.yaml similarity index 97% rename from internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/video_image_classification/brick_compose.yaml rename to internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/video_image_classification/brick_compose.yaml index 7e054acc..3dd8139a 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/compose/arduino/video_image_classification/brick_compose.yaml +++ b/internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/video_image_classification/brick_compose.yaml @@ -2,7 +2,7 @@ # CUSTOM_MODEL_PATH = path to the custom model directory services: ei-video-classification-runner: - image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.5.0 + image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.6.0 logging: driver: "json-file" options: diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/video_object_detection/brick_compose.yaml b/internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/video_object_detection/brick_compose.yaml similarity index 86% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/video_object_detection/brick_compose.yaml rename to internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/video_object_detection/brick_compose.yaml index dbca6363..804bc638 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/video_object_detection/brick_compose.yaml +++ b/internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/video_object_detection/brick_compose.yaml @@ -2,7 +2,7 @@ # CUSTOM_MODEL_PATH = path to the custom model directory services: ei-video-obj-detection-runner: - image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.5.0 + image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.6.0 logging: driver: "json-file" options: @@ -13,7 +13,7 @@ services: volumes: - "${CUSTOM_MODEL_PATH:-/home/arduino/.arduino-bricks/ei-models/}:${CUSTOM_MODEL_PATH:-/home/arduino/.arduino-bricks/ei-models/}" - "/run/udev:/run/udev" - command: ["--model-file", "${EI_OBJ_DETECTION_MODEL:-/models/ootb/ei/yolo-x-nano.eim}", "--dont-print-predictions", "--mode", "streaming", "--force-target", "--preview-original-resolution", "--camera", "${VIDEO_DEVICE:-/dev/video1}"] + command: ["--model-file", "${EI_OBJ_DETECTION_MODEL:-/models/ootb/ei/yolo-x-nano.eim}", "--dont-print-predictions", "--mode", "streaming", "--preview-original-resolution", "--camera", "${VIDEO_DEVICE:-/dev/video1}"] healthcheck: test: [ "CMD-SHELL", "wget -q --spider http://ei-video-obj-detection-runner:4912 || exit 1" ] interval: 2s diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/visual_anomaly_detection/brick_compose.yaml b/internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/visual_anomaly_detection/brick_compose.yaml similarity index 97% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/visual_anomaly_detection/brick_compose.yaml rename to internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/visual_anomaly_detection/brick_compose.yaml index 0e71d75a..ced99fcb 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/compose/arduino/visual_anomaly_detection/brick_compose.yaml +++ b/internal/e2e/daemon/testdata/assets/0.6.0/compose/arduino/visual_anomaly_detection/brick_compose.yaml @@ -2,7 +2,7 @@ # CUSTOM_MODEL_PATH = path to the custom model directory services: ei-obj-video-anomalies-det-runner: - image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.5.0 + image: ${DOCKER_REGISTRY_BASE:-ghcr.io/arduino/}app-bricks/ei-models-runner:0.6.0 logging: driver: "json-file" options: diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/arduino_cloud/README.md b/internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/arduino_cloud/README.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/arduino_cloud/README.md rename to internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/arduino_cloud/README.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/audio_classification/README.md b/internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/audio_classification/README.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/audio_classification/README.md rename to internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/audio_classification/README.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/camera_code_detection/README.md b/internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/camera_code_detection/README.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/camera_code_detection/README.md rename to internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/camera_code_detection/README.md diff --git a/internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/cloud_llm/README.md b/internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/cloud_llm/README.md new file mode 100644 index 00000000..add84514 --- /dev/null +++ b/internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/cloud_llm/README.md @@ -0,0 +1,109 @@ +# Cloud LLM Brick + +The Cloud LLM Brick provides a seamless interface to interact with cloud-based Large Language Models (LLMs) such as OpenAI's GPT, Anthropic's Claude, and Google's Gemini. It abstracts the complexity of REST APIs, enabling you to send prompts, receive responses, and maintain conversational context within your Arduino projects. + +## Overview + +This Brick acts as a gateway to powerful AI models hosted in the cloud. It is designed to handle the nuances of network communication, authentication, and session management. Whether you need a simple one-off answer or a continuous conversation with memory, the Cloud LLM Brick provides a unified API for different providers. + +## Features + +- **Multi-Provider Support**: Compatible with major LLM providers including Anthropic (Claude), OpenAI (GPT), and Google (Gemini). +- **Conversational Memory**: Built-in support for windowed history, allowing the AI to remember context from previous exchanges. +- **Streaming Responses**: Receive text chunks in real-time as they are generated, ideal for responsive user interfaces. +- **Configurable Behavior**: Customize system prompts, temperature (creativity), and request timeouts. +- **Simple API**: Unified `chat` and `chat_stream` methods regardless of the underlying model provider. + +## Prerequisites + +- **Internet Connection**: The board must be connected to the internet to reach the LLM provider's API. +- **API Key**: A valid API key for the chosen service (e.g., OpenAI API Key, Anthropic API Key). +- **Python Dependencies**: The Brick relies on LangChain integration packages (`langchain-anthropic`, `langchain-openai`, `langchain-google-genai`). + +## Code Example and Usage + +### Basic Conversation + +This example initializes the Brick with an OpenAI model and performs a simple chat interaction. + +**Note:** The API key is not hardcoded. It is retrieved automatically from the **Brick Configuration** in App Lab. + +```python +import os +from arduino.app_bricks.cloud_llm import CloudLLM, CloudModel +from arduino.app_utils import App + +# Initialize the Brick (API key is loaded from configuration) +llm = CloudLLM( + model=CloudModel.OPENAI_GPT, + system_prompt="You are a helpful assistant for an IoT device." +) + +def simple_chat(): + # Send a prompt and print the response + response = llm.chat("What is the capital of Italy?") + print(f"AI: {response}") + +# Run the application +App.run(simple_chat) +``` + +### Streaming with Memory + +This example demonstrates how to enable conversational memory and process the response as a stream of tokens. + +```python +from arduino.app_bricks.cloud_llm import CloudLLM, CloudModel +from arduino.app_utils import App + +# Initialize with memory enabled (keeps last 10 messages) +# API Key is retrieved automatically from Brick Configuration +llm = CloudLLM( + model=CloudModel.ANTHROPIC_CLAUDE +).with_memory(max_messages=10) + +def chat_loop(): + while True: + user_input = input("You: ") + if user_input.lower() in ["exit", "quit"]: + break + + print("AI: ", end="", flush=True) + + # Stream the response token by token + for token in llm.chat_stream(user_input): + print(token, end="", flush=True) + print() # Newline after response + +App.run(chat_loop) +``` + +## Configuration + +The Brick is initialized with the following parameters: + +| Parameter | Type | Default | Description | +| :-------------- | :-------------------- | :---------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------- | +| `api_key` | `str` | `os.getenv("API_KEY")` | The authentication key for the LLM provider. **Recommended:** Set this via the **Brick Configuration** menu in App Lab instead of code. | +| `model` | `str` \| `CloudModel` | `CloudModel.ANTHROPIC_CLAUDE` | The specific model to use. Accepts a `CloudModel` enum or its string value. | +| `system_prompt` | `str` | `""` | A base instruction that defines the AI's behavior and persona. | +| `temperature` | `float` | `0.7` | Controls randomness. `0.0` is deterministic, `1.0` is creative. | +| `timeout` | `int` | `30` | Maximum time (in seconds) to wait for a response. | + +### Supported Models + +You can select a model using the `CloudModel` enum or by passing the corresponding raw string identifier. + +| Enum Constant | Raw String ID | Provider Documentation | +| :---------------------------- | :------------------------- | :-------------------------------------------------------------------------- | +| `CloudModel.ANTHROPIC_CLAUDE` | `claude-3-7-sonnet-latest` | [Anthropic Models](https://docs.anthropic.com/en/docs/about-claude/models) | +| `CloudModel.OPENAI_GPT` | `gpt-4o-mini` | [OpenAI Models](https://platform.openai.com/docs/models) | +| `CloudModel.GOOGLE_GEMINI` | `gemini-2.5-flash` | [Google Gemini Models](https://ai.google.dev/gemini-api/docs/models/gemini) | + +## Methods + +- **`chat(message)`**: Sends a message and returns the complete response string. Blocks until generation is finished. +- **`chat_stream(message)`**: Returns a generator yielding response tokens as they arrive. +- **`stop_stream()`**: Interrupts an active streaming generation. +- **`with_memory(max_messages)`**: Enables history tracking. `max_messages` defines the context window size. +- **`clear_memory()`**: Resets the conversation history. \ No newline at end of file diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/dbstorage_sqlstore/README.md b/internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/dbstorage_sqlstore/README.md similarity index 97% rename from internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/dbstorage_sqlstore/README.md rename to internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/dbstorage_sqlstore/README.md index 704a9e62..53a837d0 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/dbstorage_sqlstore/README.md +++ b/internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/dbstorage_sqlstore/README.md @@ -35,7 +35,7 @@ db = SQLStore("example.db") # ... Do work # Close database -db.close() +db.stop() ``` To create a new table: @@ -65,4 +65,4 @@ db.store("users", data) The SQLStore automatically creates a directory structure for database storage, placing files in `data/dbstorage_sqlstore/` within your application directory. The brick supports automatic type inference when creating tables, mapping Python types (*int*, *float*, *str*, *bytes*) to corresponding SQLite column types (*INTEGER*, *REAL*, *TEXT*, *BLOB*). -The `store()` method can automatically create tables if they don't exist by analyzing the data types of the provided values. This makes it easy to get started without defining schemas upfront, while still allowing explicit table creation for more control over column definitions and constraints. \ No newline at end of file +The `store()` method can automatically create tables if they don't exist by analyzing the data types of the provided values. This makes it easy to get started without defining schemas upfront, while still allowing explicit table creation for more control over column definitions and constraints. diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/dbstorage_tsstore/README.md b/internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/dbstorage_tsstore/README.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/dbstorage_tsstore/README.md rename to internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/dbstorage_tsstore/README.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/image_classification/README.md b/internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/image_classification/README.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/image_classification/README.md rename to internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/image_classification/README.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/keyword_spotting/README.md b/internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/keyword_spotting/README.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/keyword_spotting/README.md rename to internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/keyword_spotting/README.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/mood_detector/README.md b/internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/mood_detector/README.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/mood_detector/README.md rename to internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/mood_detector/README.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/motion_detection/README.md b/internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/motion_detection/README.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/motion_detection/README.md rename to internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/motion_detection/README.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/object_detection/README.md b/internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/object_detection/README.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/object_detection/README.md rename to internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/object_detection/README.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/streamlit_ui/README.md b/internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/streamlit_ui/README.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/streamlit_ui/README.md rename to internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/streamlit_ui/README.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/vibration_anomaly_detection/README.md b/internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/vibration_anomaly_detection/README.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/vibration_anomaly_detection/README.md rename to internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/vibration_anomaly_detection/README.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/video_image_classification/README.md b/internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/video_image_classification/README.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/video_image_classification/README.md rename to internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/video_image_classification/README.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/video_object_detection/README.md b/internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/video_object_detection/README.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/video_object_detection/README.md rename to internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/video_object_detection/README.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/visual_anomaly_detection/README.md b/internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/visual_anomaly_detection/README.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/visual_anomaly_detection/README.md rename to internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/visual_anomaly_detection/README.md diff --git a/internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/wave_generator/README.md b/internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/wave_generator/README.md new file mode 100644 index 00000000..23a1f9f8 --- /dev/null +++ b/internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/wave_generator/README.md @@ -0,0 +1,119 @@ +# Wave Generator brick + +This brick provides continuous wave generation for real-time audio synthesis with multiple waveform types and smooth transitions. + +## Overview + +The Wave Generator brick allows you to: + +- Generate continuous audio waveforms in real-time +- Select between different waveform types (sine, square, sawtooth, triangle) +- Control frequency and amplitude dynamically during playback +- Configure smooth transitions with attack, release, and glide (portamento) parameters +- Stream audio to USB speakers with minimal latency + +It runs continuously in a background thread, producing audio blocks at a steady rate with configurable envelope parameters for professional-sounding synthesis. + +## Features + +- Four waveform types: sine, square, sawtooth, and triangle +- Real-time frequency and amplitude control with smooth transitions +- Configurable envelope parameters (attack, release, glide) +- Hardware volume control support +- Thread-safe operation for concurrent access +- Efficient audio generation using NumPy vectorization +- Custom speaker configuration support + +## Prerequisites + +Before using the Wave Generator brick, ensure you have the following: + +- USB-C® Hub with external power supply (5V, 3A) +- USB audio device (USB speaker or USB-C → 3.5mm adapter) +- Arduino UNO Q running in Network Mode or SBC Mode (USB-C port needed for the hub) + +## Code example and usage + +Here is a basic example for generating a 440 Hz sine wave tone: + +```python +from arduino.app_bricks.wave_generator import WaveGenerator +from arduino.app_utils import App + +wave_gen = WaveGenerator() + +App.start_brick(wave_gen) + +# Set frequency to A4 note (440 Hz) +wave_gen.set_frequency(440.0) + +# Set amplitude to 80% +wave_gen.set_amplitude(0.8) + +App.run() +``` + +You can customize the waveform type and envelope parameters: + +```python +wave_gen = WaveGenerator( + wave_type="square", + attack=0.01, + release=0.03, + glide=0.02 +) + +App.start_brick(wave_gen) + +# Change waveform during playback +wave_gen.set_wave_type("triangle") + +# Adjust envelope parameters +wave_gen.set_envelope_params(attack=0.05, release=0.1, glide=0.05) + +App.run() +``` + +For specific hardware configurations, you can provide a custom Speaker instance: + +```python +from arduino.app_bricks.wave_generator import WaveGenerator +from arduino.app_peripherals.speaker import Speaker +from arduino.app_utils import App + +# Create Speaker with optimal real-time configuration +speaker = Speaker( + device=Speaker.USB_SPEAKER_2, + sample_rate=16000, + channels=1, + format="FLOAT_LE", + periodsize=480, # 16000 Hz × 0.03s = 480 frames (eliminates buffer mismatch) + queue_maxsize=10 # Low latency configuration +) + +# Start external Speaker manually (WaveGenerator won't manage its lifecycle) +speaker.start() + +wave_gen = WaveGenerator(sample_rate=16000, speaker=speaker) + +App.start_brick(wave_gen) +wave_gen.set_frequency(440.0) +wave_gen.set_amplitude(0.7) + +App.run() + +# Stop external Speaker manually +speaker.stop() +``` + +**Note:** When providing an external Speaker, you manage its lifecycle (start/stop). WaveGenerator only validates configuration and uses it for playback. + +## Understanding Wave Generation + +The Wave Generator brick produces audio through continuous waveform synthesis. + +The `frequency` parameter controls the pitch of the output sound, measured in Hertz (Hz), where typical audible frequencies range from 20 Hz to 8000 Hz. + +The `amplitude` parameter controls the volume as a value between 0.0 (silent) and 1.0 (maximum), with smooth transitions handled by the attack and release envelope parameters. + +The `glide` parameter (also known as portamento) smoothly transitions between frequencies over time, creating sliding pitch effects similar to a theremin or synthesizer. Setting glide to 0 disables this effect but may cause audible clicks during fast frequency changes. diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/weather_forecast/README.md b/internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/weather_forecast/README.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/weather_forecast/README.md rename to internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/weather_forecast/README.md diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/web_ui/README.md b/internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/web_ui/README.md similarity index 100% rename from internal/e2e/daemon/testdata/assets/0.5.0/docs/arduino/web_ui/README.md rename to internal/e2e/daemon/testdata/assets/0.6.0/docs/arduino/web_ui/README.md diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/arduino_cloud/1_led_blink.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/arduino_cloud/1_led_blink.py similarity index 90% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/arduino_cloud/1_led_blink.py rename to internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/arduino_cloud/1_led_blink.py index 58cd9470..3a9df8ca 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/arduino_cloud/1_led_blink.py +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/arduino_cloud/1_led_blink.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/arduino_cloud/2_light_with_colors_monitor.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/arduino_cloud/2_light_with_colors_monitor.py similarity index 88% rename from internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/arduino_cloud/2_light_with_colors_monitor.py rename to internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/arduino_cloud/2_light_with_colors_monitor.py index 40371db7..1fce305b 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/arduino_cloud/2_light_with_colors_monitor.py +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/arduino_cloud/2_light_with_colors_monitor.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/arduino_cloud/3_light_with_colors_command.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/arduino_cloud/3_light_with_colors_command.py similarity index 92% rename from internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/arduino_cloud/3_light_with_colors_command.py rename to internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/arduino_cloud/3_light_with_colors_command.py index 5e730ea9..4b8c5bf9 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/arduino_cloud/3_light_with_colors_command.py +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/arduino_cloud/3_light_with_colors_command.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/audio_classification/1_glass_breaking_from_mic.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/audio_classification/1_glass_breaking_from_mic.py similarity index 84% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/audio_classification/1_glass_breaking_from_mic.py rename to internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/audio_classification/1_glass_breaking_from_mic.py index 36b2be12..1eed6c3a 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/audio_classification/1_glass_breaking_from_mic.py +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/audio_classification/1_glass_breaking_from_mic.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/audio_classification/2_glass_breaking_from_file.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/audio_classification/2_glass_breaking_from_file.py similarity index 60% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/audio_classification/2_glass_breaking_from_file.py rename to internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/audio_classification/2_glass_breaking_from_file.py index 68bdd710..237aaba1 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/audio_classification/2_glass_breaking_from_file.py +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/audio_classification/2_glass_breaking_from_file.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 @@ -6,7 +6,5 @@ # EXAMPLE_REQUIRES = "Requires an audio file with the glass breaking sound." from arduino.app_bricks.audio_classification import AudioClassification -classifier = AudioClassification() - -classification = classifier.classify_from_file("glass_breaking.wav") +classification = AudioClassification.classify_from_file("glass_breaking.wav") print("Result:", classification) diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/camera_code_detection/1_detection.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/camera_code_detection/1_detection.py similarity index 89% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/camera_code_detection/1_detection.py rename to internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/camera_code_detection/1_detection.py index 6dfdb41a..1facd326 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/camera_code_detection/1_detection.py +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/camera_code_detection/1_detection.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/camera_code_detection/2_detection_list.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/camera_code_detection/2_detection_list.py similarity index 90% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/camera_code_detection/2_detection_list.py rename to internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/camera_code_detection/2_detection_list.py index 6288d571..7d63bb46 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/camera_code_detection/2_detection_list.py +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/camera_code_detection/2_detection_list.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/camera_code_detection/3_detection_with_overrides.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/camera_code_detection/3_detection_with_overrides.py similarity index 91% rename from internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/camera_code_detection/3_detection_with_overrides.py rename to internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/camera_code_detection/3_detection_with_overrides.py index 8a672470..d128cd96 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/camera_code_detection/3_detection_with_overrides.py +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/camera_code_detection/3_detection_with_overrides.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/cloud_llm/1_simple_prompt.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/cloud_llm/1_simple_prompt.py new file mode 100644 index 00000000..7c325de8 --- /dev/null +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/cloud_llm/1_simple_prompt.py @@ -0,0 +1,24 @@ +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) +# +# SPDX-License-Identifier: MPL-2.0 + +# EXAMPLE_NAME = "Chat with an LLM" +# EXAMPLE_REQUIRES = "Requires a valid API key to a cloud LLM service." + +from arduino.app_bricks.cloud_llm import CloudLLM +from arduino.app_utils import App + +llm = CloudLLM( + api_key="YOUR_API_KEY", # Replace with your actual API key +) + + +def ask_prompt(): + prompt = input("Enter your prompt (or type 'exit' to quit): ") + if prompt.lower() == "exit": + raise StopIteration() + print(llm.chat(prompt)) + print() + + +App.run(ask_prompt) diff --git a/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/cloud_llm/2_streaming_responses.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/cloud_llm/2_streaming_responses.py new file mode 100644 index 00000000..9538cbda --- /dev/null +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/cloud_llm/2_streaming_responses.py @@ -0,0 +1,25 @@ +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) +# +# SPDX-License-Identifier: MPL-2.0 + +# EXAMPLE_NAME = "Streaming responses from an LLM" +# EXAMPLE_REQUIRES = "Requires a valid API key to a cloud LLM service." + +from arduino.app_bricks.cloud_llm import CloudLLM +from arduino.app_utils import App + +llm = CloudLLM( + api_key="YOUR_API_KEY", # Replace with your actual API key +) + + +def ask_prompt(): + prompt = input("Enter your prompt (or type 'exit' to quit): ") + if prompt.lower() == "exit": + raise StopIteration() + for token in llm.chat_stream(prompt): + print(token, end="", flush=True) + print() + + +App.run(ask_prompt) diff --git a/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/cloud_llm/3_no_memory.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/cloud_llm/3_no_memory.py new file mode 100644 index 00000000..f30419bf --- /dev/null +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/cloud_llm/3_no_memory.py @@ -0,0 +1,24 @@ +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) +# +# SPDX-License-Identifier: MPL-2.0 + +# EXAMPLE_NAME = "Conversation with memory" +# EXAMPLE_REQUIRES = "Requires a valid API key to a cloud LLM service." + +from arduino.app_bricks.cloud_llm import CloudLLM +from arduino.app_utils import App + +llm = CloudLLM( + api_key="YOUR_API_KEY", # Replace with your actual API key +) +llm.with_memory(0) + + +def ask_prompt(): + prompt = input("Enter your prompt (or type 'exit' to quit): ") + if prompt.lower() == "exit": + raise StopIteration() + print(llm.chat(prompt)) + + +App.run(ask_prompt) diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/dbstorage_sqlstore/store_and_read_example.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/dbstorage_sqlstore/store_and_read_example.py similarity index 85% rename from internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/dbstorage_sqlstore/store_and_read_example.py rename to internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/dbstorage_sqlstore/store_and_read_example.py index e3e31edb..54d070cd 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/dbstorage_sqlstore/store_and_read_example.py +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/dbstorage_sqlstore/store_and_read_example.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/dbstorage_tsstore/1_write_read.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/dbstorage_tsstore/1_write_read.py similarity index 84% rename from internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/dbstorage_tsstore/1_write_read.py rename to internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/dbstorage_tsstore/1_write_read.py index 9b4185d6..42c19b90 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/dbstorage_tsstore/1_write_read.py +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/dbstorage_tsstore/1_write_read.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/dbstorage_tsstore/2_read_all_samples.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/dbstorage_tsstore/2_read_all_samples.py similarity index 93% rename from internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/dbstorage_tsstore/2_read_all_samples.py rename to internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/dbstorage_tsstore/2_read_all_samples.py index 2adee9d9..21ee99a2 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/dbstorage_tsstore/2_read_all_samples.py +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/dbstorage_tsstore/2_read_all_samples.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/image_classification/image_classification_example.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/image_classification/image_classification_example.py similarity index 90% rename from internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/image_classification/image_classification_example.py rename to internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/image_classification/image_classification_example.py index 7dd28c57..7597172e 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/image_classification/image_classification_example.py +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/image_classification/image_classification_example.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/keyword_spotting/1_hello_world.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/keyword_spotting/1_hello_world.py similarity index 82% rename from internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/keyword_spotting/1_hello_world.py rename to internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/keyword_spotting/1_hello_world.py index b5687f86..346cf45d 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/keyword_spotting/1_hello_world.py +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/keyword_spotting/1_hello_world.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/object_detection/object_detection_example.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/object_detection/object_detection_example.py similarity index 91% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/object_detection/object_detection_example.py rename to internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/object_detection/object_detection_example.py index f2ca3b9f..166f5b7c 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/object_detection/object_detection_example.py +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/object_detection/object_detection_example.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/visual_anomaly_detection/object_detection_example.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/visual_anomaly_detection/object_detection_example.py similarity index 91% rename from internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/visual_anomaly_detection/object_detection_example.py rename to internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/visual_anomaly_detection/object_detection_example.py index 5dc0d2cc..42a8864e 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/visual_anomaly_detection/object_detection_example.py +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/visual_anomaly_detection/object_detection_example.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/wave_generator/01_basic_tone.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/wave_generator/01_basic_tone.py new file mode 100644 index 00000000..5acd492f --- /dev/null +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/wave_generator/01_basic_tone.py @@ -0,0 +1,34 @@ +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) +# +# SPDX-License-Identifier: MPL-2.0 + +""" +Basic Wave Generator Example + +Generates a simple 440Hz sine wave (A4 note) and demonstrates +basic frequency and amplitude control. +""" + +from arduino.app_bricks.wave_generator import WaveGenerator +from arduino.app_utils import App + +# Create wave generator with default settings +wave_gen = WaveGenerator( + sample_rate=16000, + wave_type="sine", + glide=0.02, # 20ms smooth frequency transitions +) + +# Start the generator +App.start_brick(wave_gen) + +# Set initial frequency and amplitude +wave_gen.set_frequency(440.0) # A4 note (440 Hz) +wave_gen.set_amplitude(0.7) # 70% amplitude +wave_gen.set_volume(80) # 80% hardware volume + +print("Playing 440Hz sine wave (A4 note)") +print("Press Ctrl+C to stop") + +# Keep the application running +App.run() diff --git a/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/wave_generator/02_waveform_types.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/wave_generator/02_waveform_types.py new file mode 100644 index 00000000..320757c3 --- /dev/null +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/wave_generator/02_waveform_types.py @@ -0,0 +1,41 @@ +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) +# +# SPDX-License-Identifier: MPL-2.0 + +""" +Waveform Comparison Example + +Cycles through different waveform types to hear the difference +between sine, square, sawtooth, and triangle waves. +""" + +import time +from arduino.app_bricks.wave_generator import WaveGenerator +from arduino.app_utils import App + +wave_gen = WaveGenerator(sample_rate=16000, glide=0.02) +App.start_brick(wave_gen) + +# Set constant frequency and amplitude +wave_gen.set_frequency(440.0) +wave_gen.set_amplitude(0.6) + +waveforms = ["sine", "square", "sawtooth", "triangle"] + + +def cycle_waveforms(): + """Cycle through different waveform types.""" + for wave_type in waveforms: + print(f"Playing {wave_type} wave...") + wave_gen.set_wave_type(wave_type) + time.sleep(3) + # Silence + wave_gen.set_amplitude(0.0) + time.sleep(2) + + +print("Cycling through waveforms:") +print("sine → square → sawtooth → triangle") +print("Press Ctrl+C to stop") + +App.run(user_loop=cycle_waveforms) diff --git a/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/wave_generator/03_frequency_sweep.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/wave_generator/03_frequency_sweep.py new file mode 100644 index 00000000..614d9962 --- /dev/null +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/wave_generator/03_frequency_sweep.py @@ -0,0 +1,51 @@ +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) +# +# SPDX-License-Identifier: MPL-2.0 + +""" +Frequency Sweep Example + +Demonstrates smooth frequency transitions (glide/portamento effect) +by sweeping through different frequency ranges. +""" + +import time +from arduino.app_bricks.wave_generator import WaveGenerator +from arduino.app_utils import App + +wave_gen = WaveGenerator( + wave_type="sine", + glide=0.05, # 50ms glide for noticeable portamento +) + +App.start_brick(wave_gen) +wave_gen.set_amplitude(0.7) + + +def frequency_sweep(): + """Sweep through frequency ranges.""" + + # Low to high sweep + print("Sweeping low to high (220Hz → 880Hz)...") + for freq in range(220, 881, 20): + wave_gen.set_frequency(float(freq)) + time.sleep(0.1) + + time.sleep(0.5) + + # High to low sweep + print("Sweeping high to low (880Hz → 220Hz)...") + for freq in range(880, 219, -20): + wave_gen.set_frequency(float(freq)) + time.sleep(0.1) + # Fade out + print("Fading out...") + wave_gen.set_amplitude(0.0) + time.sleep(2) + + +print("Frequency sweep demonstration") +print("Listen for smooth glide between frequencies") +print("Press Ctrl+C to stop") + +App.run(user_loop=frequency_sweep) diff --git a/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/wave_generator/04_envelope_control.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/wave_generator/04_envelope_control.py new file mode 100644 index 00000000..395099fb --- /dev/null +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/wave_generator/04_envelope_control.py @@ -0,0 +1,63 @@ +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) +# +# SPDX-License-Identifier: MPL-2.0 + +""" +Envelope Control Example + +Demonstrates amplitude envelope control with different +attack and release times for various sonic effects. +""" + +import time +from arduino.app_bricks.wave_generator import WaveGenerator +from arduino.app_utils import App + +wave_gen = WaveGenerator(wave_type="sine") +App.start_brick(wave_gen) + +wave_gen.set_frequency(440.0) +wave_gen.set_volume(80) + + +def envelope_demo(): + """Demonstrate different envelope settings.""" + + # Fast attack, fast release (percussive) + print("1. Percussive (fast attack/release)...") + wave_gen.set_envelope_params(attack=0.001, release=0.01, glide=0.0) + wave_gen.set_amplitude(0.8) + time.sleep(0.5) + wave_gen.set_amplitude(0.0) + time.sleep(1) + + # Slow attack, fast release (pad-like) + print("2. Pad-like (slow attack, fast release)...") + wave_gen.set_envelope_params(attack=0.2, release=0.05, glide=0.0) + wave_gen.set_amplitude(0.8) + time.sleep(1) + wave_gen.set_amplitude(0.0) + time.sleep(1) + + # Fast attack, slow release (sustained) + print("3. Sustained (fast attack, slow release)...") + wave_gen.set_envelope_params(attack=0.01, release=0.3, glide=0.0) + wave_gen.set_amplitude(0.8) + time.sleep(0.5) + wave_gen.set_amplitude(0.0) + time.sleep(1.5) + + # Medium attack and release (balanced) + print("4. Balanced (medium attack/release)...") + wave_gen.set_envelope_params(attack=0.05, release=0.05, glide=0.0) + wave_gen.set_amplitude(0.8) + time.sleep(0.8) + wave_gen.set_amplitude(0.0) + time.sleep(2) + + +print("Envelope Control Demonstration") +print("Listen to different attack/release characteristics") +print("Press Ctrl+C to stop") + +App.run(user_loop=envelope_demo) diff --git a/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/wave_generator/05_external_speaker.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/wave_generator/05_external_speaker.py new file mode 100644 index 00000000..715e9cc3 --- /dev/null +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/wave_generator/05_external_speaker.py @@ -0,0 +1,77 @@ +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) +# +# SPDX-License-Identifier: MPL-2.0 + +""" +Custom Speaker Configuration Example + +Demonstrates how to use a pre-configured Speaker instance with WaveGenerator. +Use this approach when you need: +- Specific USB speaker selection (USB_SPEAKER_2, etc.) +- Different audio format (S16_LE, etc.) +- Explicit device name ("plughw:CARD=Device,DEV=0") +""" + +import time +from arduino.app_bricks.wave_generator import WaveGenerator +from arduino.app_peripherals.speaker import Speaker +from arduino.app_utils import App + +# List available USB speakers +available_speakers = Speaker.list_usb_devices() +print(f"Available USB speakers: {available_speakers}") + +# Create and configure a Speaker with specific parameters +# For optimal real-time synthesis, align periodsize with WaveGenerator block_duration +block_duration = 0.03 # Default WaveGenerator block duration +sample_rate = 16000 +periodsize = int(sample_rate * block_duration) # 480 frames @ 16kHz + +speaker = Speaker( + device=Speaker.USB_SPEAKER_1, # or explicit device like "plughw:CARD=Device" + sample_rate=sample_rate, + channels=1, + format="FLOAT_LE", + periodsize=periodsize, # Align with WaveGenerator blocks (eliminates glitches) + queue_maxsize=10, # Low latency for real-time audio +) + +# Start the external Speaker manually +# WaveGenerator won't manage its lifecycle (ownership pattern) +speaker.start() + +# Create WaveGenerator with the external speaker +wave_gen = WaveGenerator( + sample_rate=sample_rate, + speaker=speaker, # Pass pre-configured speaker + wave_type="sine", + glide=0.02, +) + +# Start the WaveGenerator (speaker already started above) +App.start_brick(wave_gen) + + +def play_sequence(): + """Play a simple frequency sequence.""" + frequencies = [261.63, 293.66, 329.63, 349.23, 392.00, 440.00, 493.88, 523.25] # C4 to C5 + + for freq in frequencies: + print(f"Playing {freq:.2f} Hz") + wave_gen.set_frequency(freq) + wave_gen.set_amplitude(0.7) + time.sleep(0.5) + + # Fade out + wave_gen.set_amplitude(0.0) + time.sleep(1) + + +print("Playing musical scale with external speaker...") +print("Press Ctrl+C to stop") + +App.run(user_loop=play_sequence) + +# Stop external Speaker manually (WaveGenerator doesn't manage external lifecycle) +speaker.stop() +print("Done") diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/weather_forecast/weather_forecast_by_city_example.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/weather_forecast/weather_forecast_by_city_example.py similarity index 81% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/weather_forecast/weather_forecast_by_city_example.py rename to internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/weather_forecast/weather_forecast_by_city_example.py index 44241a76..cb9a1081 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/weather_forecast/weather_forecast_by_city_example.py +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/weather_forecast/weather_forecast_by_city_example.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/weather_forecast/weather_forecast_by_coords_example.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/weather_forecast/weather_forecast_by_coords_example.py similarity index 81% rename from internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/weather_forecast/weather_forecast_by_coords_example.py rename to internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/weather_forecast/weather_forecast_by_coords_example.py index 740740a3..11b8ca9d 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/weather_forecast/weather_forecast_by_coords_example.py +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/weather_forecast/weather_forecast_by_coords_example.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/web_ui/1_serve_webapp.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/web_ui/1_serve_webapp.py similarity index 80% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/web_ui/1_serve_webapp.py rename to internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/web_ui/1_serve_webapp.py index 55fb6ca7..4d8768aa 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/web_ui/1_serve_webapp.py +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/web_ui/1_serve_webapp.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/web_ui/2_serve_webapp_and_api.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/web_ui/2_serve_webapp_and_api.py similarity index 79% rename from internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/web_ui/2_serve_webapp_and_api.py rename to internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/web_ui/2_serve_webapp_and_api.py index ff1c7cc0..19afb676 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/web_ui/2_serve_webapp_and_api.py +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/web_ui/2_serve_webapp_and_api.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/web_ui/3_connect_disconnect.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/web_ui/3_connect_disconnect.py similarity index 81% rename from internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/web_ui/3_connect_disconnect.py rename to internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/web_ui/3_connect_disconnect.py index 0a98cd99..74906149 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/examples/arduino/web_ui/3_connect_disconnect.py +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/web_ui/3_connect_disconnect.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/web_ui/4_on_message.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/web_ui/4_on_message.py similarity index 80% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/web_ui/4_on_message.py rename to internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/web_ui/4_on_message.py index cfec4c7c..7eb1316f 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/web_ui/4_on_message.py +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/web_ui/4_on_message.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/web_ui/5_send_message.py b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/web_ui/5_send_message.py similarity index 80% rename from debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/web_ui/5_send_message.py rename to internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/web_ui/5_send_message.py index 9bb52450..00e19bc7 100644 --- a/debian/arduino-app-cli/home/arduino/.local/share/arduino-app-cli/assets/0.5.0/examples/arduino/web_ui/5_send_message.py +++ b/internal/e2e/daemon/testdata/assets/0.6.0/examples/arduino/web_ui/5_send_message.py @@ -1,4 +1,4 @@ -# SPDX-FileCopyrightText: Copyright (C) 2025 ARDUINO SA +# SPDX-FileCopyrightText: Copyright (C) ARDUINO SRL (http://www.arduino.cc) # # SPDX-License-Identifier: MPL-2.0 diff --git a/internal/e2e/daemon/testdata/assets/0.5.0/models-list.yaml b/internal/e2e/daemon/testdata/assets/0.6.0/models-list.yaml similarity index 94% rename from internal/e2e/daemon/testdata/assets/0.5.0/models-list.yaml rename to internal/e2e/daemon/testdata/assets/0.6.0/models-list.yaml index 7c511011..b4109df2 100644 --- a/internal/e2e/daemon/testdata/assets/0.5.0/models-list.yaml +++ b/internal/e2e/daemon/testdata/assets/0.6.0/models-list.yaml @@ -18,7 +18,7 @@ models: - yolox-object-detection: runner: brick name : "General purpose object detection - YoloX" - description: "General purpose object detection model based on YoloX Nano. This model is trained on the COCO dataset and can detect 80 different object classes." + description: "General purpose object detection model based on YoloX-Nano. This model is trained on the COCO dataset and can detect 80 different object classes." model_configuration: "EI_OBJ_DETECTION_MODEL": "/models/ootb/ei/yolo-x-nano.eim" model_labels: @@ -105,6 +105,7 @@ models: metadata: source: "edgeimpulse" ei-project-id: 717280 + ei-model-url: "https://studio.edgeimpulse.com/public/717280/live" source-model-id: "YOLOX-Nano" source-model-url: "https://github.com/Megvii-BaseDetection/YOLOX" bricks: @@ -1071,6 +1072,7 @@ models: metadata: source: "edgeimpulse" ei-project-id: 708500 + ei-model-url: "https://studio.edgeimpulse.com/public/708500/live" ei-gpu-mode: true source-model-id: "MobileNetV2" source-model-url: "https://www.tensorflow.org/api_docs/python/tf/keras/applications/MobileNetV2" @@ -1089,9 +1091,10 @@ models: metadata: source: "edgeimpulse" ei-project-id: 755016 + ei-model-url: "https://studio.edgeimpulse.com/public/755016/live" ei-gpu-mode: true source-model-id: "person-classification-wakevision" - source-model-url: "https://studio.edgeimpulse.com/studio/755016" + source-model-url: "https://studio.edgeimpulse.com/public/755016/live" bricks: - arduino:image_classification - arduino:video_image_classification @@ -1103,15 +1106,16 @@ models: "EI_V_ANOMALY_DETECTION_MODEL": "/models/ootb/ei/concrete-crack-anomaly-detection.eim" metadata: source: "edgeimpulse" - ei-project-id: 288658 + ei-project-id: 800941 + ei-model-url: "https://studio.edgeimpulse.com/public/800941/live" source-model-id: "concrete-crack-anomaly-detection" - source-model-url: "https://studio.edgeimpulse.com/public/288658" + source-model-url: "https://studio.edgeimpulse.com/public/800941/live" bricks: - arduino:visual_anomaly_detection - keyword-spotting-hey-arduino: runner: brick name : "Keyword spotting - Hey Arduino!" - description: "A keyword-spotting model to detect the 'Hey Arduino!' in audio recordings" + description: "A keyword-spotting model to detect the 'Hey Arduino!' in audio streams." model_configuration: "EI_KEYWORD_SPOTTING_MODEL": "/models/ootb/ei/keyword-spotting-hey-arduino.eim" model_labels: @@ -1120,12 +1124,14 @@ models: - "other" metadata: source: "edgeimpulse" - ei-project-id: 757509 + ei-project-id: 757509 + ei-model-url: "https://studio.edgeimpulse.com/studio/757509/live" ei-impulse-id: 30 source-model-id: "hey-arduino" - source-model-url: "https://studio.edgeimpulse.com/studio/757509" + source-model-url: "https://studio.edgeimpulse.com/studio/757509/live" + private: true bricks: - - arduino:keyword_spotter + - arduino:keyword_spotting - updown-wave-motion-detection: runner: brick name : "Continuous motion detection" @@ -1140,9 +1146,11 @@ models: metadata: source: "edgeimpulse" ei-project-id: 734960 + ei-model-url: "https://studio.edgeimpulse.com/public/734960/live" source-model-id: "continuous-motion-detection" - source-model-url: "https://studio.edgeimpulse.com/studio/734960" - brick: arduino:motion_detection + source-model-url: "https://studio.edgeimpulse.com/public/734960/live" + bricks: + - arduino:motion_detection - fan-anomaly-detection: runner: brick name : "Fan anomaly detection" @@ -1152,8 +1160,9 @@ models: metadata: source: "edgeimpulse" ei-project-id: 774707 + ei-model-url: "https://studio.edgeimpulse.com/public/774707/live" source-model-id: "fan-anomaly-detection" - source-model-url: "https://studio.edgeimpulse.com/studio/774707" + source-model-url: "https://studio.edgeimpulse.com/public/774707/live" bricks: - arduino:vibration_anomaly_detection - glass-breaking: @@ -1168,7 +1177,9 @@ models: metadata: source: "edgeimpulse" ei-project-id: 749446 + ei-model-url: "https://studio.edgeimpulse.com/public/749446/live" source-model-id: "glass-breaking" - source-model-url: "https://studio.edgeimpulse.com/studio/749446" + source-model-url: "https://studio.edgeimpulse.com/public/749446/live" + private: true bricks: - - arduino:audio_classifier + - arduino:audio_classification diff --git a/internal/e2e/updatetest/helpers.go b/internal/e2e/updatetest/helpers.go new file mode 100644 index 00000000..410a9999 --- /dev/null +++ b/internal/e2e/updatetest/helpers.go @@ -0,0 +1,331 @@ +package updatetest + +import ( + "bufio" + "bytes" + "context" + "encoding/json" + "fmt" + "iter" + "log" + "net" + "net/http" + "os" + "os/exec" + "path/filepath" + "strconv" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func fetchDebPackageLatest(t *testing.T, path, repo string) string { + t.Helper() + + repo = fmt.Sprintf("github.com/arduino/%s", repo) + cmd := exec.Command( + "gh", "release", "list", + "--repo", repo, + "--exclude-pre-releases", + "--limit", "1", + ) + + output, err := cmd.CombinedOutput() + if err != nil { + log.Fatalf("command failed: %v\nOutput: %s", err, output) + } + + fmt.Println(string(output)) + + fields := strings.Fields(string(output)) + if len(fields) == 0 { + log.Fatal("could not parse tag from gh release list output") + } + tag := fields[0] + + fmt.Println("Detected tag:", tag) + cmd2 := exec.Command( + "gh", "release", "download", + tag, + "--repo", repo, + "--pattern", "*.deb", + "--dir", path, + ) + + out, err := cmd2.CombinedOutput() + if err != nil { + log.Fatalf("download failed: %v\nOutput: %s", err, out) + } + + return tag + +} + +func buildDebVersion(t *testing.T, storePath, tagVersion, arch string) { + t.Helper() + cwd, err := os.Getwd() + if err != nil { + panic(err) + } + outputDir := filepath.Join(cwd, storePath) + + tagVersion = fmt.Sprintf("VERSION=%s", tagVersion) + arch = fmt.Sprintf("ARCH=%s", arch) + outputDir = fmt.Sprintf("OUTPUT=%s", outputDir) + + cmd := exec.Command( + "go", "tool", "task", "build-deb", + tagVersion, + arch, + outputDir, + ) + + if err := cmd.Run(); err != nil { + log.Fatalf("failed to run build command: %v", err) + } +} + +func genMajorTag(t *testing.T, tag string) string { + t.Helper() + + parts := strings.Split(tag, ".") + last := parts[len(parts)-1] + + lastNum, _ := strconv.Atoi(strings.TrimPrefix(last, "v")) + lastNum++ + + parts[len(parts)-1] = strconv.Itoa(lastNum) + newTag := strings.Join(parts, ".") + + return newTag +} + +func genMinorTag(t *testing.T, tag string) string { + t.Helper() + + parts := strings.Split(tag, ".") + last := parts[len(parts)-1] + + lastNum, _ := strconv.Atoi(strings.TrimPrefix(last, "v")) + if lastNum > 0 { + lastNum-- + } + + parts[len(parts)-1] = strconv.Itoa(lastNum) + newTag := strings.Join(parts, ".") + + if !strings.HasPrefix(newTag, "v") { + newTag = "v" + newTag + } + return newTag +} + +func buildDockerImage(t *testing.T, dockerfile, name, arch string) { + t.Helper() + + arch = fmt.Sprintf("ARCH=%s", arch) + + cmd := exec.Command("docker", "build", "--build-arg", arch, "-t", name, "-f", dockerfile, ".") + // Capture both stdout and stderr + var out bytes.Buffer + var stderr bytes.Buffer + cmd.Stdout = &out + cmd.Stderr = &stderr + + err := cmd.Run() + if err != nil { + fmt.Printf("❌ Docker build failed: %v\n", err) + fmt.Printf("---- STDERR ----\n%s\n", stderr.String()) + fmt.Printf("---- STDOUT ----\n%s\n", out.String()) + return + } + + fmt.Println("✅ Docker build succeeded!") +} + +func startDockerContainer(t *testing.T, containerName string, containerImageName string) { + t.Helper() + + cmd := exec.Command( + "docker", "run", "--rm", "-d", + "-p", "8800:8800", + "--privileged", + "--cgroupns=host", + "--network", "host", + "-v", "/sys/fs/cgroup:/sys/fs/cgroup:rw", + "-v", "/var/run/docker.sock:/var/run/docker.sock", + "-e", "DOCKER_HOST=unix:///var/run/docker.sock", + "--name", containerName, + containerImageName, + ) + + if err := cmd.Run(); err != nil { + t.Fatalf("failed to run container: %v", err) + } + +} + +func getAppCliVersion(t *testing.T, containerName string) string { + t.Helper() + + cmd := exec.Command( + "docker", "exec", + "--user", "arduino", + containerName, + "arduino-app-cli", "version", "--format", "json", + ) + output, err := cmd.CombinedOutput() + if err != nil { + log.Fatalf("command failed: %v\nOutput: %s", err, output) + } + + var version struct { + Version string `json:"version"` + DaemonVersion string `json:"daemon_version"` + } + err = json.Unmarshal(output, &version) + require.NoError(t, err) + // TODO to enable after 0.6.7 + // require.Equal(t, version.Version, version.DaemonVersion, "client and daemon versions should match") + require.NotEmpty(t, version.Version) + return version.Version + +} + +func runSystemUpdate(t *testing.T, containerName string) { + t.Helper() + + cmd := exec.Command( + "docker", "exec", + "--user", "arduino", + containerName, + "arduino-app-cli", "system", "update", "--yes", + ) + output, err := cmd.CombinedOutput() + require.NoError(t, err, "system update failed: %s", output) + t.Logf("system update output: %s", output) +} + +func stopDockerContainer(t *testing.T, containerName string) { + t.Helper() + + cleanupCmd := exec.Command("docker", "rm", "-f", containerName) + + fmt.Println("🧹 Removing Docker container " + containerName) + if err := cleanupCmd.Run(); err != nil { + fmt.Printf("⚠️ Warning: could not remove container (might not exist): %v\n", err) + } + +} + +func putUpdateRequest(t *testing.T, host string) { + + t.Helper() + + url := fmt.Sprintf("http://%s/v1/system/update/apply", host) + + req, err := http.NewRequest(http.MethodPut, url, nil) + if err != nil { + log.Fatalf("Error creating request: %v", err) + } + + req.Header.Set("Content-Type", "application/json") + + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + log.Fatalf("Error sending request: %v", err) + } + defer resp.Body.Close() + + require.Equal(t, 202, resp.StatusCode) + +} + +func NewSSEClient(ctx context.Context, method, url string) iter.Seq2[Event, error] { + return func(yield func(Event, error) bool) { + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + if err != nil { + _ = yield(Event{}, err) + return + } + + resp, err := http.DefaultClient.Do(req) + if err != nil { + _ = yield(Event{}, err) + return + } + defer resp.Body.Close() + + if resp.StatusCode != 200 { + _ = yield(Event{}, fmt.Errorf("got response status code %d", resp.StatusCode)) + return + } + + reader := bufio.NewReader(resp.Body) + + evt := Event{} + for { + line, err := reader.ReadString('\n') + if err != nil { + _ = yield(Event{}, err) + return + } + switch { + case strings.HasPrefix(line, "data:"): + evt.Data = []byte(strings.TrimSpace(strings.TrimPrefix(line, "data:"))) + case strings.HasPrefix(line, "event:"): + evt.Event = strings.TrimSpace(strings.TrimPrefix(line, "event:")) + case strings.HasPrefix(line, "id:"): + evt.ID = strings.TrimSpace(strings.TrimPrefix(line, "id:")) + case strings.HasPrefix(line, "\n"): + if !yield(evt, nil) { + return + } + evt = Event{} + default: + _ = yield(Event{}, fmt.Errorf("unknown line: '%s'", line)) + return + } + } + } +} + +type Event struct { + ID string + Event string + Data []byte // json +} + +func waitForPort(t *testing.T, host string, timeout time.Duration) { // nolint:unparam + t.Helper() + deadline := time.Now().Add(timeout) + for time.Now().Before(deadline) { + conn, err := net.DialTimeout("tcp", host, 500*time.Millisecond) + if err == nil { + _ = conn.Close() + t.Logf("Server is up on %s", host) + return + } + time.Sleep(200 * time.Millisecond) + } + t.Fatalf("Server at %s did not start within %v", host, timeout) +} + +func waitForUpgrade(t *testing.T, host string) { + t.Helper() + + url := fmt.Sprintf("http://%s/v1/system/update/events", host) + + itr := NewSSEClient(t.Context(), "GET", url) + for event, err := range itr { + require.NoError(t, err) + t.Logf("Received event: ID=%s, Event=%s, Data=%s\n", event.ID, event.Event, string(event.Data)) + if event.Event == "restarting" { + break + } + } + +} diff --git a/internal/e2e/updatetest/test.Dockerfile b/internal/e2e/updatetest/test.Dockerfile new file mode 100644 index 00000000..578e71c0 --- /dev/null +++ b/internal/e2e/updatetest/test.Dockerfile @@ -0,0 +1,33 @@ +FROM debian:trixie + +RUN apt update && \ + apt install -y systemd systemd-sysv dbus \ + sudo docker.io ca-certificates curl gnupg \ + dpkg-dev apt-utils adduser gzip && \ + rm -rf /var/lib/apt/lists/* + +ARG ARCH=amd64 + +COPY build/stable/arduino-app-cli*_${ARCH}.deb /tmp/stable.deb +COPY build/arduino-app-cli*_${ARCH}.deb /tmp/unstable.deb +COPY build/stable/arduino-router*_${ARCH}.deb /tmp/router.deb + +RUN apt update && apt install -y /tmp/stable.deb /tmp/router.deb \ + && rm /tmp/stable.deb /tmp/router.deb \ + && mkdir -p /var/www/html/myrepo/dists/trixie/main/binary-${ARCH} \ + && mv /tmp/unstable.deb /var/www/html/myrepo/dists/trixie/main/binary-${ARCH}/ + +WORKDIR /var/www/html/myrepo +RUN dpkg-scanpackages dists/trixie/main/binary-${ARCH} /dev/null | gzip -9c > dists/trixie/main/binary-${ARCH}/Packages.gz +WORKDIR / + +RUN usermod -s /bin/bash arduino || true +RUN mkdir -p /home/arduino && chown -R arduino:arduino /home/arduino +RUN usermod -aG docker arduino + +RUN echo "deb [trusted=yes arch=${ARCH}] file:/var/www/html/myrepo trixie main" \ + > /etc/apt/sources.list.d/my-mock-repo.list + +EXPOSE 8800 +# CMD: systemd must be PID 1 +CMD ["/sbin/init"] diff --git a/internal/e2e/updatetest/update_test.go b/internal/e2e/updatetest/update_test.go new file mode 100644 index 00000000..061a8ff6 --- /dev/null +++ b/internal/e2e/updatetest/update_test.go @@ -0,0 +1,122 @@ +package updatetest + +import ( + "fmt" + "os" + "runtime" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +var arch = runtime.GOARCH + +const dockerFile = "test.Dockerfile" +const daemonHost = "127.0.0.1:8800" + +func TestUpdatePackage(t *testing.T) { + fmt.Printf("***** ARCH %s ***** \n", arch) + + t.Run("Stable To Current", func(t *testing.T) { + t.Cleanup(func() { os.RemoveAll("build") }) + + tagAppCli := fetchDebPackageLatest(t, "build/stable", "arduino-app-cli") + fetchDebPackageLatest(t, "build/stable", "arduino-router") + majorTag := genMajorTag(t, tagAppCli) + + fmt.Printf("Updating from stable version %s to unstable version %s \n", tagAppCli, majorTag) + fmt.Printf("Building local deb version %s \n", majorTag) + buildDebVersion(t, "build", majorTag, arch) + + const dockerImageName = "apt-test-update-image" + fmt.Println("**** BUILD docker image *****") + buildDockerImage(t, dockerFile, dockerImageName, arch) + //TODO: t cleanup remove docker image + + t.Run("CLI Command", func(t *testing.T) { + const containerName = "apt-test-update" + t.Cleanup(func() { stopDockerContainer(t, containerName) }) + + fmt.Println("**** RUN docker image *****") + startDockerContainer(t, containerName, dockerImageName) + waitForPort(t, daemonHost, 5*time.Second) + + preUpdateVersion := getAppCliVersion(t, containerName) + require.Equal(t, "v"+preUpdateVersion, tagAppCli) + runSystemUpdate(t, containerName) + postUpdateVersion := getAppCliVersion(t, containerName) + require.Equal(t, "v"+postUpdateVersion, majorTag) + }) + + t.Run("HTTP Request", func(t *testing.T) { + const containerName = "apt-test-update-http" + t.Cleanup(func() { stopDockerContainer(t, containerName) }) + + startDockerContainer(t, containerName, dockerImageName) + waitForPort(t, daemonHost, 5*time.Second) + + preUpdateVersion := getAppCliVersion(t, containerName) + require.Equal(t, "v"+preUpdateVersion, tagAppCli) + + putUpdateRequest(t, daemonHost) + waitForUpgrade(t, daemonHost) + + postUpdateVersion := getAppCliVersion(t, containerName) + require.Equal(t, "v"+postUpdateVersion, majorTag) + }) + + }) + + t.Run("CurrentToStable", func(t *testing.T) { + t.Cleanup(func() { os.RemoveAll("build") }) + + tagAppCli := fetchDebPackageLatest(t, "build", "arduino-app-cli") + fetchDebPackageLatest(t, "build/stable", "arduino-router") + minorTag := genMinorTag(t, tagAppCli) + + fmt.Printf("Updating from unstable version %s to stable version %s \n", minorTag, tagAppCli) + fmt.Printf("Building local deb version %s \n", minorTag) + buildDebVersion(t, "build/stable", minorTag, arch) + + fmt.Println("**** BUILD docker image *****") + const dockerImageName = "test-apt-update-unstable-image" + + buildDockerImage(t, dockerFile, dockerImageName, arch) + //TODO: t cleanup remove docker image + + t.Run("CLI Command", func(t *testing.T) { + const containerName = "apt-test-update-unstable" + t.Cleanup(func() { stopDockerContainer(t, containerName) }) + + fmt.Println("**** RUN docker image *****") + startDockerContainer(t, containerName, dockerImageName) + waitForPort(t, daemonHost, 5*time.Second) + + preUpdateVersion := getAppCliVersion(t, containerName) + require.Equal(t, "v"+preUpdateVersion, minorTag) + runSystemUpdate(t, containerName) + postUpdateVersion := getAppCliVersion(t, containerName) + require.Equal(t, "v"+postUpdateVersion, tagAppCli) + }) + + t.Run("HTTP Request", func(t *testing.T) { + const containerName = "apt-test-update--unstable-http" + t.Cleanup(func() { stopDockerContainer(t, containerName) }) + + startDockerContainer(t, containerName, dockerImageName) + waitForPort(t, daemonHost, 5*time.Second) + + preUpdateVersion := getAppCliVersion(t, containerName) + require.Equal(t, "v"+preUpdateVersion, minorTag) + + putUpdateRequest(t, daemonHost) + waitForUpgrade(t, daemonHost) + + postUpdateVersion := getAppCliVersion(t, containerName) + require.Equal(t, "v"+postUpdateVersion, tagAppCli) + }) + + }) + +} diff --git a/internal/orchestrator/app/app.go b/internal/orchestrator/app/app.go index c40c9009..dff16ed3 100644 --- a/internal/orchestrator/app/app.go +++ b/internal/orchestrator/app/app.go @@ -30,33 +30,32 @@ import ( type ArduinoApp struct { Name string MainPythonFile *paths.Path - MainSketchPath *paths.Path + mainSketchPath *paths.Path FullPath *paths.Path // FullPath is the path to the App folder Descriptor AppDescriptor } // Load creates an App instance by reading all the files composing an app and grouping them // by file type. -func Load(appPath string) (ArduinoApp, error) { - path := paths.New(appPath) - if path == nil { +func Load(appPath *paths.Path) (ArduinoApp, error) { + if appPath == nil { return ArduinoApp{}, errors.New("empty app path") } - exist, err := path.IsDirCheck() + exist, err := appPath.IsDirCheck() if err != nil { return ArduinoApp{}, fmt.Errorf("app path is not valid: %w", err) } if !exist { - return ArduinoApp{}, fmt.Errorf("app path must be a directory: %s", path) + return ArduinoApp{}, fmt.Errorf("app path must be a directory: %s", appPath) } - path, err = path.Abs() + appPath, err = appPath.Abs() if err != nil { return ArduinoApp{}, fmt.Errorf("cannot get absolute path for app: %w", err) } app := ArduinoApp{ - FullPath: path, + FullPath: appPath, Descriptor: AppDescriptor{}, } @@ -71,16 +70,16 @@ func Load(appPath string) (ArduinoApp, error) { return ArduinoApp{}, errors.New("descriptor app.yaml file missing from app") } - if path.Join("python", "main.py").Exist() { - app.MainPythonFile = path.Join("python", "main.py") + if appPath.Join("python", "main.py").Exist() { + app.MainPythonFile = appPath.Join("python", "main.py") } - if path.Join("sketch", "sketch.ino").Exist() { + if appPath.Join("sketch", "sketch.ino").Exist() { // TODO: check sketch casing? - app.MainSketchPath = path.Join("sketch") + app.mainSketchPath = appPath.Join("sketch") } - if app.MainPythonFile == nil && app.MainSketchPath == nil { + if app.MainPythonFile == nil && app.mainSketchPath == nil { return ArduinoApp{}, errors.New("main python file and sketch file missing from app") } @@ -92,6 +91,13 @@ func Load(appPath string) (ArduinoApp, error) { return app, nil } +func (a *ArduinoApp) GetSketchPath() (*paths.Path, bool) { + if a == nil || a.mainSketchPath == nil { + return nil, false + } + return a.mainSketchPath, true +} + // GetDescriptorPath returns the path to the app descriptor file (app.yaml or app.yml) func (a *ArduinoApp) GetDescriptorPath() *paths.Path { descriptorFile := a.FullPath.Join("app.yaml") diff --git a/internal/orchestrator/app/app_test.go b/internal/orchestrator/app/app_test.go index 47e3f53f..d8b36eef 100644 --- a/internal/orchestrator/app/app_test.go +++ b/internal/orchestrator/app/app_test.go @@ -25,35 +25,55 @@ import ( ) func TestLoad(t *testing.T) { + t.Run("it fails if the app path is nil", func(t *testing.T) { + app, err := Load(nil) + assert.Error(t, err) + assert.Empty(t, app) + assert.Contains(t, err.Error(), "empty app path") + }) + t.Run("it fails if the app path is empty", func(t *testing.T) { - app, err := Load("") + app, err := Load(paths.New("")) assert.Error(t, err) assert.Empty(t, app) assert.Contains(t, err.Error(), "empty app path") }) t.Run("it fails if the app path exist but it's a file", func(t *testing.T) { - _, err := Load("testdata/app.yaml") + _, err := Load(paths.New("testdata/app.yaml")) assert.Error(t, err) assert.Contains(t, err.Error(), "app path must be a directory") }) t.Run("it fails if the app path does not exist", func(t *testing.T) { - _, err := Load("testdata/this-folder-does-not-exist") + _, err := Load(paths.New("testdata/this-folder-does-not-exist")) assert.Error(t, err) assert.Contains(t, err.Error(), "app path is not valid") }) t.Run("it loads an app correctly", func(t *testing.T) { - app, err := Load("testdata/AppSimple") + app, err := Load(paths.New("testdata/AppSimple")) assert.NoError(t, err) assert.NotEmpty(t, app) assert.NotNil(t, app.MainPythonFile) assert.Equal(t, f.Must(filepath.Abs("testdata/AppSimple/python/main.py")), app.MainPythonFile.String()) + sketchPath, ok := app.GetSketchPath() + assert.True(t, ok) + assert.NotNil(t, sketchPath) + assert.Equal(t, f.Must(filepath.Abs("testdata/AppSimple/sketch")), sketchPath.String()) + }) + + t.Run("it loads an app with misssing sketch folder", func(t *testing.T) { + app, err := Load(paths.New("testdata/MissingSketch")) + assert.NoError(t, err) + assert.NotEmpty(t, app) + + assert.NotNil(t, app.MainPythonFile) - assert.NotNil(t, app.MainSketchPath) - assert.Equal(t, f.Must(filepath.Abs("testdata/AppSimple/sketch")), app.MainSketchPath.String()) + sketchPath, ok := app.GetSketchPath() + assert.False(t, ok) + assert.Nil(t, sketchPath) }) } @@ -61,7 +81,7 @@ func TestMissingDescriptor(t *testing.T) { appFolderPath := paths.New("testdata", "MissingDescriptor") // Load app - app, err := Load(appFolderPath.String()) + app, err := Load(appFolderPath) assert.Error(t, err) assert.ErrorContains(t, err, "descriptor app.yaml file missing from app") assert.Empty(t, app) @@ -71,7 +91,7 @@ func TestMissingMains(t *testing.T) { appFolderPath := paths.New("testdata", "MissingMains") // Load app - app, err := Load(appFolderPath.String()) + app, err := Load(appFolderPath) assert.Error(t, err) assert.ErrorContains(t, err, "main python file and sketch file missing from app") assert.Empty(t, app) diff --git a/internal/orchestrator/app/generator/app_generator.go b/internal/orchestrator/app/generator/app_generator.go index 3dab7e53..e77a48f7 100644 --- a/internal/orchestrator/app/generator/app_generator.go +++ b/internal/orchestrator/app/generator/app_generator.go @@ -33,85 +33,124 @@ import ( const templateRoot = "app_template" -type Opts int - -const ( - None Opts = 0 - SkipSketch Opts = 1 << iota - SkipPython -) - -//go:embed app_template +//go:embed all:app_template var fsApp embed.FS -func GenerateApp(basePath *paths.Path, app app.AppDescriptor, options Opts) error { +func GenerateApp(basePath *paths.Path, app app.AppDescriptor, skipSketch bool) error { if err := basePath.MkdirAll(); err != nil { return fmt.Errorf("failed to create app directory: %w", err) } - isSkipSketchSet := options&SkipSketch != 0 - isSkipPythonSet := options&SkipPython != 0 - if !isSkipSketchSet { + if !skipSketch { if err := generateSketch(basePath); err != nil { return fmt.Errorf("failed to create sketch: %w", err) } } - if !isSkipPythonSet { - if err := generatePython(basePath); err != nil { - return fmt.Errorf("failed to create python: %w", err) - } - } - if err := generateReadme(basePath, app); err != nil { - slog.Warn("error generating readme for app %q: %w", app.Name, err) + + if err := generatePython(basePath); err != nil { + return fmt.Errorf("failed to create python: %w", err) } - if err := generateAppYaml(basePath, app); err != nil { - return fmt.Errorf("failed to create app content: %w", err) + if err := generateApp(basePath, app); err != nil { + return fmt.Errorf("failed to create app.yaml: %w", err) } return nil } -func generateAppYaml(basePath *paths.Path, app app.AppDescriptor) error { - appYamlTmpl := template.Must( - template.New("app.yaml"). - Funcs(template.FuncMap{"joinInts": formatPorts}). - ParseFS(fsApp, path.Join(templateRoot, "app.yaml.template")), - ) +func generateApp(basePath *paths.Path, appDesc app.AppDescriptor) error { + generateAppYaml := func(basePath *paths.Path, app app.AppDescriptor) error { + appYamlTmpl := template.Must( + template.New("app.yaml"). + Funcs(template.FuncMap{"joinInts": formatPorts}). + ParseFS(fsApp, path.Join(templateRoot, "app.yaml.template")), + ) - outputPath := basePath.Join("app.yaml") - file, err := os.Create(outputPath.String()) - if err != nil { - return fmt.Errorf("failed to create file %s: %w", outputPath.String(), err) - } - defer file.Close() + outputPath := basePath.Join("app.yaml") + file, err := os.Create(outputPath.String()) + if err != nil { + return fmt.Errorf("failed to create file %s: %w", outputPath.String(), err) + } + defer file.Close() + + return appYamlTmpl.ExecuteTemplate(file, "app.yaml.template", app) + } + + generateReadme := func(basePath *paths.Path, app app.AppDescriptor) error { + readmeTmpl := template.Must(template.ParseFS(fsApp, path.Join(templateRoot, "README.md.template"))) + data := struct { + Title string + Icon string + Description string + Ports string + }{ + Title: app.Name, + Icon: app.Icon, + Description: app.Description, + } - return appYamlTmpl.ExecuteTemplate(file, "app.yaml.template", app) -} + if len(app.Ports) > 0 { + data.Ports = "Available application ports: " + formatPorts(app.Ports) + } + + outputPath := basePath.Join("README.md") + file, err := os.Create(outputPath.String()) + if err != nil { + return fmt.Errorf("failed to create file %s: %w", outputPath.String(), err) + } + defer file.Close() + + return readmeTmpl.Execute(file, data) + } -func generateReadme(basePath *paths.Path, app app.AppDescriptor) error { - readmeTmpl := template.Must(template.ParseFS(fsApp, path.Join(templateRoot, "README.md.template"))) - data := struct { - Title string - Icon string - Description string - Ports string - }{ - Title: app.Name, - Icon: app.Icon, - Description: app.Description, + copyRootFiles := func() error { + fileList, err := fsApp.ReadDir(templateRoot) + if err != nil { + return fmt.Errorf("read template directory: %w", err) + } + for _, filePath := range fileList { + if filePath.IsDir() { + continue + } + if path.Ext(filePath.Name()) == ".template" { + continue + } + + srcPath := path.Join(templateRoot, filePath.Name()) + destPath := basePath.Join(filePath.Name()) + + if err := func() error { + srcFile, err := fsApp.Open(srcPath) + if err != nil { + return err + } + defer srcFile.Close() + + destFile, err := destPath.Create() + if err != nil { + return fmt.Errorf("create %q file: %w", destPath, err) + } + defer destFile.Close() + + _, err = io.Copy(destFile, srcFile) + return err + }(); err != nil { + return fmt.Errorf("copy file %s: %w", filePath.Name(), err) + } + } + return nil } - if len(app.Ports) > 0 { - data.Ports = "Available application ports: " + formatPorts(app.Ports) + if err := copyRootFiles(); err != nil { + slog.Warn("error copying root files for app %q: %w", appDesc.Name, err) + } + if err := generateReadme(basePath, appDesc); err != nil { + slog.Warn("error generating readme for app %q: %w", appDesc.Name, err) } - outputPath := basePath.Join("README.md") - file, err := os.Create(outputPath.String()) - if err != nil { - return fmt.Errorf("failed to create file %s: %w", outputPath.String(), err) + if err := generateAppYaml(basePath, appDesc); err != nil { + return fmt.Errorf("generate app.yaml: %w", err) } - defer file.Close() - return readmeTmpl.Execute(file, data) + return nil } func generatePython(basePath *paths.Path) error { diff --git a/internal/orchestrator/app/generator/app_generator_test.go b/internal/orchestrator/app/generator/app_generator_test.go index 5763d386..729ce950 100644 --- a/internal/orchestrator/app/generator/app_generator_test.go +++ b/internal/orchestrator/app/generator/app_generator_test.go @@ -40,31 +40,25 @@ func TestGenerateApp(t *testing.T) { testCases := []struct { name string - options Opts + skipSketch bool goldenPath string }{ { name: "generate complete app", - options: None, goldenPath: "testdata/app-all.golden", }, { name: "skip sketch", - options: SkipSketch, + skipSketch: true, goldenPath: "testdata/app-no-sketch.golden", }, - { - name: "skip python", - options: SkipPython, - goldenPath: "testdata/app-no-python.golden", - }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { tempDir := t.TempDir() - err := GenerateApp(paths.New(tempDir), baseApp, tc.options) + err := GenerateApp(paths.New(tempDir), baseApp, tc.skipSketch) require.NoError(t, err) if os.Getenv("UPDATE_GOLDEN") == "true" { diff --git a/internal/orchestrator/app/generator/app_template/.gitignore b/internal/orchestrator/app/generator/app_template/.gitignore new file mode 100644 index 00000000..90ae0403 --- /dev/null +++ b/internal/orchestrator/app/generator/app_template/.gitignore @@ -0,0 +1,2 @@ +# ignore app cache folder +.cache/ diff --git a/internal/orchestrator/app/generator/app_template/python/main.py b/internal/orchestrator/app/generator/app_template/python/main.py index 9ef98b13..fb56fb23 100644 --- a/internal/orchestrator/app/generator/app_template/python/main.py +++ b/internal/orchestrator/app/generator/app_template/python/main.py @@ -1,6 +1,15 @@ -def main(): - print("Hello World!") +import time +from arduino.app_utils import App -if __name__ == "__main__": - main() +print("Hello world!") + + +def loop(): + """This function is called repeatedly by the App framework.""" + # You can replace this with any code you want your App to run repeatedly. + time.sleep(10) + + +# See: https://docs.arduino.cc/software/app-lab/tutorials/getting-started/#app-run +App.run(user_loop=loop) diff --git a/internal/orchestrator/app/generator/app_template/sketch/sketch.ino b/internal/orchestrator/app/generator/app_template/sketch/sketch.ino index 612c51b8..95c2b6eb 100644 --- a/internal/orchestrator/app/generator/app_template/sketch/sketch.ino +++ b/internal/orchestrator/app/generator/app_template/sketch/sketch.ino @@ -1,3 +1,9 @@ -void setup() {} +void setup() { + // put your setup code here, to run once: -void loop() {} \ No newline at end of file +} + +void loop() { + // put your main code here, to run repeatedly: + +} diff --git a/internal/orchestrator/app/generator/testdata/app-all.golden/.gitignore b/internal/orchestrator/app/generator/testdata/app-all.golden/.gitignore new file mode 100644 index 00000000..90ae0403 --- /dev/null +++ b/internal/orchestrator/app/generator/testdata/app-all.golden/.gitignore @@ -0,0 +1,2 @@ +# ignore app cache folder +.cache/ diff --git a/internal/orchestrator/app/generator/testdata/app-all.golden/python/main.py b/internal/orchestrator/app/generator/testdata/app-all.golden/python/main.py index 9ef98b13..fb56fb23 100644 --- a/internal/orchestrator/app/generator/testdata/app-all.golden/python/main.py +++ b/internal/orchestrator/app/generator/testdata/app-all.golden/python/main.py @@ -1,6 +1,15 @@ -def main(): - print("Hello World!") +import time +from arduino.app_utils import App -if __name__ == "__main__": - main() +print("Hello world!") + + +def loop(): + """This function is called repeatedly by the App framework.""" + # You can replace this with any code you want your App to run repeatedly. + time.sleep(10) + + +# See: https://docs.arduino.cc/software/app-lab/tutorials/getting-started/#app-run +App.run(user_loop=loop) diff --git a/internal/orchestrator/app/generator/testdata/app-all.golden/sketch/sketch.ino b/internal/orchestrator/app/generator/testdata/app-all.golden/sketch/sketch.ino index 612c51b8..95c2b6eb 100644 --- a/internal/orchestrator/app/generator/testdata/app-all.golden/sketch/sketch.ino +++ b/internal/orchestrator/app/generator/testdata/app-all.golden/sketch/sketch.ino @@ -1,3 +1,9 @@ -void setup() {} +void setup() { + // put your setup code here, to run once: -void loop() {} \ No newline at end of file +} + +void loop() { + // put your main code here, to run repeatedly: + +} diff --git a/internal/orchestrator/app/generator/testdata/app-no-python.golden/README.md b/internal/orchestrator/app/generator/testdata/app-no-python.golden/README.md deleted file mode 100644 index d1bf5cce..00000000 --- a/internal/orchestrator/app/generator/testdata/app-no-python.golden/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# 🚀 test app all - -### Description - -test description. - -Available application ports: 8080, 9000, 90 diff --git a/internal/orchestrator/app/generator/testdata/app-no-python.golden/app.yaml b/internal/orchestrator/app/generator/testdata/app-no-python.golden/app.yaml deleted file mode 100644 index 7d1f9868..00000000 --- a/internal/orchestrator/app/generator/testdata/app-no-python.golden/app.yaml +++ /dev/null @@ -1,18 +0,0 @@ -# app.yaml: The main configuration file for your Arduino App. -# This file describes the application's metadata and properties. - -# The user-visible name of the application. -name: test app all - -# A brief description of what the application does. -description: "test description." - -# The icon for the application, can be an emoji or a short string. -icon: 🚀 - -# A list of network ports that the application exposes. -# Example: [80, 443] -ports: [8080, 9000, 90] - -# A list of bricks used by this application. -bricks: [] diff --git a/internal/orchestrator/app/generator/testdata/app-no-python.golden/sketch/sketch.ino b/internal/orchestrator/app/generator/testdata/app-no-python.golden/sketch/sketch.ino deleted file mode 100644 index 612c51b8..00000000 --- a/internal/orchestrator/app/generator/testdata/app-no-python.golden/sketch/sketch.ino +++ /dev/null @@ -1,3 +0,0 @@ -void setup() {} - -void loop() {} \ No newline at end of file diff --git a/internal/orchestrator/app/generator/testdata/app-no-python.golden/sketch/sketch.yaml b/internal/orchestrator/app/generator/testdata/app-no-python.golden/sketch/sketch.yaml deleted file mode 100644 index d9fe917e..00000000 --- a/internal/orchestrator/app/generator/testdata/app-no-python.golden/sketch/sketch.yaml +++ /dev/null @@ -1,11 +0,0 @@ -profiles: - default: - fqbn: arduino:zephyr:unoq - platforms: - - platform: arduino:zephyr - libraries: - - MsgPack (0.4.2) - - DebugLog (0.8.4) - - ArxContainer (0.7.0) - - ArxTypeTraits (0.3.1) -default_profile: default diff --git a/internal/orchestrator/app/generator/testdata/app-no-sketch.golden/.gitignore b/internal/orchestrator/app/generator/testdata/app-no-sketch.golden/.gitignore new file mode 100644 index 00000000..90ae0403 --- /dev/null +++ b/internal/orchestrator/app/generator/testdata/app-no-sketch.golden/.gitignore @@ -0,0 +1,2 @@ +# ignore app cache folder +.cache/ diff --git a/internal/orchestrator/app/generator/testdata/app-no-sketch.golden/python/main.py b/internal/orchestrator/app/generator/testdata/app-no-sketch.golden/python/main.py index 9ef98b13..fb56fb23 100644 --- a/internal/orchestrator/app/generator/testdata/app-no-sketch.golden/python/main.py +++ b/internal/orchestrator/app/generator/testdata/app-no-sketch.golden/python/main.py @@ -1,6 +1,15 @@ -def main(): - print("Hello World!") +import time +from arduino.app_utils import App -if __name__ == "__main__": - main() +print("Hello world!") + + +def loop(): + """This function is called repeatedly by the App framework.""" + # You can replace this with any code you want your App to run repeatedly. + time.sleep(10) + + +# See: https://docs.arduino.cc/software/app-lab/tutorials/getting-started/#app-run +App.run(user_loop=loop) diff --git a/internal/orchestrator/app/parser_test.go b/internal/orchestrator/app/parser_test.go index 123d38f4..fe8c8f59 100644 --- a/internal/orchestrator/app/parser_test.go +++ b/internal/orchestrator/app/parser_test.go @@ -115,7 +115,7 @@ bricks: err = os.WriteFile(appYaml.String(), []byte(appDescriptor), 0600) require.NoError(t, err) - app, err := Load(tempDir) + app, err := Load(paths.New(tempDir)) require.NoError(t, err) require.Equal(t, "Test App", app.Name) require.Equal(t, 1, len(app.Descriptor.Bricks)) diff --git a/internal/orchestrator/app/testdata/MissingSketch/app.yaml b/internal/orchestrator/app/testdata/MissingSketch/app.yaml new file mode 100644 index 00000000..adabfa89 --- /dev/null +++ b/internal/orchestrator/app/testdata/MissingSketch/app.yaml @@ -0,0 +1,2 @@ +name: "An app with only python" +description: "An app with only python" diff --git a/internal/orchestrator/app/testdata/MissingSketch/python/main.py b/internal/orchestrator/app/testdata/MissingSketch/python/main.py new file mode 100644 index 00000000..f353b145 --- /dev/null +++ b/internal/orchestrator/app/testdata/MissingSketch/python/main.py @@ -0,0 +1,2 @@ + +print("Hello world!") \ No newline at end of file diff --git a/internal/orchestrator/app/validator.go b/internal/orchestrator/app/validator.go new file mode 100644 index 00000000..fde50548 --- /dev/null +++ b/internal/orchestrator/app/validator.go @@ -0,0 +1,45 @@ +package app + +import ( + "errors" + "fmt" + "log/slog" + + "github.com/arduino/arduino-app-cli/internal/orchestrator/bricksindex" +) + +// ValidateBricks checks that all bricks referenced in the given AppDescriptor exist in the provided BricksIndex, +// It collects and returns all validation errors as a single joined error, allowing the caller to see all issues at once rather than stopping at the first error. +func ValidateBricks(a AppDescriptor, index *bricksindex.BricksIndex) error { + if index == nil { + return fmt.Errorf("bricks index cannot be nil") + } + + var allErrors error + + for _, appBrick := range a.Bricks { + indexBrick, found := index.FindBrickByID(appBrick.ID) + if !found { + allErrors = errors.Join(allErrors, fmt.Errorf("brick %q not found", appBrick.ID)) + continue // Skip further validation for this brick since it doesn't exist + } + + for appBrickVariableName := range appBrick.Variables { + _, exist := indexBrick.GetVariable(appBrickVariableName) + if !exist { + // TODO: we should return warnings + slog.Warn("[skip] variable does not exist into the brick definition", "variable", appBrickVariableName, "brick", indexBrick.ID) + } + } + + // Check that all required brick variables are provided by app + for _, indexBrickVariable := range indexBrick.Variables { + if indexBrickVariable.IsRequired() { + if _, exist := appBrick.Variables[indexBrickVariable.Name]; !exist { + allErrors = errors.Join(allErrors, fmt.Errorf("variable %q is required by brick %q", indexBrickVariable.Name, indexBrick.ID)) + } + } + } + } + return allErrors +} diff --git a/internal/orchestrator/app/validator_test.go b/internal/orchestrator/app/validator_test.go new file mode 100644 index 00000000..13e3e9d3 --- /dev/null +++ b/internal/orchestrator/app/validator_test.go @@ -0,0 +1,163 @@ +package app + +import ( + "errors" + "os" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/arduino/go-paths-helper" + + "github.com/arduino/arduino-app-cli/internal/orchestrator/bricksindex" +) + +func TestValidateAppDescriptorBricks(t *testing.T) { + bricksIndex := &bricksindex.BricksIndex{ + Bricks: []bricksindex.Brick{ + { + ID: "arduino:arduino_cloud", + Name: "Arduino Cloud", + Description: "Connects to Arduino Cloud", + Variables: []bricksindex.BrickVariable{ + { + Name: "ARDUINO_DEVICE_ID", + Description: "Arduino Cloud Device ID", + DefaultValue: "", // Required (no default value) + }, + { + Name: "ARDUINO_SECRET", + Description: "Arduino Cloud Secret", + DefaultValue: "", // Required (no default value) + }, + }, + }, + }, + } + + testCases := []struct { + name string + yamlContent string + expectedError error + }{ + { + name: "valid with all required filled", + yamlContent: ` +name: App ok +description: App ok +bricks: + - arduino:arduino_cloud: + variables: + ARDUINO_DEVICE_ID: "my-device-id" + ARDUINO_SECRET: "my-secret" +`, + expectedError: nil, + }, + { + name: "valid with missing bricks", + yamlContent: ` +name: App with no bricks +description: App with no bricks description +`, + expectedError: nil, + }, + { + name: "valid with empty list of bricks", + yamlContent: ` +name: App with empty bricks +description: App with empty bricks + +bricks: [] +`, + expectedError: nil, + }, + { + name: "valid if required variable is empty string", + yamlContent: ` +name: App with an empty variable +description: App with an empty variable +bricks: + - arduino:arduino_cloud: + variables: + ARDUINO_DEVICE_ID: "my-device-id" + ARDUINO_SECRET: +`, + expectedError: nil, + }, + { + name: "invalid if required variable is omitted", + yamlContent: ` +name: App with no required variables +description: App with no required variables +bricks: + - arduino:arduino_cloud +`, + expectedError: errors.Join( + errors.New("variable \"ARDUINO_DEVICE_ID\" is required by brick \"arduino:arduino_cloud\""), + errors.New("variable \"ARDUINO_SECRET\" is required by brick \"arduino:arduino_cloud\""), + ), + }, + { + name: "invalid if a required variable among two is omitted", + yamlContent: ` +name: App only one required variable filled +description: App only one required variable filled +bricks: + - arduino:arduino_cloud: + variables: + ARDUINO_DEVICE_ID: "my-device-id" +`, + expectedError: errors.New("variable \"ARDUINO_SECRET\" is required by brick \"arduino:arduino_cloud\""), + }, + { + name: "invalid if brick id not found", + yamlContent: ` +name: App no existing brick +description: App no existing brick +bricks: + - arduino:not_existing_brick: + variables: + ARDUINO_DEVICE_ID: "my-device-id" + ARDUINO_SECRET: "LAKDJ" +`, + expectedError: errors.New("brick \"arduino:not_existing_brick\" not found"), + }, + { + name: "log a warning if variable does not exist in the brick", + yamlContent: ` +name: App with non existing variable +description: App with non existing variable +bricks: + - arduino:arduino_cloud: + variables: + NOT_EXISTING_VARIABLE: "this-is-a-not-existing-variable-for-the-brick" + ARDUINO_DEVICE_ID: "my-device-id" + ARDUINO_SECRET: "my-secret" +`, + expectedError: nil, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + tempDir := t.TempDir() + err := paths.New(tempDir).MkdirAll() + require.NoError(t, err) + appYaml := paths.New(tempDir, "app.yaml") + err = os.WriteFile(appYaml.String(), []byte(tc.yamlContent), 0600) + require.NoError(t, err) + + appDescriptor, err := ParseDescriptorFile(appYaml) + require.NoError(t, err) + + err = ValidateBricks(appDescriptor, bricksIndex) + if tc.expectedError == nil { + assert.NoError(t, err, "Expected no validation errors") + } else { + require.Error(t, err, "Expected validation error") + assert.Equal(t, tc.expectedError.Error(), err.Error(), "Error message should match") + } + }) + } +} diff --git a/internal/orchestrator/app_status.go b/internal/orchestrator/app_status.go index 481e240f..7e9c32fc 100644 --- a/internal/orchestrator/app_status.go +++ b/internal/orchestrator/app_status.go @@ -97,7 +97,7 @@ func parseDockerStatusEvent(ctx context.Context, cfg config.Configuration, docke } // FIXME: create an helper function to transform an app.ArduinoApp into an ortchestrator.AppInfo - app, err := app.Load(appStatus.AppPath.String()) + app, err := app.Load(appStatus.AppPath) if err != nil { slog.Warn("error loading app", "appPath", appStatus.AppPath.String(), "error", err) return AppInfo{}, err diff --git a/internal/orchestrator/bricks/bricks.go b/internal/orchestrator/bricks/bricks.go index e8dea9da..b9e0da7d 100644 --- a/internal/orchestrator/bricks/bricks.go +++ b/internal/orchestrator/bricks/bricks.go @@ -58,36 +58,35 @@ func (s *Service) List() (BrickListResult, error) { res := BrickListResult{Bricks: make([]BrickListItem, len(s.bricksIndex.Bricks))} for i, brick := range s.bricksIndex.Bricks { res.Bricks[i] = BrickListItem{ - ID: brick.ID, - Name: brick.Name, - Author: "Arduino", // TODO: for now we only support our bricks - Description: brick.Description, - Category: brick.Category, - Status: "installed", - Models: f.Map(s.modelsIndex.GetModelsByBrick(brick.ID), func(m modelsindex.AIModel) string { - return m.ID - }), + ID: brick.ID, + Name: brick.Name, + Author: "Arduino", // TODO: for now we only support our bricks + Description: brick.Description, + Category: brick.Category, + Status: "installed", + RequireModel: brick.RequireModel, } } return res, nil } func (s *Service) AppBrickInstancesList(a *app.ArduinoApp) (AppBrickInstancesResult, error) { - res := AppBrickInstancesResult{BrickInstances: make([]BrickInstance, len(a.Descriptor.Bricks))} + res := AppBrickInstancesResult{BrickInstances: make([]BrickInstanceListItem, len(a.Descriptor.Bricks))} for i, brickInstance := range a.Descriptor.Bricks { brick, found := s.bricksIndex.FindBrickByID(brickInstance.ID) if !found { return AppBrickInstancesResult{}, fmt.Errorf("brick not found with id %s", brickInstance.ID) } - variablesMap, configVariables := getBrickConfigDetails(brick, brickInstance.Variables) + variablesMap, configVariables := getInstanceBrickConfigVariableDetails(brick, brickInstance.Variables) - res.BrickInstances[i] = BrickInstance{ + res.BrickInstances[i] = BrickInstanceListItem{ ID: brick.ID, Name: brick.Name, Author: "Arduino", // TODO: for now we only support our bricks Category: brick.Category, Status: "installed", + RequireModel: brick.RequireModel, ModelID: brickInstance.Model, // TODO: in case is not set by the user, should we return the default model? Variables: variablesMap, // TODO: do we want to show also the default value of not explicitly set variables? ConfigVariables: configVariables, @@ -108,7 +107,7 @@ func (s *Service) AppBrickInstanceDetails(a *app.ArduinoApp, brickID string) (Br return BrickInstance{}, fmt.Errorf("brick %s not added in the app", brickID) } - variables, configVariables := getBrickConfigDetails(brick, a.Descriptor.Bricks[brickIndex].Variables) + variables, configVariables := getInstanceBrickConfigVariableDetails(brick, a.Descriptor.Bricks[brickIndex].Variables) modelID := a.Descriptor.Bricks[brickIndex].Model if modelID == "" { @@ -121,13 +120,21 @@ func (s *Service) AppBrickInstanceDetails(a *app.ArduinoApp, brickID string) (Br Author: "Arduino", // TODO: for now we only support our bricks Category: brick.Category, Status: "installed", // For now every Arduino brick are installed + RequireModel: brick.RequireModel, Variables: variables, ConfigVariables: configVariables, ModelID: modelID, + CompatibleModels: f.Map(s.modelsIndex.GetModelsByBrick(brick.ID), func(m modelsindex.AIModel) AIModel { + return AIModel{ + ID: m.ID, + Name: m.Name, + Description: m.ModuleDescription, + } + }), }, nil } -func getBrickConfigDetails( +func getInstanceBrickConfigVariableDetails( brick *bricksindex.Brick, userVariables map[string]string, ) (map[string]string, []BrickConfigVariable) { variablesMap := make(map[string]string, len(brick.Variables)) @@ -160,15 +167,6 @@ func (s *Service) BricksDetails(id string, idProvider *app.IDProvider, return BrickDetailsResult{}, ErrBrickNotFound } - variables := make(map[string]BrickVariable, len(brick.Variables)) - for _, v := range brick.Variables { - variables[v.Name] = BrickVariable{ - DefaultValue: v.DefaultValue, - Description: v.Description, - Required: v.IsRequired(), - } - } - readme, err := s.staticStore.GetBrickReadmeFromID(brick.ID) if err != nil { return BrickDetailsResult{}, fmt.Errorf("cannot open docs for brick %s: %w", id, err) @@ -194,21 +192,55 @@ func (s *Service) BricksDetails(id string, idProvider *app.IDProvider, return BrickDetailsResult{}, fmt.Errorf("unable to get used by apps: %w", err) } + variables, configVariables := getBrickConfigVariableDetails(brick) + return BrickDetailsResult{ ID: id, Name: brick.Name, Author: "Arduino", // TODO: for now we only support our bricks Description: brick.Description, Category: brick.Category, + RequireModel: brick.RequireModel, Status: "installed", // For now every Arduino brick are installed Variables: variables, Readme: readme, ApiDocsPath: apiDocsPath, CodeExamples: codeExamples, UsedByApps: usedByApps, + CompatibleModels: f.Map(s.modelsIndex.GetModelsByBrick(brick.ID), func(m modelsindex.AIModel) AIModel { + return AIModel{ + ID: m.ID, + Name: m.Name, + Description: m.ModuleDescription, + } + }), + ConfigVariables: configVariables, }, nil } +func getBrickConfigVariableDetails( + brick *bricksindex.Brick) (map[string]BrickVariable, []BrickConfigVariable) { + variablesMap := make(map[string]BrickVariable, len(brick.Variables)) + variableDetails := make([]BrickConfigVariable, 0, len(brick.Variables)) + + for _, v := range brick.Variables { + variablesMap[v.Name] = BrickVariable{ + DefaultValue: v.DefaultValue, + Description: v.Description, + Required: v.IsRequired(), + } + + variableDetails = append(variableDetails, BrickConfigVariable{ + Name: v.Name, + Value: v.DefaultValue, + Description: v.Description, + Required: v.IsRequired(), + }) + } + + return variablesMap, variableDetails +} + func getUsedByApps( cfg config.Configuration, brickId string, idProvider *app.IDProvider) ([]AppReference, error) { var ( @@ -237,7 +269,7 @@ func getUsedByApps( } for _, file := range appPaths { - app, err := app.Load(file.String()) + app, err := app.Load(file) if err != nil { // we are not considering the broken apps slog.Warn("unable to parse app.yaml, skipping", "path", file.String(), "error", err.Error()) @@ -282,15 +314,15 @@ func (s *Service) BrickCreate( if !exist { return fmt.Errorf("variable %q does not exist on brick %q", name, brick.ID) } - if value.DefaultValue == "" && reqValue == "" { - return fmt.Errorf("variable %q cannot be empty", name) + if value.IsRequired() && reqValue == "" { + return fmt.Errorf("required variable %q cannot be empty", name) } } for _, brickVar := range brick.Variables { - if brickVar.DefaultValue == "" { + if brickVar.IsRequired() { if _, exist := req.Variables[brickVar.Name]; !exist { - return fmt.Errorf("required variable %q is mandatory", brickVar.Name) + slog.Warn("[Skip] a required variable is not set by user", "variable", brickVar.Name, "brick", brickVar.Name) } } } @@ -335,16 +367,21 @@ func (s *Service) BrickUpdate( req BrickCreateUpdateRequest, appCurrent app.ArduinoApp, ) error { - index := slices.IndexFunc(appCurrent.Descriptor.Bricks, func(b app.Brick) bool { return b.ID == req.ID }) - if index == -1 { - return fmt.Errorf("brick not found with id %s", req.ID) + brickFromIndex, present := s.bricksIndex.FindBrickByID(req.ID) + if !present { + return fmt.Errorf("brick %q not found into the brick index", req.ID) + } + + brickPosition := slices.IndexFunc(appCurrent.Descriptor.Bricks, func(b app.Brick) bool { return b.ID == req.ID }) + if brickPosition == -1 { + return fmt.Errorf("brick %q not found into the bricks of the app", req.ID) } - brickID := appCurrent.Descriptor.Bricks[index].ID - brickVariables := appCurrent.Descriptor.Bricks[index].Variables + + brickVariables := appCurrent.Descriptor.Bricks[brickPosition].Variables if len(brickVariables) == 0 { brickVariables = make(map[string]string) } - brickModel := appCurrent.Descriptor.Bricks[index].Model + brickModel := appCurrent.Descriptor.Bricks[brickPosition].Model if req.Model != nil && *req.Model != brickModel { models := s.modelsIndex.GetModelsByBrick(req.ID) @@ -354,17 +391,14 @@ func (s *Service) BrickUpdate( } brickModel = *req.Model } - brick, present := s.bricksIndex.FindBrickByID(brickID) - if !present { - return fmt.Errorf("brick not found with id %s", brickID) - } + for name, updateValue := range req.Variables { - value, exist := brick.GetVariable(name) + value, exist := brickFromIndex.GetVariable(name) if !exist { - return errors.New("variable does not exist") + return fmt.Errorf("variable %q does not exist on brick %q", name, brickFromIndex.ID) } - if value.DefaultValue == "" && updateValue == "" { - return errors.New("variable default value cannot be empty") + if value.IsRequired() && updateValue == "" { + return fmt.Errorf("required variable %q cannot be empty", name) } updated := false for _, v := range brickVariables { @@ -374,14 +408,13 @@ func (s *Service) BrickUpdate( break } } - if !updated { brickVariables[name] = updateValue } } - appCurrent.Descriptor.Bricks[index].Model = brickModel - appCurrent.Descriptor.Bricks[index].Variables = brickVariables + appCurrent.Descriptor.Bricks[brickPosition].Model = brickModel + appCurrent.Descriptor.Bricks[brickPosition].Variables = brickVariables err := appCurrent.Save() if err != nil { diff --git a/internal/orchestrator/bricks/bricks_test.go b/internal/orchestrator/bricks/bricks_test.go index 2f03d96b..ef51fad6 100644 --- a/internal/orchestrator/bricks/bricks_test.go +++ b/internal/orchestrator/bricks/bricks_test.go @@ -16,6 +16,8 @@ package bricks import ( + "os" + "path/filepath" "testing" "github.com/arduino/go-paths-helper" @@ -24,15 +26,18 @@ import ( "github.com/arduino/arduino-app-cli/internal/orchestrator/app" "github.com/arduino/arduino-app-cli/internal/orchestrator/bricksindex" + "github.com/arduino/arduino-app-cli/internal/orchestrator/config" + "github.com/arduino/arduino-app-cli/internal/orchestrator/modelsindex" + "github.com/arduino/arduino-app-cli/internal/store" ) func TestBrickCreate(t *testing.T) { - bricksIndex, err := bricksindex.GenerateBricksIndexFromFile(paths.New("testdata")) + bricksIndex, err := bricksindex.Load(paths.New("testdata")) require.Nil(t, err) brickService := NewService(nil, bricksIndex, nil) t.Run("fails if brick id does not exist", func(t *testing.T) { - err = brickService.BrickCreate(BrickCreateUpdateRequest{ID: "not-existing-id"}, f.Must(app.Load("testdata/dummy-app"))) + err = brickService.BrickCreate(BrickCreateUpdateRequest{ID: "not-existing-id"}, f.Must(app.Load(paths.New("testdata/dummy-app")))) require.Error(t, err) require.Equal(t, "brick \"not-existing-id\" not found", err.Error()) }) @@ -41,7 +46,7 @@ func TestBrickCreate(t *testing.T) { req := BrickCreateUpdateRequest{ID: "arduino:arduino_cloud", Variables: map[string]string{ "NON_EXISTING_VARIABLE": "some-value", }} - err = brickService.BrickCreate(req, f.Must(app.Load("testdata/dummy-app"))) + err = brickService.BrickCreate(req, f.Must(app.Load(paths.New("testdata/dummy-app")))) require.Error(t, err) require.Equal(t, "variable \"NON_EXISTING_VARIABLE\" does not exist on brick \"arduino:arduino_cloud\"", err.Error()) }) @@ -51,18 +56,29 @@ func TestBrickCreate(t *testing.T) { "ARDUINO_DEVICE_ID": "", "ARDUINO_SECRET": "a-secret-a", }} - err = brickService.BrickCreate(req, f.Must(app.Load("testdata/dummy-app"))) + err = brickService.BrickCreate(req, f.Must(app.Load(paths.New("testdata/dummy-app")))) require.Error(t, err) - require.Equal(t, "variable \"ARDUINO_DEVICE_ID\" cannot be empty", err.Error()) + require.Equal(t, "required variable \"ARDUINO_DEVICE_ID\" cannot be empty", err.Error()) }) - t.Run("fails if a mandatory variable is not present in the request", func(t *testing.T) { + t.Run("do not fail if a mandatory variable is not present", func(t *testing.T) { + tempDummyApp := paths.New("testdata/dummy-app.temp") + err := tempDummyApp.RemoveAll() + require.Nil(t, err) + require.Nil(t, paths.New("testdata/dummy-app").CopyDirTo(tempDummyApp)) + req := BrickCreateUpdateRequest{ID: "arduino:arduino_cloud", Variables: map[string]string{ "ARDUINO_SECRET": "a-secret-a", }} - err = brickService.BrickCreate(req, f.Must(app.Load("testdata/dummy-app"))) - require.Error(t, err) - require.Equal(t, "required variable \"ARDUINO_DEVICE_ID\" is mandatory", err.Error()) + err = brickService.BrickCreate(req, f.Must(app.Load(tempDummyApp))) + require.NoError(t, err) + + after, err := app.Load(tempDummyApp) + require.Nil(t, err) + require.Len(t, after.Descriptor.Bricks, 1) + require.Equal(t, "arduino:arduino_cloud", after.Descriptor.Bricks[0].ID) + require.Equal(t, "", after.Descriptor.Bricks[0].Variables["ARDUINO_DEVICE_ID"]) + require.Equal(t, "a-secret-a", after.Descriptor.Bricks[0].Variables["ARDUINO_SECRET"]) }) t.Run("the brick is added if it does not exist in the app", func(t *testing.T) { @@ -72,20 +88,21 @@ func TestBrickCreate(t *testing.T) { require.Nil(t, paths.New("testdata/dummy-app").CopyDirTo(tempDummyApp)) req := BrickCreateUpdateRequest{ID: "arduino:dbstorage_sqlstore"} - err = brickService.BrickCreate(req, f.Must(app.Load(tempDummyApp.String()))) + err = brickService.BrickCreate(req, f.Must(app.Load(tempDummyApp))) require.Nil(t, err) - after, err := app.Load(tempDummyApp.String()) + after, err := app.Load(tempDummyApp) require.Nil(t, err) require.Len(t, after.Descriptor.Bricks, 2) require.Equal(t, "arduino:dbstorage_sqlstore", after.Descriptor.Bricks[1].ID) }) + t.Run("the variables of a brick are updated", func(t *testing.T) { tempDummyApp := paths.New("testdata/dummy-app.brick-override.temp") err := tempDummyApp.RemoveAll() require.Nil(t, err) err = paths.New("testdata/dummy-app").CopyDirTo(tempDummyApp) require.Nil(t, err) - bricksIndex, err := bricksindex.GenerateBricksIndexFromFile(paths.New("testdata")) + bricksIndex, err := bricksindex.Load(paths.New("testdata")) require.Nil(t, err) brickService := NewService(nil, bricksIndex, nil) @@ -99,10 +116,10 @@ func TestBrickCreate(t *testing.T) { }, } - err = brickService.BrickCreate(req, f.Must(app.Load(tempDummyApp.String()))) + err = brickService.BrickCreate(req, f.Must(app.Load(tempDummyApp))) require.Nil(t, err) - after, err := app.Load(tempDummyApp.String()) + after, err := app.Load(tempDummyApp) require.Nil(t, err) require.Len(t, after.Descriptor.Bricks, 1) require.Equal(t, "arduino:arduino_cloud", after.Descriptor.Bricks[0].ID) @@ -111,6 +128,122 @@ func TestBrickCreate(t *testing.T) { }) } +func TestUpdateBrick(t *testing.T) { + bricksIndex, err := bricksindex.Load(paths.New("testdata")) + require.Nil(t, err) + brickService := NewService(nil, bricksIndex, nil) + + t.Run("fails if brick id does not exist into brick index", func(t *testing.T) { + err = brickService.BrickUpdate(BrickCreateUpdateRequest{ID: "not-existing-id"}, f.Must(app.Load(paths.New("testdata/dummy-app")))) + require.Error(t, err) + require.Equal(t, "brick \"not-existing-id\" not found into the brick index", err.Error()) + }) + + t.Run("fails if brick is present into the index but not in the app ", func(t *testing.T) { + err = brickService.BrickUpdate(BrickCreateUpdateRequest{ID: "arduino:dbstorage_sqlstore"}, f.Must(app.Load(paths.New("testdata/dummy-app")))) + require.Error(t, err) + require.Equal(t, "brick \"arduino:dbstorage_sqlstore\" not found into the bricks of the app", err.Error()) + }) + + t.Run("fails if the updated variable is not present in the brick definition", func(t *testing.T) { + req := BrickCreateUpdateRequest{ID: "arduino:arduino_cloud", Variables: map[string]string{ + "NON_EXISTING_VARIABLE": "some-value", + }} + err = brickService.BrickUpdate(req, f.Must(app.Load(paths.New("testdata/dummy-app")))) + require.Error(t, err) + require.Equal(t, "variable \"NON_EXISTING_VARIABLE\" does not exist on brick \"arduino:arduino_cloud\"", err.Error()) + }) + + // TODO: allow to set an empty "" variable + t.Run("fails if a required variable is set empty", func(t *testing.T) { + req := BrickCreateUpdateRequest{ID: "arduino:arduino_cloud", Variables: map[string]string{ + "ARDUINO_DEVICE_ID": "", + "ARDUINO_SECRET": "a-secret-a", + }} + err = brickService.BrickUpdate(req, f.Must(app.Load(paths.New("testdata/dummy-app")))) + require.Error(t, err) + require.Equal(t, "required variable \"ARDUINO_DEVICE_ID\" cannot be empty", err.Error()) + }) + + t.Run("allow updating only one mandatory variable among two", func(t *testing.T) { + tempDummyApp := paths.New("testdata/dummy-app.temp") + err := tempDummyApp.RemoveAll() + require.Nil(t, err) + require.Nil(t, paths.New("testdata/dummy-app").CopyDirTo(tempDummyApp)) + + req := BrickCreateUpdateRequest{ID: "arduino:arduino_cloud", Variables: map[string]string{ + "ARDUINO_SECRET": "a-secret-a", + }} + err = brickService.BrickUpdate(req, f.Must(app.Load(tempDummyApp))) + require.NoError(t, err) + + after, err := app.Load(tempDummyApp) + require.Nil(t, err) + require.Len(t, after.Descriptor.Bricks, 1) + require.Equal(t, "arduino:arduino_cloud", after.Descriptor.Bricks[0].ID) + require.Equal(t, "", after.Descriptor.Bricks[0].Variables["ARDUINO_DEVICE_ID"]) + require.Equal(t, "a-secret-a", after.Descriptor.Bricks[0].Variables["ARDUINO_SECRET"]) + }) + + t.Run("update a single variables of a brick correctly", func(t *testing.T) { + tempDummyApp := paths.New("testdata/dummy-app.temp") + require.Nil(t, tempDummyApp.RemoveAll()) + require.Nil(t, paths.New("testdata/dummy-app").CopyDirTo(tempDummyApp)) + bricksIndex, err := bricksindex.Load(paths.New("testdata")) + require.Nil(t, err) + brickService := NewService(nil, bricksIndex, nil) + + deviceID := "updated-device-id" + secret := "updated-secret" + req := BrickCreateUpdateRequest{ + ID: "arduino:arduino_cloud", + Variables: map[string]string{ + "ARDUINO_DEVICE_ID": deviceID, + "ARDUINO_SECRET": secret, + }, + } + + err = brickService.BrickUpdate(req, f.Must(app.Load(tempDummyApp))) + require.Nil(t, err) + + after, err := app.Load(tempDummyApp) + require.Nil(t, err) + require.Len(t, after.Descriptor.Bricks, 1) + require.Equal(t, "arduino:arduino_cloud", after.Descriptor.Bricks[0].ID) + require.Equal(t, deviceID, after.Descriptor.Bricks[0].Variables["ARDUINO_DEVICE_ID"]) + require.Equal(t, secret, after.Descriptor.Bricks[0].Variables["ARDUINO_SECRET"]) + }) + + t.Run("update a single variable correctly", func(t *testing.T) { + tempDummyApp := paths.New("testdata/dummy-app-for-update.temp") + require.Nil(t, tempDummyApp.RemoveAll()) + require.Nil(t, paths.New("testdata/dummy-app-for-update").CopyDirTo(tempDummyApp)) + bricksIndex, err := bricksindex.Load(paths.New("testdata")) + require.Nil(t, err) + brickService := NewService(nil, bricksIndex, nil) + + secret := "updated-the-secret" + req := BrickCreateUpdateRequest{ + ID: "arduino:arduino_cloud", + Variables: map[string]string{ + // the ARDUINO_DEVICE_ID is already configured int the app.yaml + "ARDUINO_SECRET": secret, + }, + } + + err = brickService.BrickUpdate(req, f.Must(app.Load(tempDummyApp))) + require.Nil(t, err) + + after, err := app.Load(tempDummyApp) + require.Nil(t, err) + require.Len(t, after.Descriptor.Bricks, 1) + require.Equal(t, "arduino:arduino_cloud", after.Descriptor.Bricks[0].ID) + require.Equal(t, "i-am-a-device-id", after.Descriptor.Bricks[0].Variables["ARDUINO_DEVICE_ID"]) + require.Equal(t, secret, after.Descriptor.Bricks[0].Variables["ARDUINO_SECRET"]) + }) + +} + func TestGetBrickInstanceVariableDetails(t *testing.T) { tests := []struct { name string @@ -184,9 +317,538 @@ func TestGetBrickInstanceVariableDetails(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - actualVariableMap, actualConfigVariables := getBrickConfigDetails(tt.brick, tt.userVariables) + actualVariableMap, actualConfigVariables := getInstanceBrickConfigVariableDetails(tt.brick, tt.userVariables) require.Equal(t, tt.expectedVariableMap, actualVariableMap) require.Equal(t, tt.expectedConfigVariables, actualConfigVariables) }) } } + +func TestBricksDetails(t *testing.T) { + tmpDir := t.TempDir() + appsDir := filepath.Join(tmpDir, "ArduinoApps") + dataDir := filepath.Join(tmpDir, "Data") + assetsDir := filepath.Join(dataDir, "assets") + + require.NoError(t, os.MkdirAll(appsDir, 0755)) + require.NoError(t, os.MkdirAll(assetsDir, 0755)) + + t.Setenv("ARDUINO_APP_CLI__APPS_DIR", appsDir) + t.Setenv("ARDUINO_APP_CLI__DATA_DIR", dataDir) + + cfg, err := config.NewFromEnv() + require.NoError(t, err) + + for _, brick := range []string{"object_detection", "weather_forecast", "one_model_brick"} { + createFakeBrickAssets(t, assetsDir, brick) + } + createFakeApp(t, appsDir) + + bIndex := &bricksindex.BricksIndex{ + Bricks: []bricksindex.Brick{ + { + ID: "arduino:object_detection", + Name: "Object Detection", + Category: "video", + ModelName: "yolox-object-detection", // Default model + Variables: []bricksindex.BrickVariable{ + {Name: "EI_OBJ_DETECTION_MODEL", DefaultValue: "default_path", Description: "path to the model file"}, + {Name: "CUSTOM_MODEL_PATH", DefaultValue: "/home/arduino/.arduino-bricks/ei-models", Description: "path to the custom model directory"}, + }, + }, + { + ID: "arduino:weather_forecast", + Name: "Weather Forecast", + Category: "miscellaneous", + ModelName: "", + }, + { + ID: "arduino:one_model_brick", + Name: "one model brick", + Category: "video", + ModelName: "face-detection", // Default model + Variables: []bricksindex.BrickVariable{}, + }, + }, + } + mIndex := &modelsindex.ModelsIndex{ + Models: []modelsindex.AIModel{ + + { + ID: "yolox-object-detection", + Name: "General purpose object detection - YoloX", + ModuleDescription: "General purpose object detection...", + Bricks: []string{"arduino:object_detection", "arduino:video_object_detection"}, + }, + { + ID: "face-detection", + Name: "Lightweight-Face-Detection", + Bricks: []string{"arduino:object_detection", "arduino:video_object_detection", "arduino:one_model_brick"}, + }, + }} + + svc := &Service{ + bricksIndex: bIndex, + modelsIndex: mIndex, + staticStore: store.NewStaticStore(assetsDir), + } + idProvider := app.NewAppIDProvider(cfg) + + t.Run("Brick Not Found", func(t *testing.T) { + res, err := svc.BricksDetails("arduino:non_existing", idProvider, cfg) + require.Error(t, err) + require.Equal(t, ErrBrickNotFound, err) + require.Empty(t, res.ID) + }) + + t.Run("Success - Full Details - multiple models", func(t *testing.T) { + expectConfigVariables := []BrickConfigVariable{ + { + Name: "EI_OBJ_DETECTION_MODEL", + Value: "default_path", + Description: "path to the model file", + Required: false, + }, + { + Name: "CUSTOM_MODEL_PATH", + Value: "/home/arduino/.arduino-bricks/ei-models", + Description: "path to the custom model directory", + Required: false, + }, + } + + res, err := svc.BricksDetails("arduino:object_detection", idProvider, cfg) + require.NoError(t, err) + + require.Equal(t, "arduino:object_detection", res.ID) + require.Equal(t, "Object Detection", res.Name) + require.Equal(t, "Arduino", res.Author) + require.Equal(t, "installed", res.Status) + require.Contains(t, res.Variables, "EI_OBJ_DETECTION_MODEL") + require.Equal(t, "default_path", res.Variables["EI_OBJ_DETECTION_MODEL"].DefaultValue) + require.Equal(t, "# Documentation", res.Readme) + require.Contains(t, res.ApiDocsPath, filepath.Join("arduino", "app_bricks", "object_detection", "API.md")) + require.Len(t, res.CodeExamples, 1) + require.Contains(t, res.CodeExamples[0].Path, "blink.ino") + require.Len(t, res.UsedByApps, 1) + require.Equal(t, "My App", res.UsedByApps[0].Name) + require.NotEmpty(t, res.UsedByApps[0].ID) + require.Len(t, res.CompatibleModels, 2) + require.Equal(t, "yolox-object-detection", res.CompatibleModels[0].ID) + require.Equal(t, "General purpose object detection - YoloX", res.CompatibleModels[0].Name) + require.Equal(t, "General purpose object detection...", res.CompatibleModels[0].Description) + require.Equal(t, "face-detection", res.CompatibleModels[1].ID) + require.Equal(t, "Lightweight-Face-Detection", res.CompatibleModels[1].Name) + require.Equal(t, "", res.CompatibleModels[1].Description) + require.Len(t, res.ConfigVariables, 2) + require.Equal(t, expectConfigVariables, res.ConfigVariables) + }) + + t.Run("Success - Full Details - no models", func(t *testing.T) { + res, err := svc.BricksDetails("arduino:weather_forecast", idProvider, cfg) + require.NoError(t, err) + + require.Equal(t, "arduino:weather_forecast", res.ID) + require.Equal(t, "Weather Forecast", res.Name) + require.Equal(t, "Arduino", res.Author) + require.Equal(t, "installed", res.Status) + require.Empty(t, res.Variables) + require.Equal(t, "# Documentation", res.Readme) + require.Contains(t, res.ApiDocsPath, filepath.Join("arduino", "app_bricks", "weather_forecast", "API.md")) + require.Len(t, res.CodeExamples, 1) + require.Contains(t, res.CodeExamples[0].Path, "blink.ino") + require.Len(t, res.UsedByApps, 1) + require.Equal(t, "My App", res.UsedByApps[0].Name) + require.NotEmpty(t, res.UsedByApps[0].ID) + require.Len(t, res.CompatibleModels, 0) + require.Empty(t, res.ConfigVariables) + }) + + t.Run("Success - Full Details - one model", func(t *testing.T) { + res, err := svc.BricksDetails("arduino:one_model_brick", idProvider, cfg) + require.NoError(t, err) + + require.Equal(t, "arduino:one_model_brick", res.ID) + require.Equal(t, "one model brick", res.Name) + require.Len(t, res.CompatibleModels, 1) + require.Equal(t, "face-detection", res.CompatibleModels[0].ID) + require.Equal(t, "Lightweight-Face-Detection", res.CompatibleModels[0].Name) + require.Equal(t, "", res.CompatibleModels[0].Description) + require.Empty(t, res.ConfigVariables) + require.Empty(t, res.Variables) + }) +} + +func createFakeBrickAssets(t *testing.T, assetsDir, brick string) { + t.Helper() + + brickDocDir := filepath.Join(assetsDir, "docs", "arduino", brick) + require.NoError(t, os.MkdirAll(brickDocDir, 0755)) + require.NoError(t, os.WriteFile(filepath.Join(brickDocDir, "README.md"), + []byte("# Documentation"), 0600)) + + brickExDir := filepath.Join(assetsDir, "examples", "arduino", brick) + require.NoError(t, os.MkdirAll(brickExDir, 0755)) + require.NoError(t, os.WriteFile(filepath.Join(brickExDir, "blink.ino"), + []byte("void setup() {}"), 0600)) +} + +func createFakeApp(t *testing.T, appsDir string) { + t.Helper() + myAppDir := filepath.Join(appsDir, "MyApp") + require.NoError(t, os.MkdirAll(myAppDir, 0755)) + + appYamlContent := ` +name: My App +bricks: + - arduino:object_detection: + - arduino:weather_forecast: +` + require.NoError(t, os.WriteFile(filepath.Join(myAppDir, "app.yaml"), []byte(appYamlContent), 0600)) + pythonDir := filepath.Join(myAppDir, "python") + require.NoError(t, os.MkdirAll(pythonDir, 0755)) + require.NoError(t, os.WriteFile(filepath.Join(pythonDir, "main.py"), []byte("print('hello')"), 0600)) +} + +func TestAppBrickInstanceModelsDetails(t *testing.T) { + + bIndex := &bricksindex.BricksIndex{ + Bricks: []bricksindex.Brick{ + { + ID: "arduino:object_detection", + Name: "Object Detection", + Category: "video", + ModelName: "yolox-object-detection", // Default model + Variables: []bricksindex.BrickVariable{ + {Name: "EI_OBJ_DETECTION_MODEL", DefaultValue: "default_path", Description: "path to the model file"}, + {Name: "CUSTOM_MODEL_PATH", DefaultValue: "/home/arduino/.arduino-bricks/ei-models", Description: "path to the custom model directory"}, + }, + RequireModel: true, + }, + { + ID: "arduino:weather_forecast", + Name: "Weather Forecast", + Category: "miscellaneous", + ModelName: "", + RequireModel: false, + }, + }, + } + + mIndex := &modelsindex.ModelsIndex{ + Models: []modelsindex.AIModel{ + + { + ID: "yolox-object-detection", + Name: "General purpose object detection - YoloX", + ModuleDescription: "General purpose object detection...", + Bricks: []string{"arduino:object_detection", "arduino:video_object_detection"}, + }, + { + ID: "face-detection", + Name: "Lightweight-Face-Detection", + Bricks: []string{"arduino:object_detection", "arduino:video_object_detection"}, + }, + }} + + svc := &Service{ + bricksIndex: bIndex, + modelsIndex: mIndex, + } + + tests := []struct { + name string + app *app.ArduinoApp + brickID string + expectedError string + validate func(*testing.T, BrickInstance) + }{ + { + name: "Brick not found in global Index", + brickID: "arduino:non_existent_brick", + app: &app.ArduinoApp{ + Descriptor: app.AppDescriptor{Bricks: []app.Brick{}}, + }, + expectedError: "brick not found", + }, + { + name: "Brick found in Index but not added to App", + brickID: "arduino:object_detection", + app: &app.ArduinoApp{ + Descriptor: app.AppDescriptor{ + Bricks: []app.Brick{ + {ID: "arduino:weather_forecast"}, + }, + }, + }, + expectedError: "brick arduino:object_detection not added in the app", + }, + { + name: "Success - Standard Brick without Model", + brickID: "arduino:weather_forecast", + app: &app.ArduinoApp{ + Descriptor: app.AppDescriptor{ + Bricks: []app.Brick{ + {ID: "arduino:weather_forecast"}, + }, + }, + }, + validate: func(t *testing.T, res BrickInstance) { + require.Equal(t, "arduino:weather_forecast", res.ID) + require.Equal(t, "Weather Forecast", res.Name) + require.Equal(t, "installed", res.Status) + require.Empty(t, res.ModelID) + require.Empty(t, res.CompatibleModels) + require.False(t, res.RequireModel) + }, + }, + { + name: "Success - Brick with Default Model", + brickID: "arduino:object_detection", + app: &app.ArduinoApp{ + Descriptor: app.AppDescriptor{ + Bricks: []app.Brick{ + { + ID: "arduino:object_detection", + }, + }, + }, + }, + validate: func(t *testing.T, res BrickInstance) { + require.Equal(t, "arduino:object_detection", res.ID) + require.Equal(t, "yolox-object-detection", res.ModelID) + require.Len(t, res.CompatibleModels, 2) + require.Equal(t, "yolox-object-detection", res.CompatibleModels[0].ID) + require.Equal(t, "face-detection", res.CompatibleModels[1].ID) + require.True(t, res.RequireModel) + }, + }, + { + name: "Success - Brick with Overridden Model in App", + brickID: "arduino:object_detection", + app: &app.ArduinoApp{ + Descriptor: app.AppDescriptor{ + Bricks: []app.Brick{ + { + ID: "arduino:object_detection", + Model: "face-detection", + }, + }, + }, + }, + validate: func(t *testing.T, res BrickInstance) { + require.Equal(t, "arduino:object_detection", res.ID) + require.Equal(t, "face-detection", res.ModelID) + require.Len(t, res.CompatibleModels, 2) + require.Equal(t, "yolox-object-detection", res.CompatibleModels[0].ID) + require.Equal(t, "face-detection", res.CompatibleModels[1].ID) + require.True(t, res.RequireModel) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := svc.AppBrickInstanceDetails(tt.app, tt.brickID) + + if tt.expectedError != "" { + require.Error(t, err) + require.Equal(t, err.Error(), tt.expectedError) + return + } + + require.NoError(t, err) + if tt.validate != nil { + tt.validate(t, result) + } + }) + } +} + +func TestAppBrickInstancesList(t *testing.T) { + + bIndex := &bricksindex.BricksIndex{ + Bricks: []bricksindex.Brick{ + { + ID: "arduino:weather_forecast", + Name: "Weather Forecast", + Category: "miscellaneous", + RequireModel: false, + Variables: []bricksindex.BrickVariable{}, + }, + { + ID: "arduino:object_detection", + Name: "Object Detection", + Category: "video", + ModelName: "yolox-object-detection", + RequireModel: true, + Variables: []bricksindex.BrickVariable{ + {Name: "CUSTOM_MODEL_PATH", DefaultValue: "/home/arduino/.arduino-bricks/ei-models", Description: "path to the custom model directory"}, + {Name: "EI_OBJ_DETECTION_MODEL", DefaultValue: "/models/ootb/ei/yolo-x-nano.eim", Description: "path to the model file"}, + }, + }, + { + ID: "arduino:audio_classification", + Name: "Audio Classification", + Category: "audio", + ModelName: "glass-breaking", + RequireModel: true, + Variables: []bricksindex.BrickVariable{ + {Name: "CUSTOM_MODEL_PATH", DefaultValue: "/home/arduino/.arduino-bricks/ei-models"}, + {Name: "EI_AUDIO_CLASSIFICATION_MODEL", DefaultValue: "/models/ootb/ei/glass-breaking.eim"}, + }, + }, + { + ID: "arduino:streamlit_ui", + Name: "WebUI - Streamlit", + Category: "ui", + RequireModel: false, + Ports: []string{"7000", "8000"}, + }, + }, + } + + svc := &Service{ + bricksIndex: bIndex, + modelsIndex: &modelsindex.ModelsIndex{}, + } + + tests := []struct { + name string + app *app.ArduinoApp + expectedError string + validate func(*testing.T, AppBrickInstancesResult) + }{ + { + name: "Error - Brick not found in Index", + app: &app.ArduinoApp{ + Descriptor: app.AppDescriptor{ + Bricks: []app.Brick{ + {ID: "arduino:non_existent_brick"}, + }, + }, + }, + expectedError: "brick not found with id arduino:non_existent_brick", + }, + { + name: "Success - Empty App", + app: &app.ArduinoApp{ + Descriptor: app.AppDescriptor{ + Bricks: []app.Brick{}, + }, + }, + validate: func(t *testing.T, res AppBrickInstancesResult) { + require.Empty(t, res.BrickInstances) + }, + }, + { + name: "Success - Simple Brick", + app: &app.ArduinoApp{ + Descriptor: app.AppDescriptor{ + Bricks: []app.Brick{ + {ID: "arduino:weather_forecast"}, + }, + }, + }, + validate: func(t *testing.T, res AppBrickInstancesResult) { + require.Len(t, res.BrickInstances, 1) + brick := res.BrickInstances[0] + + require.Equal(t, "arduino:weather_forecast", brick.ID) + require.Equal(t, "Weather Forecast", brick.Name) + require.Equal(t, "miscellaneous", brick.Category) + require.Equal(t, "installed", brick.Status) + require.Equal(t, "Arduino", brick.Author) + require.False(t, brick.RequireModel) + require.Empty(t, brick.ModelID) + }, + }, + { + name: "Success - Brick with Model Configured", + app: &app.ArduinoApp{ + Descriptor: app.AppDescriptor{ + Bricks: []app.Brick{ + { + ID: "arduino:object_detection", + Model: "face-detection", // default model overridden + Variables: map[string]string{ + "CUSTOM_MODEL_PATH": "/custom/path", + }, + }, + }, + }, + }, + validate: func(t *testing.T, res AppBrickInstancesResult) { + require.Len(t, res.BrickInstances, 1) + brick := res.BrickInstances[0] + + require.Equal(t, "arduino:object_detection", brick.ID) + require.Equal(t, "video", brick.Category) + require.True(t, brick.RequireModel) + require.Equal(t, "face-detection", brick.ModelID) + + foundCustom := false + for _, v := range brick.ConfigVariables { + if v.Name == "CUSTOM_MODEL_PATH" { + require.Equal(t, "/custom/path", v.Value) + foundCustom = true + } + } + require.True(t, foundCustom, "Variable CUSTOM_MODEL_PATH should be present and overridden") + }, + }, + { + name: "Success - Multiple Bricks", + app: &app.ArduinoApp{ + Descriptor: app.AppDescriptor{ + Bricks: []app.Brick{ + {ID: "arduino:streamlit_ui"}, + {ID: "arduino:audio_classification", Model: "glass-breaking"}, + }, + }, + }, + validate: func(t *testing.T, res AppBrickInstancesResult) { + require.Len(t, res.BrickInstances, 2) + + // Brick 1: Streamlit UI + b1 := res.BrickInstances[0] + require.Equal(t, "arduino:streamlit_ui", b1.ID) + require.Equal(t, "WebUI - Streamlit", b1.Name) + require.Equal(t, "Arduino", b1.Author) + require.Equal(t, "ui", b1.Category) + require.Equal(t, "installed", b1.Status) + require.Equal(t, "", b1.ModelID) + require.Empty(t, b1.Variables) + require.Empty(t, b1.ConfigVariables) + require.False(t, b1.RequireModel) + + // Brick 2: Audio Classification + b2 := res.BrickInstances[1] + require.Equal(t, "arduino:audio_classification", b2.ID) + require.Equal(t, "audio", b2.Category) + require.True(t, b2.RequireModel) + require.Equal(t, "glass-breaking", b2.ModelID) + require.Equal(t, 2, len(b2.ConfigVariables)) + require.Equal(t, "/home/arduino/.arduino-bricks/ei-models", b2.ConfigVariables[0].Value) + require.Equal(t, "/models/ootb/ei/glass-breaking.eim", b2.ConfigVariables[1].Value) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := svc.AppBrickInstancesList(tt.app) + + if tt.expectedError != "" { + require.Error(t, err) + require.Contains(t, err.Error(), tt.expectedError) + return + } + + require.NoError(t, err) + if tt.validate != nil { + tt.validate(t, result) + } + }) + } +} diff --git a/internal/orchestrator/bricks/testdata/bricks-list.yaml b/internal/orchestrator/bricks/testdata/bricks-list.yaml index 8e3114d6..e38eeeb4 100644 --- a/internal/orchestrator/bricks/testdata/bricks-list.yaml +++ b/internal/orchestrator/bricks/testdata/bricks-list.yaml @@ -4,7 +4,6 @@ bricks: description: Connects to Arduino Cloud require_container: false require_model: false - require_devices: false mount_devices_into_container: false ports: [] category: null @@ -19,7 +18,11 @@ bricks: local database. require_container: false require_model: false - require_devices: false mount_devices_into_container: false ports: [] category: storage +- id: arduino:brick-with-require-model + name: A brick with required model + description: "Brick with required model" + require_model: true + model_name: mobilenet-image-classification \ No newline at end of file diff --git a/internal/orchestrator/bricks/testdata/dummy-app-for-update/app.yaml b/internal/orchestrator/bricks/testdata/dummy-app-for-update/app.yaml new file mode 100644 index 00000000..5b168ed5 --- /dev/null +++ b/internal/orchestrator/bricks/testdata/dummy-app-for-update/app.yaml @@ -0,0 +1,6 @@ +name: An app with only a required variable filled +description: An app with only a required variable filled +bricks: + - arduino:arduino_cloud: + variables: + ARDUINO_DEVICE_ID: "i-am-a-device-id" \ No newline at end of file diff --git a/internal/orchestrator/bricks/testdata/dummy-app-for-update/python/main.py b/internal/orchestrator/bricks/testdata/dummy-app-for-update/python/main.py new file mode 100644 index 00000000..336e825c --- /dev/null +++ b/internal/orchestrator/bricks/testdata/dummy-app-for-update/python/main.py @@ -0,0 +1,2 @@ +def main(): + pass diff --git a/internal/orchestrator/bricks/types.go b/internal/orchestrator/bricks/types.go index 868c563a..e4b1b747 100644 --- a/internal/orchestrator/bricks/types.go +++ b/internal/orchestrator/bricks/types.go @@ -20,20 +20,19 @@ type BrickListResult struct { } type BrickListItem struct { - ID string `json:"id"` - Name string `json:"name"` - Author string `json:"author"` - Description string `json:"description"` - Category string `json:"category"` - Status string `json:"status"` - Models []string `json:"models"` + ID string `json:"id"` + Name string `json:"name"` + Author string `json:"author"` + Description string `json:"description"` + Category string `json:"category"` + Status string `json:"status"` + RequireModel bool `json:"require_model"` } type AppBrickInstancesResult struct { - BrickInstances []BrickInstance `json:"bricks"` + BrickInstances []BrickInstanceListItem `json:"bricks"` } - -type BrickInstance struct { +type BrickInstanceListItem struct { ID string `json:"id"` Name string `json:"name"` Author string `json:"author"` @@ -41,9 +40,27 @@ type BrickInstance struct { Status string `json:"status"` Variables map[string]string `json:"variables,omitempty" description:"Deprecated: use config_variables instead. This field is kept for backward compatibility."` ConfigVariables []BrickConfigVariable `json:"config_variables,omitempty"` + RequireModel bool `json:"require_model"` ModelID string `json:"model,omitempty"` } +type BrickInstance struct { + ID string `json:"id"` + Name string `json:"name"` + Author string `json:"author"` + Category string `json:"category"` + Status string `json:"status"` + Variables map[string]string `json:"variables,omitempty" description:"Deprecated: use config_variables instead. This field is kept for backward compatibility."` + ConfigVariables []BrickConfigVariable `json:"config_variables,omitempty"` + RequireModel bool `json:"require_model"` + ModelID string `json:"model,omitempty"` + CompatibleModels []AIModel `json:"compatible_models"` +} +type AIModel struct { + ID string `json:"id"` + Name string `json:"name"` + Description string `json:"description"` +} type BrickConfigVariable struct { Name string `json:"name"` Value string `json:"value"` @@ -67,15 +84,18 @@ type AppReference struct { } type BrickDetailsResult struct { - ID string `json:"id"` - Name string `json:"name"` - Author string `json:"author"` - Description string `json:"description"` - Category string `json:"category"` - Status string `json:"status"` - Variables map[string]BrickVariable `json:"variables,omitempty"` - Readme string `json:"readme"` - ApiDocsPath string `json:"api_docs_path"` - CodeExamples []CodeExample `json:"code_examples"` - UsedByApps []AppReference `json:"used_by_apps"` + ID string `json:"id"` + Name string `json:"name"` + Author string `json:"author"` + Description string `json:"description"` + Category string `json:"category"` + Status string `json:"status"` + RequireModel bool `json:"require_model"` + Variables map[string]BrickVariable `json:"variables,omitempty" description:"Deprecated: use config_variables instead. This field is kept for backward compatibility."` + Readme string `json:"readme"` + ApiDocsPath string `json:"api_docs_path"` + CodeExamples []CodeExample `json:"code_examples"` + UsedByApps []AppReference `json:"used_by_apps"` + CompatibleModels []AIModel `json:"compatible_models"` + ConfigVariables []BrickConfigVariable `json:"config_variables"` } diff --git a/internal/orchestrator/bricksindex/bricks_index.go b/internal/orchestrator/bricksindex/bricks_index.go index e4b774f4..9e52f1c6 100644 --- a/internal/orchestrator/bricksindex/bricks_index.go +++ b/internal/orchestrator/bricksindex/bricks_index.go @@ -91,7 +91,7 @@ func unmarshalBricksIndex(content io.Reader) (*BricksIndex, error) { return &index, nil } -func GenerateBricksIndexFromFile(dir *paths.Path) (*BricksIndex, error) { +func Load(dir *paths.Path) (*BricksIndex, error) { content, err := dir.Join("bricks-list.yaml").Open() if err != nil { return nil, err diff --git a/internal/orchestrator/bricksindex/bricks_index_test.go b/internal/orchestrator/bricksindex/bricks_index_test.go index 5b2a1546..b8d28c07 100644 --- a/internal/orchestrator/bricksindex/bricks_index_test.go +++ b/internal/orchestrator/bricksindex/bricks_index_test.go @@ -16,171 +16,197 @@ package bricksindex import ( + "os" "testing" - yaml "github.com/goccy/go-yaml" + "github.com/arduino/go-paths-helper" "github.com/stretchr/testify/require" ) -func TestBricksIndex(t *testing.T) { - x := `bricks: -- id: arduino:image_classification - name: Image Classification - description: "Brick for image classification using a pre-trained model. It processes\ - \ images and returns the predicted class label and confidence score.\nBrick is\ - \ designed to work with pre-trained models provided by framework or with custom\ - \ image classification models trained on Edge Impulse platform. \n" - require_container: true - require_model: true - ports: [] - model_name: mobilenet-image-classification - variables: - - name: CUSTOM_MODEL_PATH - default_value: /opt/models/ei/ - description: path to the custom model directory - - name: EI_CLASSIFICATION_MODEL - default_value: /models/ootb/ei/mobilenet-v2-224px.eim - description: path to the model file -- id: arduino:camera_scanner - name: Camera Scanner - description: Scans a camera for barcodes and QR codes - require_container: false - require_model: false - ports: [] -- id: arduino:streamlit_ui - name: Streamlit UI - description: A simplified user interface based on Streamlit and Python. - require_container: false - require_model: false - ports: - - 7000 -- id: arduino:keyword_spotter - name: Keyword Spotter - description: 'Brick for keyword spotting using a pre-trained model. It processes - audio input to detect specific keywords or phrases. +func TestGenerateBricksIndexFromFile(t *testing.T) { + index, err := Load(paths.New("testdata")) + require.NoError(t, err) + + // Check if ports are correctly set + bWebUI, found := index.FindBrickByID("arduino:web_ui") + require.True(t, found) + require.Equal(t, []string{"7000"}, bWebUI.Ports) + + // Check if variables are correctly set + bIC, found := index.FindBrickByID("arduino:image_classification") + require.True(t, found) + require.Equal(t, "Image Classification", bIC.Name) + require.Equal(t, "mobilenet-image-classification", bIC.ModelName) + require.Len(t, bIC.Variables, 2) + require.Equal(t, "CUSTOM_MODEL_PATH", bIC.Variables[0].Name) + require.Equal(t, "/opt/models/ei/", bIC.Variables[0].DefaultValue) + require.Equal(t, "path to the custom model directory", bIC.Variables[0].Description) + require.Equal(t, "EI_CLASSIFICATION_MODEL", bIC.Variables[1].Name) + require.Equal(t, "/models/ootb/ei/mobilenet-v2-224px.eim", bIC.Variables[1].DefaultValue) + require.Equal(t, "path to the model file", bIC.Variables[1].Description) + require.False(t, bIC.Variables[0].IsRequired()) + require.False(t, bIC.Variables[1].IsRequired()) + + bRequireModel, found := index.FindBrickByID("arduino:model_required") + require.True(t, found) + require.True(t, bRequireModel.RequireModel) + + bDb, found := index.FindBrickByID("arduino:dbstorage_tsstore") + require.True(t, found) + require.False(t, bDb.RequireModel) - Brick is designed to work with pre-trained models provided by framework or with - custom audio classification models trained on Edge Impulse platform. + bNoRequireModel, found := index.FindBrickByID("arduino:missing-model-require") + require.True(t, found) + require.False(t, bNoRequireModel.RequireModel) +} - ' +func TestBricksIndexYAMLFormats(t *testing.T) { + testCases := []struct { + name string + yamlContent string + expectedError string + expectedBricks []Brick + }{ + { + // TODO: add a validator fo the bricks-list to validate the field + name: "missing bricks field does not cuase error", + yamlContent: `other_field: value`, + expectedBricks: nil, + }, + { + name: "bad YAML format invalid indentation", + yamlContent: `bricks: + - id: arduino:test_brick + name: Test Brick + description: A test brick`, + expectedError: "found character '\t' that cannot start any token", + }, + { + name: "empty bricks", + yamlContent: `bricks: []`, + expectedBricks: []Brick{}, + }, + { + name: "bad YAML format unclosed quotes", + yamlContent: `bricks: +- id: "arduino:test_brick + name: Test Brick + description: A test brick`, + expectedError: "could not find end character of double-quoted text", + }, + { + name: "bad YAML format missing colon", + yamlContent: `bricks: +- id arduino:test_brick + name: Test Brick`, + expectedError: "unexpected key name", + }, + { + name: "bad YAML format invalid syntax", + yamlContent: `bricks: +- id: arduino:test_brick + name: Test Brick + description: A test brick + ports: [7000,`, + expectedError: "sequence end token ']' not found", + }, + { + name: "bad YAML format tab characters", + yamlContent: "bricks:\n\t- id: arduino:test_brick\n\t name: Test Brick", + expectedError: "found character '\t' that cannot start any token", + }, + { + name: "simple brick", + yamlContent: `bricks: +- id: arduino:simple_brick + name: Test Brick + description: A test brick +`, + expectedBricks: []Brick{ + { + ID: "arduino:simple_brick", + Name: "Test Brick", + Description: "A test brick", + Category: "", + RequiresDisplay: "", + RequireContainer: false, + RequireModel: false, + RequiredDevices: nil, + Variables: nil, + Ports: nil, + ModelName: "", + MountDevicesIntoContainer: false, + }, + }, + }, + { + name: "valid YAML with complex variables", + yamlContent: `bricks: +- id: arduino:complex_brick + name: Complex Brick + description: A complex test brick + category: storage require_container: true require_model: true - ports: [] - model_name: keyword-spotting-hello-world - variables: - - name: CUSTOM_MODEL_PATH - default_value: /opt/models/ei/ - description: path to the custom model directory - - name: EI_KEYWORK_SPOTTING_MODEL - default_value: /models/ootb/ei/keyword-spotting-hello-world.eim - description: path to the model file -- id: arduino:mqtt - name: MQTT Connector - description: MQTT connector module. Acts as a client for receiving and publishing - messages to an MQTT broker. - require_container: false - require_model: false - ports: [] -- id: arduino:web_ui - name: Web UI - description: A user interface based on HTML and JavaScript that can rely on additional - APIs and a WebSocket exposed by a web server. - require_container: false - require_model: false + mount_devices_into_container: true + model_name: a-complex-model + required_devices: + - camera ports: - 7000 -- id: arduino:dbstorage_tsstore - name: Database Storage - Time Series Store - description: Simplified time series database storage layer for Arduino sensor samples - built on top of InfluxDB. - require_container: true - require_model: false - ports: [] - variables: - - name: APP_HOME - default_value: . - - name: DB_PASSWORD - default_value: Arduino15 - description: Database password - - name: DB_USERNAME - default_value: admin - description: Edge Impulse project API key - - name: INFLUXDB_ADMIN_TOKEN - default_value: 392edbf2-b8a2-481f-979d-3f188b2c05f0 - description: InfluxDB admin token -- id: arduino:dbstorage_sqlstore - name: Database Storage - SQLStore - description: Simplified database storage layer for Arduino sensor data using SQLite - local database. - require_container: false - require_model: false - ports: [] -- id: arduino:object_detection - name: Object Detection - description: "Brick for object detection using a pre-trained model. It processes\ - \ images and returns the predicted class label, bounding-boxes and confidence\ - \ score.\nBrick is designed to work with pre-trained models provided by framework\ - \ or with custom object detection models trained on Edge Impulse platform. \n" - require_container: true - require_model: true - ports: [] - model_name: yolox-object-detection - variables: - - name: CUSTOM_MODEL_PATH - default_value: /opt/models/ei/ - description: path to the custom model directory - - name: EI_OBJ_DETECTION_MODEL - default_value: /models/ootb/ei/yolo-x-nano.eim - description: path to the model file -- id: arduino:weather_forecast - name: Weather Forecast - description: Online weather forecast module for Arduino using open-meteo.com geolocation - and weather APIs. Requires an internet connection. - require_container: false - require_model: false - ports: [] -- id: arduino:visual_anomaly_detection - name: Visual Anomaly Detection - description: "Brick for visual anomaly detection using a pre-trained model. It processes\ - \ images and returns detected anomalies and bounding-boxes.\nBrick is designed\ - \ to work with pre-trained models provided by framework or with custom object\ - \ detection models trained on Edge Impulse platform. \n" - require_container: true - require_model: true - ports: [] - model_name: concreate-crack-anomaly-detection + - 8080 variables: - - name: CUSTOM_MODEL_PATH - default_value: /opt/models/ei/ - description: path to the custom model directory - - name: EI_V_ANOMALY_DETECTION_MODEL - default_value: /models/ootb/ei/concrete-crack-anomaly-detection.eim - description: path to the model file -` - - var index BricksIndex - err := yaml.Unmarshal([]byte(x), &index) - require.NoError(t, err) - require.Len(t, index.Bricks, 11) + - name: REQUIRED_VAR + default_value: "" + description: A required variable + - name: OPTIONAL_VAR + default_value: "default_value" + description: An optional variable`, + expectedBricks: []Brick{ + { + ID: "arduino:complex_brick", + Name: "Complex Brick", + Description: "A complex test brick", + Category: "storage", + RequiresDisplay: "", + RequireContainer: true, + RequireModel: true, + RequiredDevices: []string{"camera"}, + MountDevicesIntoContainer: true, + Variables: []BrickVariable{ + { + Name: "REQUIRED_VAR", + DefaultValue: "", + Description: "A required variable", + }, + { + Name: "OPTIONAL_VAR", + DefaultValue: "default_value", + Description: "An optional variable", + }, + }, + Ports: []string{"7000", "8080"}, + ModelName: "a-complex-model", + }, + }, + }, + } - // Check if ports are correctly set - b, found := index.FindBrickByID("arduino:web_ui") - require.True(t, found) - require.Equal(t, []string{"7000"}, b.Ports) + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + tempDir := t.TempDir() + brickIndex := paths.New(tempDir, "bricks-list.yaml") + err := os.WriteFile(brickIndex.String(), []byte(tc.yamlContent), 0600) + require.NoError(t, err) - // Check if variables are correctly set - b, found = index.FindBrickByID("arduino:image_classification") - require.True(t, found) - require.Equal(t, "Image Classification", b.Name) - require.Equal(t, "mobilenet-image-classification", b.ModelName) - require.True(t, b.RequireModel) - require.Len(t, b.Variables, 2) - require.Equal(t, "CUSTOM_MODEL_PATH", b.Variables[0].Name) - require.Equal(t, "/opt/models/ei/", b.Variables[0].DefaultValue) - require.Equal(t, "path to the custom model directory", b.Variables[0].Description) - require.Equal(t, "EI_CLASSIFICATION_MODEL", b.Variables[1].Name) - require.Equal(t, "/models/ootb/ei/mobilenet-v2-224px.eim", b.Variables[1].DefaultValue) - require.Equal(t, "path to the model file", b.Variables[1].Description) - require.False(t, b.Variables[0].IsRequired()) - require.False(t, b.Variables[1].IsRequired()) + index, err := Load(paths.New(tempDir)) + if tc.expectedError != "" { + require.Error(t, err) + require.Contains(t, err.Error(), tc.expectedError) + } else { + require.NoError(t, err) + require.Equal(t, index.Bricks, tc.expectedBricks, "bricsk mistmatch") + } + }) + } } diff --git a/internal/orchestrator/bricksindex/testdata/bricks-list.yaml b/internal/orchestrator/bricksindex/testdata/bricks-list.yaml new file mode 100644 index 00000000..c494df17 --- /dev/null +++ b/internal/orchestrator/bricksindex/testdata/bricks-list.yaml @@ -0,0 +1,142 @@ +bricks: +- id: arduino:image_classification + name: Image Classification + description: "Brick for image classification using a pre-trained model. It processes\ + \ images and returns the predicted class label and confidence score.\nBrick is\ + \ designed to work with pre-trained models provided by framework or with custom\ + \ image classification models trained on Edge Impulse platform. \n" + require_container: true + require_model: true + ports: [] + model_name: mobilenet-image-classification + variables: + - name: CUSTOM_MODEL_PATH + default_value: /opt/models/ei/ + description: path to the custom model directory + - name: EI_CLASSIFICATION_MODEL + default_value: /models/ootb/ei/mobilenet-v2-224px.eim + description: path to the model file +- id: arduino:camera_scanner + name: Camera Scanner + description: Scans a camera for barcodes and QR codes + require_container: false + require_model: false + ports: [] +- id: arduino:streamlit_ui + name: Streamlit UI + description: A simplified user interface based on Streamlit and Python. + require_container: false + require_model: false + ports: + - 7000 +- id: arduino:keyword_spotter + name: Keyword Spotter + description: 'Brick for keyword spotting using a pre-trained model. It processes + audio input to detect specific keywords or phrases. + + Brick is designed to work with pre-trained models provided by framework or with + custom audio classification models trained on Edge Impulse platform. + + ' + require_container: true + require_model: true + ports: [] + model_name: keyword-spotting-hello-world + variables: + - name: CUSTOM_MODEL_PATH + default_value: /opt/models/ei/ + description: path to the custom model directory + - name: EI_KEYWORK_SPOTTING_MODEL + default_value: /models/ootb/ei/keyword-spotting-hello-world.eim + description: path to the model file +- id: arduino:mqtt + name: MQTT Connector + description: MQTT connector module. Acts as a client for receiving and publishing + messages to an MQTT broker. + require_container: false + require_model: false + ports: [] +- id: arduino:web_ui + name: Web UI + description: A user interface based on HTML and JavaScript that can rely on additional + APIs and a WebSocket exposed by a web server. + require_container: false + require_model: false + ports: + - 7000 +- id: arduino:dbstorage_tsstore + name: Database Storage - Time Series Store + description: Simplified time series database storage layer for Arduino sensor samples + built on top of InfluxDB. + require_container: true + require_model: false + ports: [] + variables: + - name: APP_HOME + default_value: . + - name: DB_PASSWORD + default_value: Arduino15 + description: Database password + - name: DB_USERNAME + default_value: admin + description: Edge Impulse project API key + - name: INFLUXDB_ADMIN_TOKEN + default_value: 392edbf2-b8a2-481f-979d-3f188b2c05f0 + description: InfluxDB admin token +- id: arduino:dbstorage_sqlstore + name: Database Storage - SQLStore + description: Simplified database storage layer for Arduino sensor data using SQLite + local database. + require_container: false + require_model: false + ports: [] +- id: arduino:object_detection + name: Object Detection + description: "Brick for object detection using a pre-trained model. It processes\ + \ images and returns the predicted class label, bounding-boxes and confidence\ + \ score.\nBrick is designed to work with pre-trained models provided by framework\ + \ or with custom object detection models trained on Edge Impulse platform. \n" + require_container: true + require_model: true + ports: [] + model_name: yolox-object-detection + variables: + - name: CUSTOM_MODEL_PATH + default_value: /opt/models/ei/ + description: path to the custom model directory + - name: EI_OBJ_DETECTION_MODEL + default_value: /models/ootb/ei/yolo-x-nano.eim + description: path to the model file +- id: arduino:weather_forecast + name: Weather Forecast + description: Online weather forecast module for Arduino using open-meteo.com geolocation + and weather APIs. Requires an internet connection. + require_container: false + require_model: false + ports: [] +- id: arduino:visual_anomaly_detection + name: Visual Anomaly Detection + description: "Brick for visual anomaly detection using a pre-trained model. It processes\ + \ images and returns detected anomalies and bounding-boxes.\nBrick is designed\ + \ to work with pre-trained models provided by framework or with custom object\ + \ detection models trained on Edge Impulse platform. \n" + require_container: true + require_model: true + ports: [] + model_name: concreate-crack-anomaly-detection + variables: + - name: CUSTOM_MODEL_PATH + default_value: /opt/models/ei/ + description: path to the custom model directory + - name: EI_V_ANOMALY_DETECTION_MODEL + default_value: /models/ootb/ei/concrete-crack-anomaly-detection.eim + description: path to the model file +- id: arduino:missing-model-require + name: Camera Scanner + description: Scans a camera for barcodes and QR codes + require_container: false + ports: [] +- id: arduino:model_required + name: Model Required Brick + description: A brick that requires a model + require_model: true diff --git a/internal/orchestrator/cache.go b/internal/orchestrator/cache.go new file mode 100644 index 00000000..b4134ff6 --- /dev/null +++ b/internal/orchestrator/cache.go @@ -0,0 +1,41 @@ +package orchestrator + +import ( + "context" + "errors" + + "github.com/docker/cli/cli/command" + + "github.com/arduino/arduino-app-cli/internal/orchestrator/app" +) + +type CleanAppCacheRequest struct { + ForceClean bool +} + +var ErrCleanCacheRunningApp = errors.New("cannot remove cache of a running app") + +// CleanAppCache removes the `.cache` folder. If it detects that the app is running +// it tries to stop it first. +func CleanAppCache( + ctx context.Context, + docker command.Cli, + app app.ArduinoApp, + req CleanAppCacheRequest, +) error { + runningApp, err := getRunningApp(ctx, docker.Client()) + if err != nil { + return err + } + if runningApp != nil && runningApp.FullPath.EqualsTo(app.FullPath) { + if !req.ForceClean { + return ErrCleanCacheRunningApp + } + // We try to remove docker related resources at best effort + for range StopAndDestroyApp(ctx, docker, app) { + // just consume the iterator + } + } + + return app.ProvisioningStateDir().RemoveAll() +} diff --git a/internal/orchestrator/config/config.go b/internal/orchestrator/config/config.go index 0838f29d..4d3b3c76 100644 --- a/internal/orchestrator/config/config.go +++ b/internal/orchestrator/config/config.go @@ -28,7 +28,7 @@ import ( ) // runnerVersion do not edit, this is generate with `task generate:assets` -var runnerVersion = "0.5.0" +var runnerVersion = "0.6.0" type Configuration struct { appsDir *paths.Path diff --git a/internal/orchestrator/helpers.go b/internal/orchestrator/helpers.go index 5a637b07..3b94b654 100644 --- a/internal/orchestrator/helpers.go +++ b/internal/orchestrator/helpers.go @@ -193,7 +193,7 @@ func getRunningApp( if idx == -1 { return nil, nil } - app, err := app.Load(apps[idx].AppPath.String()) + app, err := app.Load(apps[idx].AppPath) if err != nil { return nil, fmt.Errorf("failed to load running app: %w", err) } diff --git a/internal/orchestrator/modelsindex/models_index.go b/internal/orchestrator/modelsindex/models_index.go index e18797f1..c24eb203 100644 --- a/internal/orchestrator/modelsindex/models_index.go +++ b/internal/orchestrator/modelsindex/models_index.go @@ -54,26 +54,26 @@ type AIModel struct { } type ModelsIndex struct { - models []AIModel + Models []AIModel } func (m *ModelsIndex) GetModels() []AIModel { - return m.models + return m.Models } func (m *ModelsIndex) GetModelByID(id string) (*AIModel, bool) { - idx := slices.IndexFunc(m.models, func(v AIModel) bool { return v.ID == id }) + idx := slices.IndexFunc(m.Models, func(v AIModel) bool { return v.ID == id }) if idx == -1 { return nil, false } - return &m.models[idx], true + return &m.Models[idx], true } func (m *ModelsIndex) GetModelsByBrick(brick string) []AIModel { var matches []AIModel - for i := range m.models { - if len(m.models[i].Bricks) > 0 && slices.Contains(m.models[i].Bricks, brick) { - matches = append(matches, m.models[i]) + for i := range m.Models { + if len(m.Models[i].Bricks) > 0 && slices.Contains(m.Models[i].Bricks, brick) { + matches = append(matches, m.Models[i]) } } if len(matches) == 0 { @@ -84,7 +84,7 @@ func (m *ModelsIndex) GetModelsByBrick(brick string) []AIModel { func (m *ModelsIndex) GetModelsByBricks(bricks []string) []AIModel { var matchingModels []AIModel - for _, model := range m.models { + for _, model := range m.Models { for _, modelBrick := range model.Bricks { if slices.Contains(bricks, modelBrick) { matchingModels = append(matchingModels, model) @@ -95,7 +95,7 @@ func (m *ModelsIndex) GetModelsByBricks(bricks []string) []AIModel { return matchingModels } -func GenerateModelsIndexFromFile(dir *paths.Path) (*ModelsIndex, error) { +func Load(dir *paths.Path) (*ModelsIndex, error) { content, err := dir.Join("models-list.yaml").ReadFile() if err != nil { return nil, err @@ -113,5 +113,5 @@ func GenerateModelsIndexFromFile(dir *paths.Path) (*ModelsIndex, error) { models[i] = model } } - return &ModelsIndex{models: models}, nil + return &ModelsIndex{Models: models}, nil } diff --git a/internal/orchestrator/modelsindex/modelsindex_test.go b/internal/orchestrator/modelsindex/modelsindex_test.go index 53ffb585..7f760390 100644 --- a/internal/orchestrator/modelsindex/modelsindex_test.go +++ b/internal/orchestrator/modelsindex/modelsindex_test.go @@ -9,7 +9,7 @@ import ( ) func TestModelsIndex(t *testing.T) { - modelsIndex, err := GenerateModelsIndexFromFile(paths.New("testdata")) + modelsIndex, err := Load(paths.New("testdata")) require.NoError(t, err) require.NotNil(t, modelsIndex) @@ -40,7 +40,7 @@ func TestModelsIndex(t *testing.T) { t.Run("it fails if model-list.yaml does not exist", func(t *testing.T) { nonExistentPath := paths.New("nonexistentdir") - modelsIndex, err := GenerateModelsIndexFromFile(nonExistentPath) + modelsIndex, err := Load(nonExistentPath) assert.Error(t, err) assert.Nil(t, modelsIndex) }) diff --git a/internal/orchestrator/orchestrator.go b/internal/orchestrator/orchestrator.go index 19181998..51a808cd 100644 --- a/internal/orchestrator/orchestrator.go +++ b/internal/orchestrator/orchestrator.go @@ -114,7 +114,7 @@ func StartApp( provisioner *Provision, modelsIndex *modelsindex.ModelsIndex, bricksIndex *bricksindex.BricksIndex, - app app.ArduinoApp, + appToStart app.ArduinoApp, cfg config.Configuration, staticStore *store.StaticStore, ) iter.Seq[StreamMessage] { @@ -122,6 +122,12 @@ func StartApp( ctx, cancel := context.WithCancel(ctx) defer cancel() + err := app.ValidateBricks(appToStart.Descriptor, bricksIndex) + if err != nil { + yield(StreamMessage{error: err}) + return + } + running, err := getRunningApp(ctx, docker.Client()) if err != nil { yield(StreamMessage{error: err}) @@ -131,7 +137,7 @@ func StartApp( yield(StreamMessage{error: fmt.Errorf("app %q is running", running.Name)}) return } - if !yield(StreamMessage{data: fmt.Sprintf("Starting app %q", app.Name)}) { + if !yield(StreamMessage{data: fmt.Sprintf("Starting app %q", appToStart.Name)}) { return } @@ -148,11 +154,12 @@ func StartApp( if !yield(StreamMessage{progress: &Progress{Name: "preparing", Progress: 0.0}}) { return } - if app.MainSketchPath != nil { + + if _, ok := appToStart.GetSketchPath(); ok { if !yield(StreamMessage{progress: &Progress{Name: "sketch compiling and uploading", Progress: 0.0}}) { return } - if err := compileUploadSketch(ctx, &app, sketchCallbackWriter); err != nil { + if err := compileUploadSketch(ctx, &appToStart, sketchCallbackWriter); err != nil { yield(StreamMessage{error: err}) return } @@ -161,15 +168,15 @@ func StartApp( } } - if app.MainPythonFile != nil { - envs := getAppEnvironmentVariables(app, bricksIndex, modelsIndex) + if appToStart.MainPythonFile != nil { + envs := getAppEnvironmentVariables(appToStart, bricksIndex, modelsIndex) if !yield(StreamMessage{data: "python provisioning"}) { cancel() return } provisionStartProgress := float32(0.0) - if app.MainSketchPath != nil { + if _, ok := appToStart.GetSketchPath(); ok { provisionStartProgress = 10.0 } @@ -177,7 +184,7 @@ func StartApp( return } - if err := provisioner.App(ctx, bricksIndex, &app, cfg, envs, staticStore); err != nil { + if err := provisioner.App(ctx, bricksIndex, &appToStart, cfg, envs, staticStore); err != nil { yield(StreamMessage{error: err}) return } @@ -188,10 +195,10 @@ func StartApp( } // Launch the docker compose command to start the app - overrideComposeFile := app.AppComposeOverrideFilePath() + overrideComposeFile := appToStart.AppComposeOverrideFilePath() commands := []string{} - commands = append(commands, "docker", "compose", "-f", app.AppComposeFilePath().String()) + commands = append(commands, "docker", "compose", "-f", appToStart.AppComposeFilePath().String()) if ok, _ := overrideComposeFile.ExistCheck(); ok { commands = append(commands, "-f", overrideComposeFile.String()) } @@ -377,7 +384,7 @@ func getVideoDevices() map[int]string { return deviceMap } -func stopAppWithCmd(ctx context.Context, app app.ArduinoApp, cmd string) iter.Seq[StreamMessage] { +func stopAppWithCmd(ctx context.Context, docker command.Cli, app app.ArduinoApp, cmd string) iter.Seq[StreamMessage] { return func(yield func(StreamMessage) bool) { ctx, cancel := context.WithCancel(ctx) defer cancel() @@ -395,8 +402,18 @@ func stopAppWithCmd(ctx context.Context, app app.ArduinoApp, cmd string) iter.Se return } }) - if app.MainSketchPath != nil { - // TODO: check that the app sketch is running before attempting to stop it. + + if _, ok := app.GetSketchPath(); ok { + // Before stopping the microcontroller we want to make sure that the app was running. + appStatus, err := getAppStatus(ctx, docker, app) + if err != nil { + yield(StreamMessage{error: err}) + return + } + if appStatus.Status != StatusStarting && appStatus.Status != StatusRunning { + yield(StreamMessage{data: fmt.Sprintf("app %q is not running", app.Name)}) + return + } if err := micro.Disable(); err != nil { yield(StreamMessage{error: err}) @@ -425,12 +442,12 @@ func stopAppWithCmd(ctx context.Context, app app.ArduinoApp, cmd string) iter.Se } } -func StopApp(ctx context.Context, app app.ArduinoApp) iter.Seq[StreamMessage] { - return stopAppWithCmd(ctx, app, "stop") +func StopApp(ctx context.Context, dockerClient command.Cli, app app.ArduinoApp) iter.Seq[StreamMessage] { + return stopAppWithCmd(ctx, dockerClient, app, "stop") } -func StopAndDestroyApp(ctx context.Context, app app.ArduinoApp) iter.Seq[StreamMessage] { - return stopAppWithCmd(ctx, app, "down") +func StopAndDestroyApp(ctx context.Context, dockerClient command.Cli, app app.ArduinoApp) iter.Seq[StreamMessage] { + return stopAppWithCmd(ctx, dockerClient, app, "down") } func RestartApp( @@ -458,7 +475,7 @@ func RestartApp( return } - stopStream := StopApp(ctx, *runningApp) + stopStream := StopApp(ctx, docker, *runningApp) for msg := range stopStream { if !yield(msg) { return @@ -597,7 +614,7 @@ func ListApps( } for _, file := range appPaths { - app, err := app.Load(file.String()) + app, err := app.Load(file) if err != nil { result.BrokenApps = append(result.BrokenApps, BrokenAppInfo{ Name: file.Base(), @@ -656,9 +673,10 @@ type AppDetailedInfo struct { } type AppDetailedBrick struct { - ID string `json:"id" required:"true"` - Name string `json:"name" required:"true"` - Category string `json:"category,omitempty"` + ID string `json:"id" required:"true"` + Name string `json:"name" required:"true"` + Category string `json:"category,omitempty"` + RequireModel bool `json:"require_model"` } func AppDetails( @@ -721,6 +739,7 @@ func AppDetails( } res.Name = bi.Name res.Category = bi.Category + res.RequireModel = bi.RequireModel return res }), }, nil @@ -730,7 +749,6 @@ type CreateAppRequest struct { Name string Icon string Description string - SkipPython bool SkipSketch bool } @@ -744,9 +762,6 @@ func CreateApp( idProvider *app.IDProvider, cfg config.Configuration, ) (CreateAppResponse, error) { - if req.SkipPython && req.SkipSketch { - return CreateAppResponse{}, fmt.Errorf("cannot skip both python and sketch") - } if req.Name == "" { return CreateAppResponse{}, fmt.Errorf("app name cannot be empty") } @@ -765,16 +780,8 @@ func CreateApp( if err := newApp.IsValid(); err != nil { return CreateAppResponse{}, fmt.Errorf("%w: %v", app.ErrInvalidApp, err) } - var options appgenerator.Opts = 0 - if req.SkipSketch { - options |= appgenerator.SkipSketch - } - if req.SkipPython { - options |= appgenerator.SkipPython - } - - if err := appgenerator.GenerateApp(basePath, newApp, options); err != nil { + if err := appgenerator.GenerateApp(basePath, newApp, req.SkipSketch); err != nil { return CreateAppResponse{}, fmt.Errorf("failed to create app: %w", err) } id, err := idProvider.IDFromPath(basePath) @@ -888,12 +895,19 @@ func CloneApp( return CloneAppResponse{ID: id}, nil } -func DeleteApp(ctx context.Context, app app.ArduinoApp) error { - for msg := range StopApp(ctx, app) { - if msg.error != nil { - return fmt.Errorf("failed to stop app: %w", msg.error) +func DeleteApp(ctx context.Context, dockerClient command.Cli, app app.ArduinoApp) error { + + runningApp, err := getRunningApp(ctx, dockerClient.Client()) + if err != nil { + return err + } + if runningApp != nil && runningApp.FullPath.EqualsTo(app.FullPath) { + // We try to remove docker related resources at best effort + for range StopAndDestroyApp(ctx, dockerClient, app) { + // just consume the iterator } } + return app.FullPath.RemoveAll() } @@ -932,7 +946,7 @@ func GetDefaultApp(cfg config.Configuration) (*app.ArduinoApp, error) { return nil, nil } - app, err := app.Load(string(defaultAppPath)) + app, err := app.Load(paths.New(string(defaultAppPath))) if err != nil { // If the app is not valid, we remove the file slog.Warn("default app is not valid", slog.String("path", string(defaultAppPath)), slog.String("error", err.Error())) @@ -1137,9 +1151,12 @@ func compileUploadSketch( defer func() { _, _ = srv.Destroy(ctx, &rpc.DestroyRequest{Instance: inst}) }() - sketchPath := arduinoApp.MainSketchPath.String() + sketchPath, ok := arduinoApp.GetSketchPath() + if !ok { + return fmt.Errorf("no sketch path found in the Arduino app") + } buildPath := arduinoApp.SketchBuildPath().String() - sketchResp, err := srv.LoadSketch(ctx, &rpc.LoadSketchRequest{SketchPath: sketchPath}) + sketchResp, err := srv.LoadSketch(ctx, &rpc.LoadSketchRequest{SketchPath: sketchPath.String()}) if err != nil { return err } @@ -1150,7 +1167,7 @@ func compileUploadSketch( } initReq := &rpc.InitRequest{ Instance: inst, - SketchPath: sketchPath, + SketchPath: sketchPath.String(), Profile: profile, } @@ -1190,7 +1207,7 @@ func compileUploadSketch( compileReq := rpc.CompileRequest{ Instance: inst, Fqbn: "arduino:zephyr:unoq", - SketchPath: sketchPath, + SketchPath: sketchPath.String(), BuildPath: buildPath, Jobs: 2, } @@ -1216,12 +1233,12 @@ func compileUploadSketch( slog.Info("Used library " + lib.GetName() + " (" + lib.GetVersion() + ") in " + lib.GetInstallDir()) } - if err := uploadSketchInRam(ctx, w, srv, inst, sketchPath, buildPath); err != nil { + if err := uploadSketchInRam(ctx, w, srv, inst, sketchPath.String(), buildPath); err != nil { slog.Warn("failed to upload in ram mode, trying to configure the board in ram mode, and retry", slog.String("error", err.Error())) if err := configureMicroInRamMode(ctx, w, srv, inst); err != nil { return err } - return uploadSketchInRam(ctx, w, srv, inst, sketchPath, buildPath) + return uploadSketchInRam(ctx, w, srv, inst, sketchPath.String(), buildPath) } return nil } diff --git a/internal/orchestrator/orchestrator_test.go b/internal/orchestrator/orchestrator_test.go index 223b4705..ab42d287 100644 --- a/internal/orchestrator/orchestrator_test.go +++ b/internal/orchestrator/orchestrator_test.go @@ -90,7 +90,7 @@ func TestCloneApp(t *testing.T) { }) // The app.yaml will have the name set to the new-name - clonedApp := f.Must(app.Load(appDir.String())) + clonedApp := f.Must(app.Load(appDir)) require.Equal(t, "new-name", clonedApp.Name) }) t.Run("with icon", func(t *testing.T) { @@ -108,7 +108,7 @@ func TestCloneApp(t *testing.T) { }) // The app.yaml will have the icon set to 🦄 - clonedApp := f.Must(app.Load(appDir.String())) + clonedApp := f.Must(app.Load(appDir)) require.Equal(t, "with-icon", clonedApp.Name) require.Equal(t, "🦄", clonedApp.Descriptor.Icon) }) @@ -164,7 +164,7 @@ func TestEditApp(t *testing.T) { appDir := cfg.AppsDir().Join("app-default") t.Run("previously not default", func(t *testing.T) { - app := f.Must(app.Load(appDir.String())) + app := f.Must(app.Load(appDir)) previousDefaultApp, err := GetDefaultApp(cfg) require.NoError(t, err) @@ -178,7 +178,7 @@ func TestEditApp(t *testing.T) { require.True(t, appDir.EquivalentTo(currentDefaultApp.FullPath)) }) t.Run("previously default", func(t *testing.T) { - app := f.Must(app.Load(appDir.String())) + app := f.Must(app.Load(appDir)) err := SetDefaultApp(&app, cfg) require.NoError(t, err) @@ -200,12 +200,12 @@ func TestEditApp(t *testing.T) { _, err := CreateApp(t.Context(), CreateAppRequest{Name: originalAppName}, idProvider, cfg) require.NoError(t, err) appDir := cfg.AppsDir().Join(originalAppName) - userApp := f.Must(app.Load(appDir.String())) + userApp := f.Must(app.Load(appDir)) originalPath := userApp.FullPath err = EditApp(AppEditRequest{Name: f.Ptr("new-name")}, &userApp, cfg) require.NoError(t, err) - editedApp, err := app.Load(cfg.AppsDir().Join("new-name").String()) + editedApp, err := app.Load(cfg.AppsDir().Join("new-name")) require.NoError(t, err) require.Equal(t, "new-name", editedApp.Name) require.True(t, originalPath.NotExist()) // The original app directory should be removed after renaming @@ -215,7 +215,7 @@ func TestEditApp(t *testing.T) { _, err := CreateApp(t.Context(), CreateAppRequest{Name: existingAppName}, idProvider, cfg) require.NoError(t, err) appDir := cfg.AppsDir().Join(existingAppName) - existingApp := f.Must(app.Load(appDir.String())) + existingApp := f.Must(app.Load(appDir)) err = EditApp(AppEditRequest{Name: f.Ptr(existingAppName)}, &existingApp, cfg) require.ErrorIs(t, err, ErrAppAlreadyExists) @@ -227,14 +227,14 @@ func TestEditApp(t *testing.T) { _, err := CreateApp(t.Context(), CreateAppRequest{Name: commonAppName}, idProvider, cfg) require.NoError(t, err) commonAppDir := cfg.AppsDir().Join(commonAppName) - commonApp := f.Must(app.Load(commonAppDir.String())) + commonApp := f.Must(app.Load(commonAppDir)) err = EditApp(AppEditRequest{ Icon: f.Ptr("💻"), Description: f.Ptr("new desc"), }, &commonApp, cfg) require.NoError(t, err) - editedApp := f.Must(app.Load(commonAppDir.String())) + editedApp := f.Must(app.Load(commonAppDir)) require.Equal(t, "new desc", editedApp.Descriptor.Description) require.Equal(t, "💻", editedApp.Descriptor.Icon) }) @@ -427,7 +427,7 @@ func TestGetAppEnvironmentVariablesWithDefaults(t *testing.T) { require.NoError(t, err) appId := createApp(t, "app1", false, idProvider, cfg) - appDesc, err := app.Load(appId.ToPath().String()) + appDesc, err := app.Load(appId.ToPath()) require.NoError(t, err) appDesc.Descriptor.Bricks = []app.Brick{ { @@ -447,7 +447,6 @@ bricks: \ or with custom object detection models trained on Edge Impulse platform. \n" require_container: true require_model: true - require_devices: false ports: [] category: video model_name: yolox-object-detection @@ -461,7 +460,7 @@ bricks: `) err = cfg.AssetsDir().Join("bricks-list.yaml").WriteFile(bricksIndexContent) require.NoError(t, err) - bricksIndex, err := bricksindex.GenerateBricksIndexFromFile(cfg.AssetsDir()) + bricksIndex, err := bricksindex.Load(cfg.AssetsDir()) assert.NoError(t, err) modelsIndexContent := []byte(` @@ -483,7 +482,7 @@ models: `) err = cfg.AssetsDir().Join("models-list.yaml").WriteFile(modelsIndexContent) require.NoError(t, err) - modelIndex, err := modelsindex.GenerateModelsIndexFromFile(cfg.AssetsDir()) + modelIndex, err := modelsindex.Load(cfg.AssetsDir()) require.NoError(t, err) env := getAppEnvironmentVariables(appDesc, bricksIndex, modelIndex) @@ -512,7 +511,7 @@ func TestGetAppEnvironmentVariablesWithCustomModelOverrides(t *testing.T) { require.NoError(t, err) appId := createApp(t, "app1", false, idProvider, cfg) - appDesc, err := app.Load(appId.ToPath().String()) + appDesc, err := app.Load(appId.ToPath()) require.NoError(t, err) appDesc.Descriptor.Bricks = []app.Brick{ { @@ -533,7 +532,6 @@ bricks: \ or with custom object detection models trained on Edge Impulse platform. \n" require_container: true require_model: true - require_devices: false category: video model_name: yolox-object-detection variables: @@ -546,7 +544,7 @@ bricks: `) err = cfg.AssetsDir().Join("bricks-list.yaml").WriteFile(bricksIndexContent) require.NoError(t, err) - bricksIndex, err := bricksindex.GenerateBricksIndexFromFile(cfg.AssetsDir()) + bricksIndex, err := bricksindex.Load(cfg.AssetsDir()) assert.NoError(t, err) modelsIndexContent := []byte(` @@ -568,7 +566,7 @@ models: `) err = cfg.AssetsDir().Join("models-list.yaml").WriteFile(modelsIndexContent) require.NoError(t, err) - modelIndex, err := modelsindex.GenerateModelsIndexFromFile(cfg.AssetsDir()) + modelIndex, err := modelsindex.Load(cfg.AssetsDir()) require.NoError(t, err) env := getAppEnvironmentVariables(appDesc, bricksIndex, modelIndex) diff --git a/internal/orchestrator/provision.go b/internal/orchestrator/provision.go index 393fbc8c..eae5a380 100644 --- a/internal/orchestrator/provision.go +++ b/internal/orchestrator/provision.go @@ -257,7 +257,7 @@ func generateMainComposeFile( } // 4. Retrieve the required devices that we have to mount - slog.Debug("Brick config", slog.Bool("require_devices", idxBrick.MountDevicesIntoContainer), slog.Any("ports", ports), slog.Any("required_devices", idxBrick.RequiredDevices)) + slog.Debug("Brick config", slog.Bool("mount_devices_into_container", idxBrick.MountDevicesIntoContainer), slog.Any("ports", ports), slog.Any("required_devices", idxBrick.RequiredDevices)) if idxBrick.MountDevicesIntoContainer { servicesThatRequireDevices = slices.AppendSeq(servicesThatRequireDevices, maps.Keys(svcs)) } @@ -335,6 +335,16 @@ func generateMainComposeFile( }) } } + if devices.hasSoundDevice { + // If we are adding sound devices, mount also /dev/snd/by-id if it exists to allow access to by-id links + if paths.New("/dev/snd/by-id").Exist() { + volumes = append(volumes, volume{ + Type: "bind", + Source: "/dev/snd/by-id", + Target: "/dev/snd/by-id", + }) + } + } volumes = addLedControl(volumes) diff --git a/internal/orchestrator/provision_test.go b/internal/orchestrator/provision_test.go index b2ca0bb0..1bd7aa65 100644 --- a/internal/orchestrator/provision_test.go +++ b/internal/orchestrator/provision_test.go @@ -104,7 +104,7 @@ bricks: require.NoError(t, err) // Override brick index with custom test content - bricksIndex, err := bricksindex.GenerateBricksIndexFromFile(cfg.AssetsDir()) + bricksIndex, err := bricksindex.Load(cfg.AssetsDir()) require.Nil(t, err, "Failed to load bricks index with custom content") br, ok := bricksIndex.FindBrickByID("arduino:video_object_detection") @@ -301,7 +301,7 @@ bricks: err := cfg.AssetsDir().Join("bricks-list.yaml").WriteFile(bricksIndexContent) require.NoError(t, err) - bricksIndex, err := bricksindex.GenerateBricksIndexFromFile(cfg.AssetsDir()) + bricksIndex, err := bricksindex.Load(cfg.AssetsDir()) require.Nil(t, err, "Failed to load bricks index with custom content") br, ok := bricksIndex.FindBrickByID("arduino:dbstorage_tsstore") require.True(t, ok, "Brick arduino:dbstorage_tsstore should exist in the index") diff --git a/internal/orchestrator/sketch_libs.go b/internal/orchestrator/sketch_libs.go index 3ef3b7ff..cb058924 100644 --- a/internal/orchestrator/sketch_libs.go +++ b/internal/orchestrator/sketch_libs.go @@ -17,6 +17,7 @@ package orchestrator import ( "context" + "errors" "log/slog" "time" @@ -30,6 +31,11 @@ import ( const indexUpdateInterval = 10 * time.Minute func AddSketchLibrary(ctx context.Context, app app.ArduinoApp, libRef LibraryReleaseID, addDeps bool) ([]LibraryReleaseID, error) { + sketchPath, ok := app.GetSketchPath() + if !ok { + return []LibraryReleaseID{}, errors.New("cannot add a library. Missing sketch folder") + } + srv := commands.NewArduinoCoreServer() var inst *rpc.Instance if res, err := srv.Create(ctx, &rpc.CreateRequest{}); err != nil { @@ -58,7 +64,7 @@ func AddSketchLibrary(ctx context.Context, app app.ArduinoApp, libRef LibraryRel resp, err := srv.ProfileLibAdd(ctx, &rpc.ProfileLibAddRequest{ Instance: inst, - SketchPath: app.MainSketchPath.String(), + SketchPath: sketchPath.String(), Library: &rpc.SketchProfileLibraryReference{ Library: &rpc.SketchProfileLibraryReference_IndexLibrary_{ IndexLibrary: &rpc.SketchProfileLibraryReference_IndexLibrary{ @@ -77,6 +83,10 @@ func AddSketchLibrary(ctx context.Context, app app.ArduinoApp, libRef LibraryRel } func RemoveSketchLibrary(ctx context.Context, app app.ArduinoApp, libRef LibraryReleaseID) (LibraryReleaseID, error) { + sketchPath, ok := app.GetSketchPath() + if !ok { + return LibraryReleaseID{}, errors.New("cannot remove a library. Missing sketch folder") + } srv := commands.NewArduinoCoreServer() var inst *rpc.Instance if res, err := srv.Create(ctx, &rpc.CreateRequest{}); err != nil { @@ -102,7 +112,7 @@ func RemoveSketchLibrary(ctx context.Context, app app.ArduinoApp, libRef Library }, }, }, - SketchPath: app.MainSketchPath.String(), + SketchPath: sketchPath.String(), }) if err != nil { return LibraryReleaseID{}, err @@ -111,10 +121,15 @@ func RemoveSketchLibrary(ctx context.Context, app app.ArduinoApp, libRef Library } func ListSketchLibraries(ctx context.Context, app app.ArduinoApp) ([]LibraryReleaseID, error) { + sketchPath, ok := app.GetSketchPath() + if !ok { + return []LibraryReleaseID{}, errors.New("cannot list libraries. Missing sketch folder") + } + srv := commands.NewArduinoCoreServer() resp, err := srv.ProfileLibList(ctx, &rpc.ProfileLibListRequest{ - SketchPath: app.MainSketchPath.String(), + SketchPath: sketchPath.String(), }) if err != nil { return nil, err diff --git a/internal/orchestrator/sketch_libs_test.go b/internal/orchestrator/sketch_libs_test.go new file mode 100644 index 00000000..d863e60e --- /dev/null +++ b/internal/orchestrator/sketch_libs_test.go @@ -0,0 +1,88 @@ +// This file is part of arduino-app-cli. +// +// Copyright 2025 ARDUINO SA (http://www.arduino.cc/) +// +// This software is released under the GNU General Public License version 3, +// which covers the main part of arduino-app-cli. +// The terms of this license can be found at: +// https://www.gnu.org/licenses/gpl-3.0.en.html +// +// You can be released from the requirements of the above licenses by purchasing +// a commercial license. Buying such a license is mandatory if you want to +// modify or otherwise use the software for commercial activities involving the +// Arduino software without disclosing the source code of your own applications. +// To purchase a commercial license, send an email to license@arduino.cc. + +package orchestrator + +import ( + "context" + "testing" + + "github.com/arduino/go-paths-helper" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/arduino/arduino-app-cli/internal/orchestrator/app" +) + +func TestListSketchLibraries(t *testing.T) { + t.Run("fail to list libraries if the sketch folder is missing", func(t *testing.T) { + pythonApp, err := app.Load(createTestAppPythonOnly(t)) + require.NoError(t, err) + + libs, err := ListSketchLibraries(context.Background(), pythonApp) + require.Error(t, err) + assert.Contains(t, err.Error(), "cannot list libraries. Missing sketch folder") + assert.Empty(t, libs) + }) + + t.Run("fail to add library if the sketch folder is missing", func(t *testing.T) { + pythonApp, err := app.Load(createTestAppPythonOnly(t)) + require.NoError(t, err) + + libs, err := AddSketchLibrary(context.Background(), pythonApp, LibraryReleaseID{}, false) + require.Error(t, err) + assert.Contains(t, err.Error(), "cannot add a library. Missing sketch folder") + assert.Empty(t, libs) + }) + + t.Run("fail to remove library if the sketch folder is missing", func(t *testing.T) { + pythonApp, err := app.Load(createTestAppPythonOnly(t)) + require.NoError(t, err) + + id, err := RemoveSketchLibrary(context.Background(), pythonApp, LibraryReleaseID{}) + require.Error(t, err) + assert.Contains(t, err.Error(), "cannot remove a library. Missing sketch folder") + assert.Empty(t, id) + }) +} + +// Helper function to create a test app without sketch path (Python-only) +func createTestAppPythonOnly(t *testing.T) *paths.Path { + tempDir := t.TempDir() + + appYaml := paths.New(tempDir, "app.yaml") + require.NoError(t, appYaml.WriteFile([]byte(` +name: test-python-app +version: 1.0.0 +description: Test Python-only app +`))) + + // Create python directory and file + pythonDir := paths.New(tempDir, "python") + require.NoError(t, pythonDir.MkdirAll()) + + pythonFile := pythonDir.Join("main.py") + require.NoError(t, pythonFile.WriteFile([]byte(` +import time + +def main(): + print("Hello from Python!") + time.sleep(1) + +if __name__ == "__main__": + main() +`))) + return paths.New(tempDir) +} diff --git a/internal/orchestrator/system.go b/internal/orchestrator/system.go index 341d6c55..4d9f9a60 100644 --- a/internal/orchestrator/system.go +++ b/internal/orchestrator/system.go @@ -235,7 +235,7 @@ func SystemCleanup(ctx context.Context, cfg config.Configuration, staticStore *s feedback.Warnf("failed to get running app - %v", err) } if runningApp != nil { - for item := range StopAndDestroyApp(ctx, *runningApp) { + for item := range StopAndDestroyApp(ctx, docker, *runningApp) { if item.GetType() == ErrorType { feedback.Warnf("failed to stop and destroy running app - %v", item.GetError()) break diff --git a/internal/update/apt/service.go b/internal/update/apt/service.go index f3d3984e..860be68f 100644 --- a/internal/update/apt/service.go +++ b/internal/update/apt/service.go @@ -25,7 +25,6 @@ import ( "regexp" "strings" "sync" - "time" "github.com/arduino/go-paths-helper" "go.bug.st/f" @@ -84,79 +83,55 @@ func (s *Service) UpgradePackages(ctx context.Context, names []string) (<-chan u defer s.lock.Unlock() defer close(eventsCh) - ctx, cancel := context.WithTimeout(ctx, 10*time.Minute) - defer cancel() - - eventsCh <- update.Event{Type: update.StartEvent, Data: "Upgrade is starting"} + eventsCh <- update.NewDataEvent(update.StartEvent, "Upgrade is starting") stream := runUpgradeCommand(ctx, names) for line, err := range stream { if err != nil { - eventsCh <- update.Event{ - Type: update.ErrorEvent, - Err: err, - Data: "Error running upgrade command", - } - slog.Error("error processing upgrade command output", "error", err) + eventsCh <- update.NewErrorEvent(fmt.Errorf("error running upgrade command: %w", err)) return } - eventsCh <- update.Event{Type: update.UpgradeLineEvent, Data: line} + eventsCh <- update.NewDataEvent(update.UpgradeLineEvent, line) } - eventsCh <- update.Event{Type: update.StartEvent, Data: "apt cleaning cache is starting"} + + eventsCh <- update.NewDataEvent(update.StartEvent, "apt cleaning cache is starting") for line, err := range runAptCleanCommand(ctx) { if err != nil { - eventsCh <- update.Event{ - Type: update.ErrorEvent, - Err: err, - Data: "Error running apt clean command", - } - slog.Error("error processing apt clean command output", "error", err) + eventsCh <- update.NewErrorEvent(fmt.Errorf("error running apt clean command: %w", err)) return } - eventsCh <- update.Event{Type: update.UpgradeLineEvent, Data: line} + eventsCh <- update.NewDataEvent(update.UpgradeLineEvent, line) } - // TEMPORARY PATCH: stopping and destroying docker containers and images since IDE does not implement it yet. - // TODO: Remove this workaround once IDE implements it. - // Tracking issue: https://github.com/arduino/arduino-app-cli/issues/623 - eventsCh <- update.Event{Type: update.UpgradeLineEvent, Data: "Stop and destroy docker containers and images ..."} + + eventsCh <- update.NewDataEvent(update.UpgradeLineEvent, "Stop and destroy docker containers and images ....") streamCleanup := cleanupDockerContainers(ctx) for line, err := range streamCleanup { if err != nil { // TODO: maybe we should retun an error or a better feedback to the user? // currently, we just log the error and continue considenring not blocking - slog.Error("Error stopping and destroying docker containers", "error", err) + slog.Warn("Error stopping and destroying docker containers", "error", err) + } else { + eventsCh <- update.NewDataEvent(update.UpgradeLineEvent, line) } - eventsCh <- update.Event{Type: update.UpgradeLineEvent, Data: line} } - // TEMPORARY PATCH: Install the latest docker images and show the logs to the users. // TODO: Remove this workaround once docker image versions are no longer hardcoded in arduino-app-cli. // Tracking issue: https://github.com/arduino/arduino-app-cli/issues/600 // Currently, we need to launch `arduino-app-cli system init` to pull the latest docker images because // the version of the docker images are hardcoded in the (new downloaded) version of the arduino-app-cli. - eventsCh <- update.Event{Type: update.UpgradeLineEvent, Data: "Pulling the latest docker images ..."} + eventsCh <- update.NewDataEvent(update.UpgradeLineEvent, "Pulling the latest docker images ...") streamDocker := pullDockerImages(ctx) for line, err := range streamDocker { if err != nil { - eventsCh <- update.Event{ - Type: update.ErrorEvent, - Err: err, - Data: "Error upgrading docker images", - } - slog.Error("error upgrading docker images", "error", err) + eventsCh <- update.NewErrorEvent(fmt.Errorf("error pulling docker images: %w", err)) return } - eventsCh <- update.Event{Type: update.UpgradeLineEvent, Data: line} + eventsCh <- update.NewDataEvent(update.UpgradeLineEvent, line) } - eventsCh <- update.Event{Type: update.RestartEvent, Data: "Upgrade completed. Restarting ..."} + eventsCh <- update.NewDataEvent(update.RestartEvent, "Upgrade completed. Restarting ...") err := restartServices(ctx) if err != nil { - eventsCh <- update.Event{ - Type: update.ErrorEvent, - Err: err, - Data: "Error restart services after upgrade", - } - slog.Error("failed to restart services", "error", err) + eventsCh <- update.NewErrorEvent(fmt.Errorf("error restarting services after upgrade: %w", err)) return } }() @@ -312,7 +287,10 @@ func restartServices(ctx context.Context) error { if err != nil { return err } - return needRestartCmd.RunWithinContext(ctx) + if out, err := needRestartCmd.RunAndCaptureCombinedOutput(ctx); err != nil { + return fmt.Errorf("error running needrestart command: %w: %s", err, out) + } + return nil } func listUpgradablePackages(ctx context.Context, matcher func(update.UpgradablePackage) bool) ([]update.UpgradablePackage, error) { diff --git a/internal/update/arduino/arduino.go b/internal/update/arduino/arduino.go index 01076dff..0c4e5d29 100644 --- a/internal/update/arduino/arduino.go +++ b/internal/update/arduino/arduino.go @@ -18,9 +18,9 @@ package arduino import ( "context" "errors" + "fmt" "log/slog" "sync" - "time" "github.com/arduino/arduino-cli/commands" "github.com/arduino/arduino-cli/commands/cmderrors" @@ -134,42 +134,31 @@ func (a *ArduinoPlatformUpdater) UpgradePackages(ctx context.Context, names []st downloadProgressCB := func(curr *rpc.DownloadProgress) { data := helpers.ArduinoCLIDownloadProgressToString(curr) slog.Debug("Download progress", slog.String("download_progress", data)) - eventsCh <- update.Event{Type: update.UpgradeLineEvent, Data: data} + eventsCh <- update.NewDataEvent(update.UpgradeLineEvent, data) } taskProgressCB := func(msg *rpc.TaskProgress) { data := helpers.ArduinoCLITaskProgressToString(msg) slog.Debug("Task progress", slog.String("task_progress", data)) - eventsCh <- update.Event{Type: update.UpgradeLineEvent, Data: data} + eventsCh <- update.NewDataEvent(update.UpgradeLineEvent, data) } go func() { defer a.lock.Unlock() defer close(eventsCh) - ctx, cancel := context.WithTimeout(ctx, 10*time.Minute) - defer cancel() - - eventsCh <- update.Event{Type: update.StartEvent, Data: "Upgrade is starting"} + eventsCh <- update.NewDataEvent(update.StartEvent, "Upgrade is starting") logrus.SetLevel(logrus.ErrorLevel) // Reduce the log level of arduino-cli srv := commands.NewArduinoCoreServer() if err := setConfig(ctx, srv); err != nil { - eventsCh <- update.Event{ - Type: update.ErrorEvent, - Err: err, - Data: "Error setting additional URLs", - } + eventsCh <- update.NewErrorEvent(fmt.Errorf("error setting config: %w", err)) return } var inst *rpc.Instance if resp, err := srv.Create(ctx, &rpc.CreateRequest{}); err != nil { - eventsCh <- update.Event{ - Type: update.ErrorEvent, - Err: err, - Data: "Error creating Arduino instance", - } + eventsCh <- update.NewErrorEvent(fmt.Errorf("error creating arduino-cli instance: %w", err)) return } else { inst = resp.GetInstance() @@ -185,19 +174,11 @@ func (a *ArduinoPlatformUpdater) UpgradePackages(ctx context.Context, names []st { stream, _ := commands.UpdateIndexStreamResponseToCallbackFunction(ctx, downloadProgressCB) if err := srv.UpdateIndex(&rpc.UpdateIndexRequest{Instance: inst}, stream); err != nil { - eventsCh <- update.Event{ - Type: update.ErrorEvent, - Err: err, - Data: "Error updating index", - } + eventsCh <- update.NewErrorEvent(fmt.Errorf("error updating index: %w", err)) return } if err := srv.Init(&rpc.InitRequest{Instance: inst}, commands.InitStreamResponseToCallbackFunction(ctx, nil)); err != nil { - eventsCh <- update.Event{ - Type: update.ErrorEvent, - Err: err, - Data: "Error initializing Arduino instance", - } + eventsCh <- update.NewErrorEvent(fmt.Errorf("error initializing instance: %w", err)) return } } @@ -219,17 +200,13 @@ func (a *ArduinoPlatformUpdater) UpgradePackages(ctx context.Context, names []st ); err != nil { var alreadyPresent *cmderrors.PlatformAlreadyAtTheLatestVersionError if errors.As(err, &alreadyPresent) { - eventsCh <- update.Event{Type: update.UpgradeLineEvent, Data: alreadyPresent.Error()} + eventsCh <- update.NewDataEvent(update.UpgradeLineEvent, alreadyPresent.Error()) return } var notFound *cmderrors.PlatformNotFoundError if !errors.As(err, ¬Found) { - eventsCh <- update.Event{ - Type: update.ErrorEvent, - Err: err, - Data: "Error upgrading platform", - } + eventsCh <- update.NewErrorEvent(fmt.Errorf("error upgrading platform: %w", err)) return } // If the platform is not found, we will try to install it @@ -246,23 +223,16 @@ func (a *ArduinoPlatformUpdater) UpgradePackages(ctx context.Context, names []st ), ) if err != nil { - eventsCh <- update.Event{ - Type: update.ErrorEvent, - Err: err, - Data: "Error installing platform", - } + eventsCh <- update.NewErrorEvent(fmt.Errorf("error installing platform: %w", err)) return } } else if respCB().GetPlatform() == nil { - eventsCh <- update.Event{ - Type: update.ErrorEvent, - Data: "platform upgrade failed", - } + eventsCh <- update.NewErrorEvent(fmt.Errorf("platform upgrade failed")) return } cbw := orchestrator.NewCallbackWriter(func(line string) { - eventsCh <- update.Event{Type: update.UpgradeLineEvent, Data: line} + eventsCh <- update.NewDataEvent(update.UpgradeLineEvent, line) }) err := srv.BurnBootloader( @@ -274,11 +244,7 @@ func (a *ArduinoPlatformUpdater) UpgradePackages(ctx context.Context, names []st commands.BurnBootloaderToServerStreams(ctx, cbw, cbw), ) if err != nil { - eventsCh <- update.Event{ - Type: update.ErrorEvent, - Err: err, - Data: "Error burning bootloader", - } + eventsCh <- update.NewErrorEvent(fmt.Errorf("error burning bootloader: %w", err)) return } }() diff --git a/internal/update/errors.go b/internal/update/errors.go new file mode 100644 index 00000000..9f65a63c --- /dev/null +++ b/internal/update/errors.go @@ -0,0 +1,55 @@ +package update + +import "errors" + +type ErrorCode string + +// TODO: add the error to the openAPI spec as an enum +const ( + NoInternetConnectionCode ErrorCode = "NO_INTERNET_CONNECTION" + OperationInProgressCode ErrorCode = "OPERATION_IN_PROGRESS" + UnknownErrorCode ErrorCode = "UNKNOWN_ERROR" +) + +var ( + ErrOperationAlreadyInProgress = &UpdateError{ + Code: OperationInProgressCode, + Details: "an operation is already in progress", + } + ErrNoInternetConnection = &UpdateError{ + Code: NoInternetConnectionCode, + Details: "no internet connection available", + } +) + +type UpdateError struct { + Code ErrorCode `json:"code"` + Details string `json:"details"` + + err error +} + +func (e *UpdateError) Error() string { + return e.Details +} + +func (e *UpdateError) Unwrap() error { + return e.err +} + +func NewUnkownError(err error) *UpdateError { + return &UpdateError{ + Details: err.Error(), + err: err, + } +} + +func GetUpdateErrorCode(err error) ErrorCode { + var updateError *UpdateError + if errors.As(err, &updateError) { + if updateError.Code != "" { + return updateError.Code + } + } + return UnknownErrorCode +} diff --git a/internal/update/errors_test.go b/internal/update/errors_test.go new file mode 100644 index 00000000..6b3a8bca --- /dev/null +++ b/internal/update/errors_test.go @@ -0,0 +1,32 @@ +package update + +import ( + "errors" + "fmt" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestUpdateError(t *testing.T) { + t.Run("known error", func(t *testing.T) { + var err error = &UpdateError{ + Code: NoInternetConnectionCode, + Details: "no internet connection available", + } + assert.Equal(t, "no internet connection available", err.Error()) + assert.Equal(t, "no internet connection available", fmt.Sprintf("%s", err)) + assert.Equal(t, NoInternetConnectionCode, GetUpdateErrorCode(err)) + }) + + t.Run("unknown error", func(t *testing.T) { + var underlyingErr = errors.New("underlying error") + var updateErr error = NewUnkownError(underlyingErr) + + assert.Equal(t, "underlying error", updateErr.Error()) + assert.Equal(t, "underlying error", fmt.Sprintf("%s", updateErr)) + assert.Equal(t, underlyingErr, errors.Unwrap(updateErr)) + assert.True(t, errors.Is(updateErr, underlyingErr)) + assert.Equal(t, UnknownErrorCode, GetUpdateErrorCode(updateErr)) + }) +} diff --git a/internal/update/event.go b/internal/update/event.go index 0f6c1a51..2aac04ee 100644 --- a/internal/update/event.go +++ b/internal/update/event.go @@ -15,6 +15,8 @@ package update +import "go.bug.st/f" + // EventType defines the type of upgrade event. type EventType int @@ -29,8 +31,9 @@ const ( // Event represents a single event in the upgrade process. type Event struct { Type EventType - Data string - Err error // Optional error field for error events + + data string + err error // error field for error events } func (t EventType) String() string { @@ -50,6 +53,30 @@ func (t EventType) String() string { } } +func NewDataEvent(t EventType, data string) Event { + return Event{ + Type: t, + data: data, + } +} + +func NewErrorEvent(err error) Event { + return Event{ + Type: ErrorEvent, + err: err, + } +} + +func (e Event) GetData() string { + f.Assert(e.Type != ErrorEvent, "not a data event") + return e.data +} + +func (e Event) GetError() error { + f.Assert(e.Type == ErrorEvent, "not an error event") + return e.err +} + type PackageType string const ( diff --git a/internal/update/update.go b/internal/update/update.go index 7a254478..7e3bc99c 100644 --- a/internal/update/update.go +++ b/internal/update/update.go @@ -17,7 +17,6 @@ package update import ( "context" - "errors" "fmt" "log/slog" "net/http" @@ -28,8 +27,6 @@ import ( "golang.org/x/sync/errgroup" ) -var ErrOperationAlreadyInProgress = errors.New("an operation is already in progress") - var MatchArduinoPackage = func(p UpgradablePackage) bool { return strings.HasPrefix(p.Name, "arduino-") || (p.Name == "adbd" && strings.Contains(p.ToVersion, "arduino")) // NOTE: changing this check could remove the adbd package, breaking the device access. @@ -78,7 +75,7 @@ func (m *Manager) ListUpgradablePackages(ctx context.Context, matcher func(Upgra // Make sure to be connected to the internet, before checking for updates. // This is needed because the checks below work also when offline (using cached data). if !isConnected() { - return nil, errors.New("no internet connectivity") + return nil, ErrNoInternetConnection } // Get the list of upgradable packages from two sources (deb and platform) in parallel. @@ -141,12 +138,7 @@ func (m *Manager) UpgradePackages(ctx context.Context, pkgs []UpgradablePackage) // in the middle the upgrade of the cores. arduinoEvents, err := m.arduinoPlatformUpdateService.UpgradePackages(ctx, arduinoPlatform) if err != nil { - m.broadcast( - Event{ - Type: ErrorEvent, - Data: "failed to upgrade Arduino packages", - Err: err, - }) + m.broadcast(NewErrorEvent(fmt.Errorf("failed to upgrade Arduino packages: %w", err))) return } for e := range arduinoEvents { @@ -155,18 +147,14 @@ func (m *Manager) UpgradePackages(ctx context.Context, pkgs []UpgradablePackage) aptEvents, err := m.debUpdateService.UpgradePackages(ctx, debPkgs) if err != nil { - m.broadcast( - Event{ - Type: ErrorEvent, - Data: "failed to upgrade APT packages", - Err: err, - }) + m.broadcast(NewErrorEvent(fmt.Errorf("failed to upgrade APT packages: %w", err))) return } for e := range aptEvents { m.broadcast(e) } - m.broadcast(Event{Type: DoneEvent, Data: "Upgrade completed successfully"}) + + m.broadcast(NewDataEvent(DoneEvent, "Update completed")) }() return nil } @@ -175,17 +163,17 @@ func (m *Manager) UpgradePackages(ctx context.Context, pkgs []UpgradablePackage) func (b *Manager) Subscribe() chan Event { eventCh := make(chan Event, 100) b.mu.Lock() + defer b.mu.Unlock() b.subs[eventCh] = struct{}{} - b.mu.Unlock() return eventCh } // Unsubscribe removes the channel from the list of subscribers and closes it. func (b *Manager) Unsubscribe(eventCh chan Event) { b.mu.Lock() + defer b.mu.Unlock() delete(b.subs, eventCh) close(eventCh) - b.mu.Unlock() } func (b *Manager) broadcast(event Event) { @@ -201,8 +189,7 @@ func (b *Manager) broadcast(event Event) { default: slog.Warn("Discarding event (channel full)", slog.String("type", event.Type.String()), - slog.String("data", fmt.Sprintf("%v", event.Data)), - slog.Any("error", event.Err), + slog.Any("event", event), ) } } diff --git a/pkg/board/board.go b/pkg/board/board.go index 9669a3b3..b8a1ec1c 100644 --- a/pkg/board/board.go +++ b/pkg/board/board.go @@ -186,13 +186,14 @@ func FromFQBN(ctx context.Context, fqbn string) ([]Board, error) { switch port.GetPort().GetProtocol() { case SerialProtocol: serial := strings.ToLower(port.GetPort().GetHardwareId()) // in windows this is uppercase. - // TODO: we should store the board custom name in the product id so we can get it from the discovery service. var customName string if conn, err := adb.FromSerial(serial, ""); err == nil { if name, err := GetCustomName(ctx, conn); err == nil { customName = name } + } else { + slog.Warn("failed to get custom name", "serial", serial, "error", err) } boards = append(boards, Board{ @@ -211,10 +212,15 @@ func FromFQBN(ctx context.Context, fqbn string) ([]Board, error) { } customName = name[:idx] } + var serial string + if sn, ok := port.GetPort().GetProperties()["serial_number"]; ok { + serial = sn + } boards = append(boards, Board{ Protocol: NetworkProtocol, Address: port.GetPort().GetAddress(), + Serial: serial, BoardName: boardName, CustomName: customName, }) diff --git a/pkg/board/remote/adb/adb.go b/pkg/board/remote/adb/adb.go index 6efdb1f4..277aaad3 100644 --- a/pkg/board/remote/adb/adb.go +++ b/pkg/board/remote/adb/adb.go @@ -46,14 +46,50 @@ type ADBConnection struct { // Ensures ADBConnection implements the RemoteConn interface at compile time. var _ remote.RemoteConn = (*ADBConnection)(nil) +var ( + // ErrNotFound is returned when the ADB device is not found. + ErrNotFound = fmt.Errorf("ADB device not found") + // ErrDeviceOffline is returned when the ADB device is not reachable. + // This usually requires a restart of the adbd server daemon on the device. + ErrDeviceOffline = fmt.Errorf("ADB device is offline") +) + +// FromSerial creates an ADBConnection from a device serial number. +// returns an error NotFoundErr if the device is not found, and DeviceOfflineErr if the device is offline. func FromSerial(serial string, adbPath string) (*ADBConnection, error) { if adbPath == "" { adbPath = FindAdbPath() } + isConnected := func(serial, adbPath string) (bool, error) { + cmd, err := paths.NewProcess(nil, adbPath, "-s", serial, "get-state") + if err != nil { + return false, fmt.Errorf("failed to create ADB command: %w", err) + } + + output, err := cmd.RunAndCaptureCombinedOutput(context.TODO()) + if err != nil { + slog.Error("unable to connect to ADB device", "error", err, "output", string(output), "serial", serial) + if bytes.Contains(output, []byte("device offline")) { + return false, ErrDeviceOffline + } else if bytes.Contains(output, []byte("not found")) { + return false, ErrNotFound + } + return false, fmt.Errorf("failed to get ADB device state: %w: %s", err, output) + } + + return string(bytes.TrimSpace(output)) == "device", nil + } + + if connected, err := isConnected(serial, adbPath); err != nil { + return nil, err + } else if !connected { + return nil, fmt.Errorf("device %s is not connected", serial) + } + return &ADBConnection{ - host: serial, adbPath: adbPath, + host: serial, }, nil } @@ -65,8 +101,8 @@ func FromHost(host string, adbPath string) (*ADBConnection, error) { if err != nil { return nil, err } - if err := cmd.Run(); err != nil { - return nil, fmt.Errorf("failed to connect to ADB host %s: %w", host, err) + if out, err := cmd.RunAndCaptureCombinedOutput(context.TODO()); err != nil { + return nil, fmt.Errorf("failed to connect to ADB host %s: %w: %s", host, err, out) } return FromSerial(host, adbPath) } @@ -120,6 +156,7 @@ func (a *ADBConnection) List(path string) ([]remote.FileInfo, error) { if err := cmd.Start(); err != nil { return nil, err } + defer func() { _ = cmd.Wait() }() r := bufio.NewReader(output) _, err = r.ReadBytes('\n') // Skip the first line @@ -167,6 +204,7 @@ func (a *ADBConnection) Stats(p string) (remote.FileInfo, error) { if err := cmd.Start(); err != nil { return remote.FileInfo{}, err } + defer func() { _ = cmd.Wait() }() r := bufio.NewReader(output) line, err := r.ReadBytes('\n') @@ -227,6 +265,7 @@ func (a *ADBConnection) Remove(path string) error { type ADBCommand struct { cmd *paths.Process + err error } func (a *ADBConnection) GetCmd(cmd string, args ...string) remote.Cmder { @@ -243,19 +282,31 @@ func (a *ADBConnection) GetCmd(cmd string, args ...string) remote.Cmder { cmds = append(cmds, args...) } - command, _ := paths.NewProcess(nil, cmds...) - return &ADBCommand{cmd: command} + command, err := paths.NewProcess(nil, cmds...) + return &ADBCommand{cmd: command, err: err} } func (a *ADBCommand) Run(ctx context.Context) error { + if a.err != nil { + return fmt.Errorf("failed to create command: %w", a.err) + } + return a.cmd.RunWithinContext(ctx) } func (a *ADBCommand) Output(ctx context.Context) ([]byte, error) { + if a.err != nil { + return nil, fmt.Errorf("failed to create command: %w", a.err) + } + return a.cmd.RunAndCaptureCombinedOutput(ctx) } func (a *ADBCommand) Interactive() (io.WriteCloser, io.Reader, io.Reader, remote.Closer, error) { + if a.err != nil { + return nil, nil, nil, nil, fmt.Errorf("failed to create command: %w", a.err) + } + stdin, err := a.cmd.StdinPipe() if err != nil { return nil, nil, nil, nil, fmt.Errorf("failed to get stdin pipe: %w", err) diff --git a/pkg/board/remote/adb/adb_nowindows.go b/pkg/board/remote/adb/adb_nowindows.go index 32699417..e856b9e2 100644 --- a/pkg/board/remote/adb/adb_nowindows.go +++ b/pkg/board/remote/adb/adb_nowindows.go @@ -18,11 +18,14 @@ package adb import ( + "cmp" "context" "fmt" "io" "github.com/arduino/go-paths-helper" + + "github.com/arduino/arduino-app-cli/pkg/board/remote" ) func adbReadFile(a *ADBConnection, path string) (io.ReadCloser, error) { @@ -37,7 +40,14 @@ func adbReadFile(a *ADBConnection, path string) (io.ReadCloser, error) { if err := cmd.Start(); err != nil { return nil, err } - return output, nil + return remote.WithCloser{ + Reader: output, + CloseFun: func() error { + err1 := output.Close() + err2 := cmd.Wait() + return cmp.Or(err1, err2) + }, + }, nil } func adbWriteFile(a *ADBConnection, r io.Reader, pathStr string) error { diff --git a/pkg/board/remote/adb/adb_windows.go b/pkg/board/remote/adb/adb_windows.go index 26b752a5..150d9cc0 100644 --- a/pkg/board/remote/adb/adb_windows.go +++ b/pkg/board/remote/adb/adb_windows.go @@ -26,7 +26,7 @@ import ( "github.com/arduino/go-paths-helper" - "github.com/arduino/arduino-app-cli/pkg/board/remote/ssh" + "github.com/arduino/arduino-app-cli/pkg/board/remote" ) func adbReadFile(a *ADBConnection, path string) (io.ReadCloser, error) { @@ -44,7 +44,7 @@ func adbReadFile(a *ADBConnection, path string) (io.ReadCloser, error) { return nil, err } - return ssh.WithCloser{ + return remote.WithCloser{ Reader: decoded, CloseFun: func() error { err1 := output.Close() diff --git a/pkg/board/remote/remote.go b/pkg/board/remote/remote.go index 9330610a..247e7718 100644 --- a/pkg/board/remote/remote.go +++ b/pkg/board/remote/remote.go @@ -59,3 +59,17 @@ type Cmder interface { Output(ctx context.Context) ([]byte, error) Interactive() (io.WriteCloser, io.Reader, io.Reader, Closer, error) } + +// WithCloser is a helper to create an io.ReadCloser from an io.Reader +// and a close function. +type WithCloser struct { + io.Reader + CloseFun func() error +} + +func (w WithCloser) Close() error { + if w.CloseFun != nil { + return w.CloseFun() + } + return nil +} diff --git a/pkg/board/remote/ssh/ssh.go b/pkg/board/remote/ssh/ssh.go index cca231f5..9b14d8f4 100644 --- a/pkg/board/remote/ssh/ssh.go +++ b/pkg/board/remote/ssh/ssh.go @@ -219,18 +219,6 @@ func (a *SSHConnection) WriteFile(r io.Reader, path string) error { return nil } -type WithCloser struct { - io.Reader - CloseFun func() error -} - -func (w WithCloser) Close() error { - if w.CloseFun != nil { - return w.CloseFun() - } - return nil -} - func (a *SSHConnection) ReadFile(path string) (io.ReadCloser, error) { session, err := a.client.NewSession() if err != nil { @@ -247,7 +235,7 @@ func (a *SSHConnection) ReadFile(path string) (io.ReadCloser, error) { return nil, fmt.Errorf("failed to start command: %w", err) } - return WithCloser{ + return remote.WithCloser{ Reader: output, CloseFun: session.Close, }, nil