diff --git a/docs/conf.py b/docs/conf.py
index b8461f66a..54528133e 100755
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -7,7 +7,7 @@
# -- Project information -----------------------------------------------------
project = "Viam Python SDK"
-copyright = "2022-2023, Viam Inc"
+copyright = "2022-2024, Viam Inc"
author = "Viam Inc"
# -- General configuration ---------------------------------------------------
diff --git a/poetry.lock b/poetry.lock
index ef9e7c878..02f621a30 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -581,63 +581,63 @@ test = ["pytest"]
[[package]]
name = "coverage"
-version = "7.5.3"
+version = "7.5.4"
description = "Code coverage measurement for Python"
optional = false
python-versions = ">=3.8"
files = [
- {file = "coverage-7.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a6519d917abb15e12380406d721e37613e2a67d166f9fb7e5a8ce0375744cd45"},
- {file = "coverage-7.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aea7da970f1feccf48be7335f8b2ca64baf9b589d79e05b9397a06696ce1a1ec"},
- {file = "coverage-7.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:923b7b1c717bd0f0f92d862d1ff51d9b2b55dbbd133e05680204465f454bb286"},
- {file = "coverage-7.5.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62bda40da1e68898186f274f832ef3e759ce929da9a9fd9fcf265956de269dbc"},
- {file = "coverage-7.5.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8b7339180d00de83e930358223c617cc343dd08e1aa5ec7b06c3a121aec4e1d"},
- {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:25a5caf742c6195e08002d3b6c2dd6947e50efc5fc2c2205f61ecb47592d2d83"},
- {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:05ac5f60faa0c704c0f7e6a5cbfd6f02101ed05e0aee4d2822637a9e672c998d"},
- {file = "coverage-7.5.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:239a4e75e09c2b12ea478d28815acf83334d32e722e7433471fbf641c606344c"},
- {file = "coverage-7.5.3-cp310-cp310-win32.whl", hash = "sha256:a5812840d1d00eafae6585aba38021f90a705a25b8216ec7f66aebe5b619fb84"},
- {file = "coverage-7.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:33ca90a0eb29225f195e30684ba4a6db05dbef03c2ccd50b9077714c48153cac"},
- {file = "coverage-7.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f81bc26d609bf0fbc622c7122ba6307993c83c795d2d6f6f6fd8c000a770d974"},
- {file = "coverage-7.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7cec2af81f9e7569280822be68bd57e51b86d42e59ea30d10ebdbb22d2cb7232"},
- {file = "coverage-7.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55f689f846661e3f26efa535071775d0483388a1ccfab899df72924805e9e7cd"},
- {file = "coverage-7.5.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50084d3516aa263791198913a17354bd1dc627d3c1639209640b9cac3fef5807"},
- {file = "coverage-7.5.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:341dd8f61c26337c37988345ca5c8ccabeff33093a26953a1ac72e7d0103c4fb"},
- {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ab0b028165eea880af12f66086694768f2c3139b2c31ad5e032c8edbafca6ffc"},
- {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5bc5a8c87714b0c67cfeb4c7caa82b2d71e8864d1a46aa990b5588fa953673b8"},
- {file = "coverage-7.5.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:38a3b98dae8a7c9057bd91fbf3415c05e700a5114c5f1b5b0ea5f8f429ba6614"},
- {file = "coverage-7.5.3-cp311-cp311-win32.whl", hash = "sha256:fcf7d1d6f5da887ca04302db8e0e0cf56ce9a5e05f202720e49b3e8157ddb9a9"},
- {file = "coverage-7.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:8c836309931839cca658a78a888dab9676b5c988d0dd34ca247f5f3e679f4e7a"},
- {file = "coverage-7.5.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:296a7d9bbc598e8744c00f7a6cecf1da9b30ae9ad51c566291ff1314e6cbbed8"},
- {file = "coverage-7.5.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:34d6d21d8795a97b14d503dcaf74226ae51eb1f2bd41015d3ef332a24d0a17b3"},
- {file = "coverage-7.5.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e317953bb4c074c06c798a11dbdd2cf9979dbcaa8ccc0fa4701d80042d4ebf1"},
- {file = "coverage-7.5.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:705f3d7c2b098c40f5b81790a5fedb274113373d4d1a69e65f8b68b0cc26f6db"},
- {file = "coverage-7.5.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1196e13c45e327d6cd0b6e471530a1882f1017eb83c6229fc613cd1a11b53cd"},
- {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:015eddc5ccd5364dcb902eaecf9515636806fa1e0d5bef5769d06d0f31b54523"},
- {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fd27d8b49e574e50caa65196d908f80e4dff64d7e592d0c59788b45aad7e8b35"},
- {file = "coverage-7.5.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:33fc65740267222fc02975c061eb7167185fef4cc8f2770267ee8bf7d6a42f84"},
- {file = "coverage-7.5.3-cp312-cp312-win32.whl", hash = "sha256:7b2a19e13dfb5c8e145c7a6ea959485ee8e2204699903c88c7d25283584bfc08"},
- {file = "coverage-7.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:0bbddc54bbacfc09b3edaec644d4ac90c08ee8ed4844b0f86227dcda2d428fcb"},
- {file = "coverage-7.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f78300789a708ac1f17e134593f577407d52d0417305435b134805c4fb135adb"},
- {file = "coverage-7.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b368e1aee1b9b75757942d44d7598dcd22a9dbb126affcbba82d15917f0cc155"},
- {file = "coverage-7.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f836c174c3a7f639bded48ec913f348c4761cbf49de4a20a956d3431a7c9cb24"},
- {file = "coverage-7.5.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:244f509f126dc71369393ce5fea17c0592c40ee44e607b6d855e9c4ac57aac98"},
- {file = "coverage-7.5.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4c2872b3c91f9baa836147ca33650dc5c172e9273c808c3c3199c75490e709d"},
- {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:dd4b3355b01273a56b20c219e74e7549e14370b31a4ffe42706a8cda91f19f6d"},
- {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f542287b1489c7a860d43a7d8883e27ca62ab84ca53c965d11dac1d3a1fab7ce"},
- {file = "coverage-7.5.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:75e3f4e86804023e991096b29e147e635f5e2568f77883a1e6eed74512659ab0"},
- {file = "coverage-7.5.3-cp38-cp38-win32.whl", hash = "sha256:c59d2ad092dc0551d9f79d9d44d005c945ba95832a6798f98f9216ede3d5f485"},
- {file = "coverage-7.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:fa21a04112c59ad54f69d80e376f7f9d0f5f9123ab87ecd18fbb9ec3a2beed56"},
- {file = "coverage-7.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5102a92855d518b0996eb197772f5ac2a527c0ec617124ad5242a3af5e25f85"},
- {file = "coverage-7.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d1da0a2e3b37b745a2b2a678a4c796462cf753aebf94edcc87dcc6b8641eae31"},
- {file = "coverage-7.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8383a6c8cefba1b7cecc0149415046b6fc38836295bc4c84e820872eb5478b3d"},
- {file = "coverage-7.5.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9aad68c3f2566dfae84bf46295a79e79d904e1c21ccfc66de88cd446f8686341"},
- {file = "coverage-7.5.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e079c9ec772fedbade9d7ebc36202a1d9ef7291bc9b3a024ca395c4d52853d7"},
- {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bde997cac85fcac227b27d4fb2c7608a2c5f6558469b0eb704c5726ae49e1c52"},
- {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:990fb20b32990b2ce2c5f974c3e738c9358b2735bc05075d50a6f36721b8f303"},
- {file = "coverage-7.5.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3d5a67f0da401e105753d474369ab034c7bae51a4c31c77d94030d59e41df5bd"},
- {file = "coverage-7.5.3-cp39-cp39-win32.whl", hash = "sha256:e08c470c2eb01977d221fd87495b44867a56d4d594f43739a8028f8646a51e0d"},
- {file = "coverage-7.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:1d2a830ade66d3563bb61d1e3c77c8def97b30ed91e166c67d0632c018f380f0"},
- {file = "coverage-7.5.3-pp38.pp39.pp310-none-any.whl", hash = "sha256:3538d8fb1ee9bdd2e2692b3b18c22bb1c19ffbefd06880f5ac496e42d7bb3884"},
- {file = "coverage-7.5.3.tar.gz", hash = "sha256:04aefca5190d1dc7a53a4c1a5a7f8568811306d7a8ee231c42fb69215571944f"},
+ {file = "coverage-7.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99"},
+ {file = "coverage-7.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47"},
+ {file = "coverage-7.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e"},
+ {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d"},
+ {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3"},
+ {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016"},
+ {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136"},
+ {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9"},
+ {file = "coverage-7.5.4-cp310-cp310-win32.whl", hash = "sha256:7076b4b3a5f6d2b5d7f1185fde25b1e54eb66e647a1dfef0e2c2bfaf9b4c88c8"},
+ {file = "coverage-7.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:018a12985185038a5b2bcafab04ab833a9a0f2c59995b3cec07e10074c78635f"},
+ {file = "coverage-7.5.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db14f552ac38f10758ad14dd7b983dbab424e731588d300c7db25b6f89e335b5"},
+ {file = "coverage-7.5.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3257fdd8e574805f27bb5342b77bc65578e98cbc004a92232106344053f319ba"},
+ {file = "coverage-7.5.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a6612c99081d8d6134005b1354191e103ec9705d7ba2754e848211ac8cacc6b"},
+ {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d45d3cbd94159c468b9b8c5a556e3f6b81a8d1af2a92b77320e887c3e7a5d080"},
+ {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed550e7442f278af76d9d65af48069f1fb84c9f745ae249c1a183c1e9d1b025c"},
+ {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7a892be37ca35eb5019ec85402c3371b0f7cda5ab5056023a7f13da0961e60da"},
+ {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8192794d120167e2a64721d88dbd688584675e86e15d0569599257566dec9bf0"},
+ {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:820bc841faa502e727a48311948e0461132a9c8baa42f6b2b84a29ced24cc078"},
+ {file = "coverage-7.5.4-cp311-cp311-win32.whl", hash = "sha256:6aae5cce399a0f065da65c7bb1e8abd5c7a3043da9dceb429ebe1b289bc07806"},
+ {file = "coverage-7.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:d2e344d6adc8ef81c5a233d3a57b3c7d5181f40e79e05e1c143da143ccb6377d"},
+ {file = "coverage-7.5.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:54317c2b806354cbb2dc7ac27e2b93f97096912cc16b18289c5d4e44fc663233"},
+ {file = "coverage-7.5.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:042183de01f8b6d531e10c197f7f0315a61e8d805ab29c5f7b51a01d62782747"},
+ {file = "coverage-7.5.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6bb74ed465d5fb204b2ec41d79bcd28afccf817de721e8a807d5141c3426638"},
+ {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3d45ff86efb129c599a3b287ae2e44c1e281ae0f9a9bad0edc202179bcc3a2e"},
+ {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5013ed890dc917cef2c9f765c4c6a8ae9df983cd60dbb635df8ed9f4ebc9f555"},
+ {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1014fbf665fef86cdfd6cb5b7371496ce35e4d2a00cda501cf9f5b9e6fced69f"},
+ {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3684bc2ff328f935981847082ba4fdc950d58906a40eafa93510d1b54c08a66c"},
+ {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:581ea96f92bf71a5ec0974001f900db495488434a6928a2ca7f01eee20c23805"},
+ {file = "coverage-7.5.4-cp312-cp312-win32.whl", hash = "sha256:73ca8fbc5bc622e54627314c1a6f1dfdd8db69788f3443e752c215f29fa87a0b"},
+ {file = "coverage-7.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:cef4649ec906ea7ea5e9e796e68b987f83fa9a718514fe147f538cfeda76d7a7"},
+ {file = "coverage-7.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdd31315fc20868c194130de9ee6bfd99755cc9565edff98ecc12585b90be882"},
+ {file = "coverage-7.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:02ff6e898197cc1e9fa375581382b72498eb2e6d5fc0b53f03e496cfee3fac6d"},
+ {file = "coverage-7.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d05c16cf4b4c2fc880cb12ba4c9b526e9e5d5bb1d81313d4d732a5b9fe2b9d53"},
+ {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5986ee7ea0795a4095ac4d113cbb3448601efca7f158ec7f7087a6c705304e4"},
+ {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df54843b88901fdc2f598ac06737f03d71168fd1175728054c8f5a2739ac3e4"},
+ {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ab73b35e8d109bffbda9a3e91c64e29fe26e03e49addf5b43d85fc426dde11f9"},
+ {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:aea072a941b033813f5e4814541fc265a5c12ed9720daef11ca516aeacd3bd7f"},
+ {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:16852febd96acd953b0d55fc842ce2dac1710f26729b31c80b940b9afcd9896f"},
+ {file = "coverage-7.5.4-cp38-cp38-win32.whl", hash = "sha256:8f894208794b164e6bd4bba61fc98bf6b06be4d390cf2daacfa6eca0a6d2bb4f"},
+ {file = "coverage-7.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:e2afe743289273209c992075a5a4913e8d007d569a406ffed0bd080ea02b0633"},
+ {file = "coverage-7.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b95c3a8cb0463ba9f77383d0fa8c9194cf91f64445a63fc26fb2327e1e1eb088"},
+ {file = "coverage-7.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d7564cc09dd91b5a6001754a5b3c6ecc4aba6323baf33a12bd751036c998be4"},
+ {file = "coverage-7.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44da56a2589b684813f86d07597fdf8a9c6ce77f58976727329272f5a01f99f7"},
+ {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e16f3d6b491c48c5ae726308e6ab1e18ee830b4cdd6913f2d7f77354b33f91c8"},
+ {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbc5958cb471e5a5af41b0ddaea96a37e74ed289535e8deca404811f6cb0bc3d"},
+ {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a04e990a2a41740b02d6182b498ee9796cf60eefe40cf859b016650147908029"},
+ {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ddbd2f9713a79e8e7242d7c51f1929611e991d855f414ca9996c20e44a895f7c"},
+ {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b1ccf5e728ccf83acd313c89f07c22d70d6c375a9c6f339233dcf792094bcbf7"},
+ {file = "coverage-7.5.4-cp39-cp39-win32.whl", hash = "sha256:56b4eafa21c6c175b3ede004ca12c653a88b6f922494b023aeb1e836df953ace"},
+ {file = "coverage-7.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:65e528e2e921ba8fd67d9055e6b9f9e34b21ebd6768ae1c1723f4ea6ace1234d"},
+ {file = "coverage-7.5.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5"},
+ {file = "coverage-7.5.4.tar.gz", hash = "sha256:a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353"},
]
[package.extras]
@@ -645,33 +645,33 @@ toml = ["tomli"]
[[package]]
name = "debugpy"
-version = "1.8.1"
+version = "1.8.2"
description = "An implementation of the Debug Adapter Protocol for Python"
optional = false
python-versions = ">=3.8"
files = [
- {file = "debugpy-1.8.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:3bda0f1e943d386cc7a0e71bfa59f4137909e2ed947fb3946c506e113000f741"},
- {file = "debugpy-1.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dda73bf69ea479c8577a0448f8c707691152e6c4de7f0c4dec5a4bc11dee516e"},
- {file = "debugpy-1.8.1-cp310-cp310-win32.whl", hash = "sha256:3a79c6f62adef994b2dbe9fc2cc9cc3864a23575b6e387339ab739873bea53d0"},
- {file = "debugpy-1.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:7eb7bd2b56ea3bedb009616d9e2f64aab8fc7000d481faec3cd26c98a964bcdd"},
- {file = "debugpy-1.8.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:016a9fcfc2c6b57f939673c874310d8581d51a0fe0858e7fac4e240c5eb743cb"},
- {file = "debugpy-1.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd97ed11a4c7f6d042d320ce03d83b20c3fb40da892f994bc041bbc415d7a099"},
- {file = "debugpy-1.8.1-cp311-cp311-win32.whl", hash = "sha256:0de56aba8249c28a300bdb0672a9b94785074eb82eb672db66c8144fff673146"},
- {file = "debugpy-1.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:1a9fe0829c2b854757b4fd0a338d93bc17249a3bf69ecf765c61d4c522bb92a8"},
- {file = "debugpy-1.8.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3ebb70ba1a6524d19fa7bb122f44b74170c447d5746a503e36adc244a20ac539"},
- {file = "debugpy-1.8.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2e658a9630f27534e63922ebf655a6ab60c370f4d2fc5c02a5b19baf4410ace"},
- {file = "debugpy-1.8.1-cp312-cp312-win32.whl", hash = "sha256:caad2846e21188797a1f17fc09c31b84c7c3c23baf2516fed5b40b378515bbf0"},
- {file = "debugpy-1.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:edcc9f58ec0fd121a25bc950d4578df47428d72e1a0d66c07403b04eb93bcf98"},
- {file = "debugpy-1.8.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:7a3afa222f6fd3d9dfecd52729bc2e12c93e22a7491405a0ecbf9e1d32d45b39"},
- {file = "debugpy-1.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d915a18f0597ef685e88bb35e5d7ab968964b7befefe1aaea1eb5b2640b586c7"},
- {file = "debugpy-1.8.1-cp38-cp38-win32.whl", hash = "sha256:92116039b5500633cc8d44ecc187abe2dfa9b90f7a82bbf81d079fcdd506bae9"},
- {file = "debugpy-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:e38beb7992b5afd9d5244e96ad5fa9135e94993b0c551ceebf3fe1a5d9beb234"},
- {file = "debugpy-1.8.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:bfb20cb57486c8e4793d41996652e5a6a885b4d9175dd369045dad59eaacea42"},
- {file = "debugpy-1.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd3fdd3f67a7e576dd869c184c5dd71d9aaa36ded271939da352880c012e703"},
- {file = "debugpy-1.8.1-cp39-cp39-win32.whl", hash = "sha256:58911e8521ca0c785ac7a0539f1e77e0ce2df753f786188f382229278b4cdf23"},
- {file = "debugpy-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:6df9aa9599eb05ca179fb0b810282255202a66835c6efb1d112d21ecb830ddd3"},
- {file = "debugpy-1.8.1-py2.py3-none-any.whl", hash = "sha256:28acbe2241222b87e255260c76741e1fbf04fdc3b6d094fcf57b6c6f75ce1242"},
- {file = "debugpy-1.8.1.zip", hash = "sha256:f696d6be15be87aef621917585f9bb94b1dc9e8aced570db1b8a6fc14e8f9b42"},
+ {file = "debugpy-1.8.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7ee2e1afbf44b138c005e4380097d92532e1001580853a7cb40ed84e0ef1c3d2"},
+ {file = "debugpy-1.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f8c3f7c53130a070f0fc845a0f2cee8ed88d220d6b04595897b66605df1edd6"},
+ {file = "debugpy-1.8.2-cp310-cp310-win32.whl", hash = "sha256:f179af1e1bd4c88b0b9f0fa153569b24f6b6f3de33f94703336363ae62f4bf47"},
+ {file = "debugpy-1.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:0600faef1d0b8d0e85c816b8bb0cb90ed94fc611f308d5fde28cb8b3d2ff0fe3"},
+ {file = "debugpy-1.8.2-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:8a13417ccd5978a642e91fb79b871baded925d4fadd4dfafec1928196292aa0a"},
+ {file = "debugpy-1.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acdf39855f65c48ac9667b2801234fc64d46778021efac2de7e50907ab90c634"},
+ {file = "debugpy-1.8.2-cp311-cp311-win32.whl", hash = "sha256:2cbd4d9a2fc5e7f583ff9bf11f3b7d78dfda8401e8bb6856ad1ed190be4281ad"},
+ {file = "debugpy-1.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:d3408fddd76414034c02880e891ea434e9a9cf3a69842098ef92f6e809d09afa"},
+ {file = "debugpy-1.8.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:5d3ccd39e4021f2eb86b8d748a96c766058b39443c1f18b2dc52c10ac2757835"},
+ {file = "debugpy-1.8.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62658aefe289598680193ff655ff3940e2a601765259b123dc7f89c0239b8cd3"},
+ {file = "debugpy-1.8.2-cp312-cp312-win32.whl", hash = "sha256:bd11fe35d6fd3431f1546d94121322c0ac572e1bfb1f6be0e9b8655fb4ea941e"},
+ {file = "debugpy-1.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:15bc2f4b0f5e99bf86c162c91a74c0631dbd9cef3c6a1d1329c946586255e859"},
+ {file = "debugpy-1.8.2-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:5a019d4574afedc6ead1daa22736c530712465c0c4cd44f820d803d937531b2d"},
+ {file = "debugpy-1.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40f062d6877d2e45b112c0bbade9a17aac507445fd638922b1a5434df34aed02"},
+ {file = "debugpy-1.8.2-cp38-cp38-win32.whl", hash = "sha256:c78ba1680f1015c0ca7115671fe347b28b446081dada3fedf54138f44e4ba031"},
+ {file = "debugpy-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:cf327316ae0c0e7dd81eb92d24ba8b5e88bb4d1b585b5c0d32929274a66a5210"},
+ {file = "debugpy-1.8.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:1523bc551e28e15147815d1397afc150ac99dbd3a8e64641d53425dba57b0ff9"},
+ {file = "debugpy-1.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e24ccb0cd6f8bfaec68d577cb49e9c680621c336f347479b3fce060ba7c09ec1"},
+ {file = "debugpy-1.8.2-cp39-cp39-win32.whl", hash = "sha256:7f8d57a98c5a486c5c7824bc0b9f2f11189d08d73635c326abef268f83950326"},
+ {file = "debugpy-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:16c8dcab02617b75697a0a925a62943e26a0330da076e2a10437edd9f0bf3755"},
+ {file = "debugpy-1.8.2-py2.py3-none-any.whl", hash = "sha256:16e16df3a98a35c63c3ab1e4d19be4cbc7fdda92d9ddc059294f18910928e0ca"},
+ {file = "debugpy-1.8.2.zip", hash = "sha256:95378ed08ed2089221896b9b3a8d021e642c24edc8fef20e5d4342ca8be65c00"},
]
[[package]]
@@ -759,13 +759,13 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth
[[package]]
name = "fastjsonschema"
-version = "2.19.1"
+version = "2.20.0"
description = "Fastest Python implementation of JSON schema"
optional = false
python-versions = "*"
files = [
- {file = "fastjsonschema-2.19.1-py3-none-any.whl", hash = "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0"},
- {file = "fastjsonschema-2.19.1.tar.gz", hash = "sha256:e3126a94bdc4623d3de4485f8d468a12f02a67921315ddc87836d6e456dc789d"},
+ {file = "fastjsonschema-2.20.0-py3-none-any.whl", hash = "sha256:5875f0b0fa7a0043a91e93a9b8f793bcbbba9691e7fd83dca95c28ba26d21f0a"},
+ {file = "fastjsonschema-2.20.0.tar.gz", hash = "sha256:3d48fc5300ee96f5d116f10fe6f28d938e6008f59a6a025c2649475b87f76a23"},
]
[package.extras]
@@ -773,18 +773,18 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc
[[package]]
name = "filelock"
-version = "3.15.1"
+version = "3.15.4"
description = "A platform independent file lock."
optional = false
python-versions = ">=3.8"
files = [
- {file = "filelock-3.15.1-py3-none-any.whl", hash = "sha256:71b3102950e91dfc1bb4209b64be4dc8854f40e5f534428d8684f953ac847fac"},
- {file = "filelock-3.15.1.tar.gz", hash = "sha256:58a2549afdf9e02e10720eaa4d4470f56386d7a6f72edd7d0596337af8ed7ad8"},
+ {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"},
+ {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"},
]
[package.extras]
docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"]
-testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"]
+testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)", "virtualenv (>=20.26.2)"]
typing = ["typing-extensions (>=4.8)"]
[[package]]
@@ -816,17 +816,17 @@ files = [
[[package]]
name = "googleapis-common-protos"
-version = "1.63.1"
+version = "1.63.2"
description = "Common protobufs used in Google APIs"
optional = false
python-versions = ">=3.7"
files = [
- {file = "googleapis-common-protos-1.63.1.tar.gz", hash = "sha256:c6442f7a0a6b2a80369457d79e6672bb7dcbaab88e0848302497e3ec80780a6a"},
- {file = "googleapis_common_protos-1.63.1-py2.py3-none-any.whl", hash = "sha256:0e1c2cdfcbc354b76e4a211a35ea35d6926a835cba1377073c4861db904a1877"},
+ {file = "googleapis-common-protos-1.63.2.tar.gz", hash = "sha256:27c5abdffc4911f28101e635de1533fb4cfd2c37fbaa9174587c799fac90aa87"},
+ {file = "googleapis_common_protos-1.63.2-py2.py3-none-any.whl", hash = "sha256:27a2499c7e8aff199665b22741997e485eccc8645aa9176c7c988e6fae507945"},
]
[package.dependencies]
-protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0"
+protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0"
[package.extras]
grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"]
@@ -1036,22 +1036,22 @@ files = [
[[package]]
name = "importlib-metadata"
-version = "7.1.0"
+version = "8.0.0"
description = "Read metadata from Python packages"
optional = false
python-versions = ">=3.8"
files = [
- {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"},
- {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"},
+ {file = "importlib_metadata-8.0.0-py3-none-any.whl", hash = "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f"},
+ {file = "importlib_metadata-8.0.0.tar.gz", hash = "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812"},
]
[package.dependencies]
zipp = ">=0.5"
[package.extras]
-docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
+doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
perf = ["ipython"]
-testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"]
+test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"]
[[package]]
name = "importlib-resources"
@@ -1084,13 +1084,13 @@ files = [
[[package]]
name = "ipykernel"
-version = "6.29.4"
+version = "6.29.5"
description = "IPython Kernel for Jupyter"
optional = false
python-versions = ">=3.8"
files = [
- {file = "ipykernel-6.29.4-py3-none-any.whl", hash = "sha256:1181e653d95c6808039c509ef8e67c4126b3b3af7781496c7cbfb5ed938a27da"},
- {file = "ipykernel-6.29.4.tar.gz", hash = "sha256:3d44070060f9475ac2092b760123fadf105d2e2493c24848b6691a7c4f42af5c"},
+ {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"},
+ {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"},
]
[package.dependencies]
@@ -1545,13 +1545,13 @@ test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (>
[[package]]
name = "jupyterlab"
-version = "4.2.2"
+version = "4.2.3"
description = "JupyterLab computational environment"
optional = false
python-versions = ">=3.8"
files = [
- {file = "jupyterlab-4.2.2-py3-none-any.whl", hash = "sha256:59ee9b839f43308c3dfd55d72d1f1a299ed42a7f91f2d1afe9c12a783f9e525f"},
- {file = "jupyterlab-4.2.2.tar.gz", hash = "sha256:a534b6a25719a92a40d514fb133a9fe8f0d9981b0bbce5d8a5fcaa33344a3038"},
+ {file = "jupyterlab-4.2.3-py3-none-any.whl", hash = "sha256:0b59d11808e84bb84105c73364edfa867dd475492429ab34ea388a52f2e2e596"},
+ {file = "jupyterlab-4.2.3.tar.gz", hash = "sha256:df6e46969ea51d66815167f23d92f105423b7f1f06fa604d4f44aeb018c82c7b"},
]
[package.dependencies]
@@ -1984,13 +1984,13 @@ testing = ["beautifulsoup4", "coverage (>=6.4,<8.0)", "ipykernel (>=5.5,<6.0)",
[[package]]
name = "myst-nb"
-version = "1.1.0"
+version = "1.1.1"
description = "A Jupyter Notebook Sphinx reader built on top of the MyST markdown parser."
optional = false
python-versions = ">=3.9"
files = [
- {file = "myst_nb-1.1.0-py3-none-any.whl", hash = "sha256:0ac29b2a346f9a1257edbfb5d6c47d528728a37e6b9438903c2821f69fda9235"},
- {file = "myst_nb-1.1.0.tar.gz", hash = "sha256:9278840e844f5d780b5acc5400cbf63d97caaccf8eb442a55ebd9a03e2522d5e"},
+ {file = "myst_nb-1.1.1-py3-none-any.whl", hash = "sha256:8b8f9085287d948eef46cb3764aafc21915e0e981882b8c742719f5b1a84c36f"},
+ {file = "myst_nb-1.1.1.tar.gz", hash = "sha256:74227c11f76d03494f43b7788659b161b94f4dedef230a2912412bc8c3c9e553"},
]
[package.dependencies]
@@ -2390,84 +2390,95 @@ files = [
[[package]]
name = "pillow"
-version = "10.3.0"
+version = "10.4.0"
description = "Python Imaging Library (Fork)"
optional = false
python-versions = ">=3.8"
files = [
- {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"},
- {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"},
- {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"},
- {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"},
- {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"},
- {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"},
- {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"},
- {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"},
- {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"},
- {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"},
- {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"},
- {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"},
- {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"},
- {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"},
- {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"},
- {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"},
- {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"},
- {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"},
- {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"},
- {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"},
- {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"},
- {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"},
- {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"},
- {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"},
- {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"},
- {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"},
- {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"},
- {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"},
- {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"},
- {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"},
- {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"},
- {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"},
- {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"},
- {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"},
- {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"},
- {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"},
- {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"},
- {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"},
- {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"},
- {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"},
- {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"},
- {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"},
- {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"},
- {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"},
- {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"},
- {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"},
- {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"},
- {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"},
- {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"},
- {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"},
- {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"},
- {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"},
- {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"},
- {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"},
- {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"},
- {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"},
- {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"},
- {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"},
- {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"},
- {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"},
- {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"},
- {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"},
- {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"},
- {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"},
- {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"},
- {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"},
- {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"},
- {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"},
- {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"},
-]
-
-[package.extras]
-docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"]
+ {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"},
+ {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"},
+ {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"},
+ {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"},
+ {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"},
+ {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"},
+ {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"},
+ {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"},
+ {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"},
+ {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"},
+ {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"},
+ {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"},
+ {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"},
+ {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"},
+ {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"},
+ {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"},
+ {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"},
+ {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"},
+ {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"},
+ {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"},
+ {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"},
+ {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"},
+ {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"},
+ {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"},
+ {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"},
+ {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"},
+ {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"},
+ {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"},
+ {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"},
+ {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"},
+ {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"},
+ {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"},
+ {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"},
+ {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"},
+ {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"},
+ {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"},
+ {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"},
+ {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"},
+ {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"},
+ {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"},
+ {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"},
+ {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"},
+ {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"},
+ {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"},
+ {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"},
+ {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"},
+ {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"},
+ {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"},
+ {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"},
+ {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"},
+ {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"},
+ {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"},
+ {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"},
+ {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"},
+ {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"},
+ {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"},
+ {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"},
+ {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"},
+ {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"},
+ {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"},
+ {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"},
+ {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"},
+ {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"},
+ {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"},
+ {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"},
+ {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"},
+ {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"},
+ {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"},
+ {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"},
+ {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"},
+ {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"},
+ {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"},
+ {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"},
+ {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"},
+ {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"},
+ {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"},
+ {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"},
+ {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"},
+ {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"},
+ {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"},
+]
+
+[package.extras]
+docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"]
fpx = ["olefile"]
mic = ["olefile"]
tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"]
@@ -2585,27 +2596,28 @@ grpcio-tools = ["grpcio-tools (>=1.42.0,<2)"]
[[package]]
name = "psutil"
-version = "5.9.8"
+version = "6.0.0"
description = "Cross-platform lib for process and system monitoring in Python."
optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7"
files = [
- {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"},
- {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"},
- {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"},
- {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"},
- {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"},
- {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"},
- {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"},
- {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"},
- {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"},
- {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"},
- {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"},
- {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"},
- {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"},
- {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"},
- {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"},
- {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"},
+ {file = "psutil-6.0.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6"},
+ {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0"},
+ {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c"},
+ {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3"},
+ {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c"},
+ {file = "psutil-6.0.0-cp27-none-win32.whl", hash = "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35"},
+ {file = "psutil-6.0.0-cp27-none-win_amd64.whl", hash = "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1"},
+ {file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"},
+ {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0"},
+ {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd"},
+ {file = "psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132"},
+ {file = "psutil-6.0.0-cp36-cp36m-win32.whl", hash = "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14"},
+ {file = "psutil-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c"},
+ {file = "psutil-6.0.0-cp37-abi3-win32.whl", hash = "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d"},
+ {file = "psutil-6.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3"},
+ {file = "psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0"},
+ {file = "psutil-6.0.0.tar.gz", hash = "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2"},
]
[package.extras]
@@ -2685,32 +2697,32 @@ windows-terminal = ["colorama (>=0.4.6)"]
[[package]]
name = "pyproject-api"
-version = "1.6.1"
+version = "1.7.1"
description = "API to interact with the python pyproject.toml based projects"
optional = false
python-versions = ">=3.8"
files = [
- {file = "pyproject_api-1.6.1-py3-none-any.whl", hash = "sha256:4c0116d60476b0786c88692cf4e325a9814965e2469c5998b830bba16b183675"},
- {file = "pyproject_api-1.6.1.tar.gz", hash = "sha256:1817dc018adc0d1ff9ca1ed8c60e1623d5aaca40814b953af14a9cf9a5cae538"},
+ {file = "pyproject_api-1.7.1-py3-none-any.whl", hash = "sha256:2dc1654062c2b27733d8fd4cdda672b22fe8741ef1dde8e3a998a9547b071eeb"},
+ {file = "pyproject_api-1.7.1.tar.gz", hash = "sha256:7ebc6cd10710f89f4cf2a2731710a98abce37ebff19427116ff2174c9236a827"},
]
[package.dependencies]
-packaging = ">=23.1"
+packaging = ">=24.1"
tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""}
[package.extras]
-docs = ["furo (>=2023.8.19)", "sphinx (<7.2)", "sphinx-autodoc-typehints (>=1.24)"]
-testing = ["covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "setuptools (>=68.1.2)", "wheel (>=0.41.2)"]
+docs = ["furo (>=2024.5.6)", "sphinx-autodoc-typehints (>=2.2.1)"]
+testing = ["covdefaults (>=2.3)", "pytest (>=8.2.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "setuptools (>=70.1)"]
[[package]]
name = "pyright"
-version = "1.1.367"
+version = "1.1.370"
description = "Command line wrapper for pyright"
optional = false
python-versions = ">=3.7"
files = [
- {file = "pyright-1.1.367-py3-none-any.whl", hash = "sha256:89de6502ae02f1552d0c4df4b46867887a419849f379db617695ef9308cf01eb"},
- {file = "pyright-1.1.367.tar.gz", hash = "sha256:b1e5522ceb246ee6bc293a43d6d0162719d6467c1f1e9b81cee741aa11cdacbd"},
+ {file = "pyright-1.1.370-py3-none-any.whl", hash = "sha256:fc721601e480a69989775bfc210534a6ca0110ebd0c065244a8d3a151294fc61"},
+ {file = "pyright-1.1.370.tar.gz", hash = "sha256:d0d559d506fc41e3297f721aaa05a1b9f06beda5acc9ac64ca371ce94c28f960"},
]
[package.dependencies]
@@ -2760,6 +2772,23 @@ pytest = ">=7.0.0,<9"
docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"]
testing = ["coverage (>=6.2)", "hypothesis (>=5.7.1)"]
+[[package]]
+name = "pytest-mock"
+version = "3.14.0"
+description = "Thin-wrapper around the mock package for easier use with pytest"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"},
+ {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"},
+]
+
+[package.dependencies]
+pytest = ">=6.2.5"
+
+[package.extras]
+dev = ["pre-commit", "pytest-asyncio", "tox"]
+
[[package]]
name = "pytest-watcher"
version = "0.3.5"
@@ -2861,7 +2890,6 @@ files = [
{file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"},
{file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"},
{file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"},
- {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"},
{file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"},
{file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"},
{file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"},
@@ -2869,16 +2897,8 @@ files = [
{file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"},
{file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"},
{file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"},
- {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"},
{file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"},
{file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"},
- {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"},
- {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"},
- {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"},
- {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"},
- {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"},
- {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"},
- {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"},
{file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"},
{file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"},
{file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"},
@@ -2895,7 +2915,6 @@ files = [
{file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"},
{file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"},
{file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"},
- {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"},
{file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"},
{file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"},
{file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"},
@@ -2903,7 +2922,6 @@ files = [
{file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"},
{file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"},
{file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"},
- {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"},
{file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"},
{file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"},
{file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"},
@@ -3238,18 +3256,18 @@ win32 = ["pywin32"]
[[package]]
name = "setuptools"
-version = "70.0.0"
+version = "70.2.0"
description = "Easily download, build, install, upgrade, and uninstall Python packages"
optional = false
python-versions = ">=3.8"
files = [
- {file = "setuptools-70.0.0-py3-none-any.whl", hash = "sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4"},
- {file = "setuptools-70.0.0.tar.gz", hash = "sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0"},
+ {file = "setuptools-70.2.0-py3-none-any.whl", hash = "sha256:b8b8060bb426838fbe942479c90296ce976249451118ef566a5a0b7d8b78fb05"},
+ {file = "setuptools-70.2.0.tar.gz", hash = "sha256:bd63e505105011b25c3c11f753f7e3b8465ea739efddaccef8f0efac2137bac1"},
]
[package.extras]
-docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"]
-testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"]
+doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"]
+test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"]
[[package]]
name = "six"
@@ -3390,13 +3408,13 @@ go = ["sphinxcontrib-golangdomain"]
[[package]]
name = "sphinx-autoapi"
-version = "3.1.1"
+version = "3.1.2"
description = "Sphinx API documentation generator"
optional = false
python-versions = ">=3.8"
files = [
- {file = "sphinx_autoapi-3.1.1-py2.py3-none-any.whl", hash = "sha256:ff202754c38e119fe60b9336fb3cdbd0b78f8623753fa9151aed42a7052506b3"},
- {file = "sphinx_autoapi-3.1.1.tar.gz", hash = "sha256:b5f6e3c61cd86c0cdb7ee77a9d580c0fd116726c5b29cdcb1f1d5f30a5bca1bd"},
+ {file = "sphinx_autoapi-3.1.2-py2.py3-none-any.whl", hash = "sha256:8d672bd2baa8365ac844d3f52c0d3360aa492299131d3dea156a20a26f048d23"},
+ {file = "sphinx_autoapi-3.1.2.tar.gz", hash = "sha256:fa5eb188f67ae39e19b2e7d2527c75d064e0f0b9ac7f77a3558ec26ccb731c26"},
]
[package.dependencies]
@@ -3535,64 +3553,64 @@ test = ["pytest"]
[[package]]
name = "sqlalchemy"
-version = "2.0.30"
+version = "2.0.31"
description = "Database Abstraction Library"
optional = false
python-versions = ">=3.7"
files = [
- {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3b48154678e76445c7ded1896715ce05319f74b1e73cf82d4f8b59b46e9c0ddc"},
- {file = "SQLAlchemy-2.0.30-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2753743c2afd061bb95a61a51bbb6a1a11ac1c44292fad898f10c9839a7f75b2"},
- {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7bfc726d167f425d4c16269a9a10fe8630ff6d14b683d588044dcef2d0f6be7"},
- {file = "SQLAlchemy-2.0.30-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4f61ada6979223013d9ab83a3ed003ded6959eae37d0d685db2c147e9143797"},
- {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a365eda439b7a00732638f11072907c1bc8e351c7665e7e5da91b169af794af"},
- {file = "SQLAlchemy-2.0.30-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bba002a9447b291548e8d66fd8c96a6a7ed4f2def0bb155f4f0a1309fd2735d5"},
- {file = "SQLAlchemy-2.0.30-cp310-cp310-win32.whl", hash = "sha256:0138c5c16be3600923fa2169532205d18891b28afa817cb49b50e08f62198bb8"},
- {file = "SQLAlchemy-2.0.30-cp310-cp310-win_amd64.whl", hash = "sha256:99650e9f4cf3ad0d409fed3eec4f071fadd032e9a5edc7270cd646a26446feeb"},
- {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:955991a09f0992c68a499791a753523f50f71a6885531568404fa0f231832aa0"},
- {file = "SQLAlchemy-2.0.30-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f69e4c756ee2686767eb80f94c0125c8b0a0b87ede03eacc5c8ae3b54b99dc46"},
- {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69c9db1ce00e59e8dd09d7bae852a9add716efdc070a3e2068377e6ff0d6fdaa"},
- {file = "SQLAlchemy-2.0.30-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1429a4b0f709f19ff3b0cf13675b2b9bfa8a7e79990003207a011c0db880a13"},
- {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:efedba7e13aa9a6c8407c48facfdfa108a5a4128e35f4c68f20c3407e4376aa9"},
- {file = "SQLAlchemy-2.0.30-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16863e2b132b761891d6c49f0a0f70030e0bcac4fd208117f6b7e053e68668d0"},
- {file = "SQLAlchemy-2.0.30-cp311-cp311-win32.whl", hash = "sha256:2ecabd9ccaa6e914e3dbb2aa46b76dede7eadc8cbf1b8083c94d936bcd5ffb49"},
- {file = "SQLAlchemy-2.0.30-cp311-cp311-win_amd64.whl", hash = "sha256:0b3f4c438e37d22b83e640f825ef0f37b95db9aa2d68203f2c9549375d0b2260"},
- {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5a79d65395ac5e6b0c2890935bad892eabb911c4aa8e8015067ddb37eea3d56c"},
- {file = "SQLAlchemy-2.0.30-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9a5baf9267b752390252889f0c802ea13b52dfee5e369527da229189b8bd592e"},
- {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cb5a646930c5123f8461f6468901573f334c2c63c795b9af350063a736d0134"},
- {file = "SQLAlchemy-2.0.30-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:296230899df0b77dec4eb799bcea6fbe39a43707ce7bb166519c97b583cfcab3"},
- {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c62d401223f468eb4da32627bffc0c78ed516b03bb8a34a58be54d618b74d472"},
- {file = "SQLAlchemy-2.0.30-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3b69e934f0f2b677ec111b4d83f92dc1a3210a779f69bf905273192cf4ed433e"},
- {file = "SQLAlchemy-2.0.30-cp312-cp312-win32.whl", hash = "sha256:77d2edb1f54aff37e3318f611637171e8ec71472f1fdc7348b41dcb226f93d90"},
- {file = "SQLAlchemy-2.0.30-cp312-cp312-win_amd64.whl", hash = "sha256:b6c7ec2b1f4969fc19b65b7059ed00497e25f54069407a8701091beb69e591a5"},
- {file = "SQLAlchemy-2.0.30-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5a8e3b0a7e09e94be7510d1661339d6b52daf202ed2f5b1f9f48ea34ee6f2d57"},
- {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b60203c63e8f984df92035610c5fb76d941254cf5d19751faab7d33b21e5ddc0"},
- {file = "SQLAlchemy-2.0.30-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1dc3eabd8c0232ee8387fbe03e0a62220a6f089e278b1f0aaf5e2d6210741ad"},
- {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:40ad017c672c00b9b663fcfcd5f0864a0a97828e2ee7ab0c140dc84058d194cf"},
- {file = "SQLAlchemy-2.0.30-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e42203d8d20dc704604862977b1470a122e4892791fe3ed165f041e4bf447a1b"},
- {file = "SQLAlchemy-2.0.30-cp37-cp37m-win32.whl", hash = "sha256:2a4f4da89c74435f2bc61878cd08f3646b699e7d2eba97144030d1be44e27584"},
- {file = "SQLAlchemy-2.0.30-cp37-cp37m-win_amd64.whl", hash = "sha256:b6bf767d14b77f6a18b6982cbbf29d71bede087edae495d11ab358280f304d8e"},
- {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc0c53579650a891f9b83fa3cecd4e00218e071d0ba00c4890f5be0c34887ed3"},
- {file = "SQLAlchemy-2.0.30-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:311710f9a2ee235f1403537b10c7687214bb1f2b9ebb52702c5aa4a77f0b3af7"},
- {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:408f8b0e2c04677e9c93f40eef3ab22f550fecb3011b187f66a096395ff3d9fd"},
- {file = "SQLAlchemy-2.0.30-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37a4b4fb0dd4d2669070fb05b8b8824afd0af57587393015baee1cf9890242d9"},
- {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a943d297126c9230719c27fcbbeab57ecd5d15b0bd6bfd26e91bfcfe64220621"},
- {file = "SQLAlchemy-2.0.30-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0a089e218654e740a41388893e090d2e2c22c29028c9d1353feb38638820bbeb"},
- {file = "SQLAlchemy-2.0.30-cp38-cp38-win32.whl", hash = "sha256:fa561138a64f949f3e889eb9ab8c58e1504ab351d6cf55259dc4c248eaa19da6"},
- {file = "SQLAlchemy-2.0.30-cp38-cp38-win_amd64.whl", hash = "sha256:7d74336c65705b986d12a7e337ba27ab2b9d819993851b140efdf029248e818e"},
- {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae8c62fe2480dd61c532ccafdbce9b29dacc126fe8be0d9a927ca3e699b9491a"},
- {file = "SQLAlchemy-2.0.30-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2383146973a15435e4717f94c7509982770e3e54974c71f76500a0136f22810b"},
- {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8409de825f2c3b62ab15788635ccaec0c881c3f12a8af2b12ae4910a0a9aeef6"},
- {file = "SQLAlchemy-2.0.30-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0094c5dc698a5f78d3d1539853e8ecec02516b62b8223c970c86d44e7a80f6c7"},
- {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:edc16a50f5e1b7a06a2dcc1f2205b0b961074c123ed17ebda726f376a5ab0953"},
- {file = "SQLAlchemy-2.0.30-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f7703c2010355dd28f53deb644a05fc30f796bd8598b43f0ba678878780b6e4c"},
- {file = "SQLAlchemy-2.0.30-cp39-cp39-win32.whl", hash = "sha256:1f9a727312ff6ad5248a4367358e2cf7e625e98b1028b1d7ab7b806b7d757513"},
- {file = "SQLAlchemy-2.0.30-cp39-cp39-win_amd64.whl", hash = "sha256:a0ef36b28534f2a5771191be6edb44cc2673c7b2edf6deac6562400288664221"},
- {file = "SQLAlchemy-2.0.30-py3-none-any.whl", hash = "sha256:7108d569d3990c71e26a42f60474b4c02c8586c4681af5fd67e51a044fdea86a"},
- {file = "SQLAlchemy-2.0.30.tar.gz", hash = "sha256:2b1708916730f4830bc69d6f49d37f7698b5bd7530aca7f04f785f8849e95255"},
-]
-
-[package.dependencies]
-greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""}
+ {file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f2a213c1b699d3f5768a7272de720387ae0122f1becf0901ed6eaa1abd1baf6c"},
+ {file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9fea3d0884e82d1e33226935dac990b967bef21315cbcc894605db3441347443"},
+ {file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3ad7f221d8a69d32d197e5968d798217a4feebe30144986af71ada8c548e9fa"},
+ {file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2bee229715b6366f86a95d497c347c22ddffa2c7c96143b59a2aa5cc9eebbc"},
+ {file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cd5b94d4819c0c89280b7c6109c7b788a576084bf0a480ae17c227b0bc41e109"},
+ {file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:750900a471d39a7eeba57580b11983030517a1f512c2cb287d5ad0fcf3aebd58"},
+ {file = "SQLAlchemy-2.0.31-cp310-cp310-win32.whl", hash = "sha256:7bd112be780928c7f493c1a192cd8c5fc2a2a7b52b790bc5a84203fb4381c6be"},
+ {file = "SQLAlchemy-2.0.31-cp310-cp310-win_amd64.whl", hash = "sha256:5a48ac4d359f058474fadc2115f78a5cdac9988d4f99eae44917f36aa1476327"},
+ {file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f68470edd70c3ac3b6cd5c2a22a8daf18415203ca1b036aaeb9b0fb6f54e8298"},
+ {file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e2c38c2a4c5c634fe6c3c58a789712719fa1bf9b9d6ff5ebfce9a9e5b89c1ca"},
+ {file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd15026f77420eb2b324dcb93551ad9c5f22fab2c150c286ef1dc1160f110203"},
+ {file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2196208432deebdfe3b22185d46b08f00ac9d7b01284e168c212919891289396"},
+ {file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:352b2770097f41bff6029b280c0e03b217c2dcaddc40726f8f53ed58d8a85da4"},
+ {file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:56d51ae825d20d604583f82c9527d285e9e6d14f9a5516463d9705dab20c3740"},
+ {file = "SQLAlchemy-2.0.31-cp311-cp311-win32.whl", hash = "sha256:6e2622844551945db81c26a02f27d94145b561f9d4b0c39ce7bfd2fda5776dac"},
+ {file = "SQLAlchemy-2.0.31-cp311-cp311-win_amd64.whl", hash = "sha256:ccaf1b0c90435b6e430f5dd30a5aede4764942a695552eb3a4ab74ed63c5b8d3"},
+ {file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3b74570d99126992d4b0f91fb87c586a574a5872651185de8297c6f90055ae42"},
+ {file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f77c4f042ad493cb8595e2f503c7a4fe44cd7bd59c7582fd6d78d7e7b8ec52c"},
+ {file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd1591329333daf94467e699e11015d9c944f44c94d2091f4ac493ced0119449"},
+ {file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74afabeeff415e35525bf7a4ecdab015f00e06456166a2eba7590e49f8db940e"},
+ {file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b9c01990d9015df2c6f818aa8f4297d42ee71c9502026bb074e713d496e26b67"},
+ {file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:66f63278db425838b3c2b1c596654b31939427016ba030e951b292e32b99553e"},
+ {file = "SQLAlchemy-2.0.31-cp312-cp312-win32.whl", hash = "sha256:0b0f658414ee4e4b8cbcd4a9bb0fd743c5eeb81fc858ca517217a8013d282c96"},
+ {file = "SQLAlchemy-2.0.31-cp312-cp312-win_amd64.whl", hash = "sha256:fa4b1af3e619b5b0b435e333f3967612db06351217c58bfb50cee5f003db2a5a"},
+ {file = "SQLAlchemy-2.0.31-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f43e93057cf52a227eda401251c72b6fbe4756f35fa6bfebb5d73b86881e59b0"},
+ {file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d337bf94052856d1b330d5fcad44582a30c532a2463776e1651bd3294ee7e58b"},
+ {file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c06fb43a51ccdff3b4006aafee9fcf15f63f23c580675f7734245ceb6b6a9e05"},
+ {file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:b6e22630e89f0e8c12332b2b4c282cb01cf4da0d26795b7eae16702a608e7ca1"},
+ {file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:79a40771363c5e9f3a77f0e28b3302801db08040928146e6808b5b7a40749c88"},
+ {file = "SQLAlchemy-2.0.31-cp37-cp37m-win32.whl", hash = "sha256:501ff052229cb79dd4c49c402f6cb03b5a40ae4771efc8bb2bfac9f6c3d3508f"},
+ {file = "SQLAlchemy-2.0.31-cp37-cp37m-win_amd64.whl", hash = "sha256:597fec37c382a5442ffd471f66ce12d07d91b281fd474289356b1a0041bdf31d"},
+ {file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dc6d69f8829712a4fd799d2ac8d79bdeff651c2301b081fd5d3fe697bd5b4ab9"},
+ {file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:23b9fbb2f5dd9e630db70fbe47d963c7779e9c81830869bd7d137c2dc1ad05fb"},
+ {file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a21c97efcbb9f255d5c12a96ae14da873233597dfd00a3a0c4ce5b3e5e79704"},
+ {file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26a6a9837589c42b16693cf7bf836f5d42218f44d198f9343dd71d3164ceeeac"},
+ {file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc251477eae03c20fae8db9c1c23ea2ebc47331bcd73927cdcaecd02af98d3c3"},
+ {file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2fd17e3bb8058359fa61248c52c7b09a97cf3c820e54207a50af529876451808"},
+ {file = "SQLAlchemy-2.0.31-cp38-cp38-win32.whl", hash = "sha256:c76c81c52e1e08f12f4b6a07af2b96b9b15ea67ccdd40ae17019f1c373faa227"},
+ {file = "SQLAlchemy-2.0.31-cp38-cp38-win_amd64.whl", hash = "sha256:4b600e9a212ed59355813becbcf282cfda5c93678e15c25a0ef896b354423238"},
+ {file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b6cf796d9fcc9b37011d3f9936189b3c8074a02a4ed0c0fbbc126772c31a6d4"},
+ {file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78fe11dbe37d92667c2c6e74379f75746dc947ee505555a0197cfba9a6d4f1a4"},
+ {file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc47dc6185a83c8100b37acda27658fe4dbd33b7d5e7324111f6521008ab4fe"},
+ {file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a41514c1a779e2aa9a19f67aaadeb5cbddf0b2b508843fcd7bafdf4c6864005"},
+ {file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:afb6dde6c11ea4525318e279cd93c8734b795ac8bb5dda0eedd9ebaca7fa23f1"},
+ {file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3f9faef422cfbb8fd53716cd14ba95e2ef655400235c3dfad1b5f467ba179c8c"},
+ {file = "SQLAlchemy-2.0.31-cp39-cp39-win32.whl", hash = "sha256:fc6b14e8602f59c6ba893980bea96571dd0ed83d8ebb9c4479d9ed5425d562e9"},
+ {file = "SQLAlchemy-2.0.31-cp39-cp39-win_amd64.whl", hash = "sha256:3cb8a66b167b033ec72c3812ffc8441d4e9f5f78f5e31e54dcd4c90a4ca5bebc"},
+ {file = "SQLAlchemy-2.0.31-py3-none-any.whl", hash = "sha256:69f3e3c08867a8e4856e92d7afb618b95cdee18e0bc1647b77599722c9a28911"},
+ {file = "SQLAlchemy-2.0.31.tar.gz", hash = "sha256:b607489dd4a54de56984a0c7656247504bd5523d9d0ba799aef59d4add009484"},
+]
+
+[package.dependencies]
+greenlet = {version = "!=0.4.17", markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"}
typing-extensions = ">=4.6.0"
[package.extras]
@@ -3736,30 +3754,30 @@ files = [
[[package]]
name = "tox"
-version = "4.15.1"
+version = "4.16.0"
description = "tox is a generic virtualenv management and test command line tool"
optional = false
python-versions = ">=3.8"
files = [
- {file = "tox-4.15.1-py3-none-any.whl", hash = "sha256:f00a5dc4222b358e69694e47e3da0227ac41253509bca9f45aa8f012053e8d9d"},
- {file = "tox-4.15.1.tar.gz", hash = "sha256:53a092527d65e873e39213ebd4bd027a64623320b6b0326136384213f95b7076"},
+ {file = "tox-4.16.0-py3-none-any.whl", hash = "sha256:61e101061b977b46cf00093d4319438055290ad0009f84497a07bf2d2d7a06d0"},
+ {file = "tox-4.16.0.tar.gz", hash = "sha256:43499656f9949edb681c0f907f86fbfee98677af9919d8b11ae5ad77cb800748"},
]
[package.dependencies]
-cachetools = ">=5.3.2"
+cachetools = ">=5.3.3"
chardet = ">=5.2"
colorama = ">=0.4.6"
-filelock = ">=3.13.1"
-packaging = ">=23.2"
-platformdirs = ">=4.1"
-pluggy = ">=1.3"
-pyproject-api = ">=1.6.1"
+filelock = ">=3.15.4"
+packaging = ">=24.1"
+platformdirs = ">=4.2.2"
+pluggy = ">=1.5"
+pyproject-api = ">=1.7.1"
tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""}
-virtualenv = ">=20.25"
+virtualenv = ">=20.26.3"
[package.extras]
-docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-argparse-cli (>=1.11.1)", "sphinx-autodoc-typehints (>=1.25.2)", "sphinx-copybutton (>=0.5.2)", "sphinx-inline-tabs (>=2023.4.21)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.11)"]
-testing = ["build[virtualenv] (>=1.0.3)", "covdefaults (>=2.3)", "detect-test-pollution (>=1.2)", "devpi-process (>=1)", "diff-cover (>=8.0.2)", "distlib (>=0.3.8)", "flaky (>=3.7)", "hatch-vcs (>=0.4)", "hatchling (>=1.21)", "psutil (>=5.9.7)", "pytest (>=7.4.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-xdist (>=3.5)", "re-assert (>=1.1)", "time-machine (>=2.13)", "wheel (>=0.42)"]
+docs = ["furo (>=2024.5.6)", "sphinx (>=7.3.7)", "sphinx-argparse-cli (>=1.16)", "sphinx-autodoc-typehints (>=2.2.2)", "sphinx-copybutton (>=0.5.2)", "sphinx-inline-tabs (>=2023.4.21)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.11)"]
+testing = ["build[virtualenv] (>=1.2.1)", "covdefaults (>=2.3)", "detect-test-pollution (>=1.2)", "devpi-process (>=1)", "diff-cover (>=9.1)", "distlib (>=0.3.8)", "flaky (>=3.8.1)", "hatch-vcs (>=0.4)", "hatchling (>=1.25)", "psutil (>=6)", "pytest (>=8.2.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-xdist (>=3.6.1)", "re-assert (>=1.1)", "setuptools (>=70.2)", "time-machine (>=2.14.2)", "wheel (>=0.43)"]
[[package]]
name = "traitlets"
@@ -3789,13 +3807,13 @@ files = [
[[package]]
name = "types-protobuf"
-version = "5.26.0.20240422"
+version = "5.27.0.20240626"
description = "Typing stubs for protobuf"
optional = false
python-versions = ">=3.8"
files = [
- {file = "types-protobuf-5.26.0.20240422.tar.gz", hash = "sha256:e6074178109f97efe9f0b20a035ba61d7c3b03e867eb47d254d2b2ab6a805e36"},
- {file = "types_protobuf-5.26.0.20240422-py3-none-any.whl", hash = "sha256:e4dc2554d342501d5aebc3c71203868b51118340e105fc190e3a64ca1be43831"},
+ {file = "types-protobuf-5.27.0.20240626.tar.gz", hash = "sha256:683ba14043bade6785e3f937a7498f243b37881a91ac8d81b9202ecf8b191e9c"},
+ {file = "types_protobuf-5.27.0.20240626-py3-none-any.whl", hash = "sha256:688e8f7e8d9295db26bc560df01fb731b27a25b77cbe4c1ce945647f7024f5c1"},
]
[[package]]
@@ -3836,13 +3854,13 @@ dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake
[[package]]
name = "urllib3"
-version = "2.2.1"
+version = "2.2.2"
description = "HTTP library with thread-safe connection pooling, file post, and more."
optional = false
python-versions = ">=3.8"
files = [
- {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"},
- {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"},
+ {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"},
+ {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"},
]
[package.extras]
@@ -3853,13 +3871,13 @@ zstd = ["zstandard (>=0.18.0)"]
[[package]]
name = "virtualenv"
-version = "20.26.2"
+version = "20.26.3"
description = "Virtual Python Environment builder"
optional = false
python-versions = ">=3.7"
files = [
- {file = "virtualenv-20.26.2-py3-none-any.whl", hash = "sha256:a624db5e94f01ad993d476b9ee5346fdf7b9de43ccaee0e0197012dc838a0e9b"},
- {file = "virtualenv-20.26.2.tar.gz", hash = "sha256:82bf0f4eebbb78d36ddaee0283d43fe5736b53880b8a8cdcd37390a07ac3741c"},
+ {file = "virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589"},
+ {file = "virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a"},
]
[package.dependencies]
@@ -4014,4 +4032,4 @@ mlmodel = ["numpy"]
[metadata]
lock-version = "2.0"
python-versions = ">=3.8.1,<3.13"
-content-hash = "841a9e48df79fbac4288d5edf4b93d080cf69e1b056158bff8f9a79054af6540"
+content-hash = "aed2c42b49eae516ed1f0752247a8a455df634d10b55862e8f650edf986ca737"
diff --git a/pyproject.toml b/pyproject.toml
index 336195ddc..a28e921a0 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -15,7 +15,7 @@ include = ["LICENSE", "src/viam/rpc/libviam_rust_utils.*"]
grpclib = ">=0.4.7,<1"
googleapis-common-protos = ">=1.60.0,<2"
typing-extensions = ">=4.8.0,<5"
- protobuf = ">=4.24.3,<5"
+ protobuf = ">=4.24.3"
numpy = { version = ">=1.21,<2", optional = true }
[tool.poetry.group.dev.dependencies]
@@ -48,6 +48,7 @@ include = ["LICENSE", "src/viam/rpc/libviam_rust_utils.*"]
]
Pillow = ">=9.1.0,<11"
pyright = "^1.1.339"
+ pytest-mock = "^3.14.0"
[tool.poetry.extras]
mlmodel = ["numpy"]
diff --git a/src/viam/components/arm/arm.py b/src/viam/components/arm/arm.py
index d2a4357d4..41f170080 100644
--- a/src/viam/components/arm/arm.py
+++ b/src/viam/components/arm/arm.py
@@ -47,7 +47,7 @@ async def get_end_position(
pos = await my_arm.get_end_position()
Returns:
- Pose: A representation of the arm’s current position as a 6 DOF (six degrees of freedom) pose.
+ Pose: A representation of the arm's current position as a 6 DOF (six degrees of freedom) pose.
The ``Pose`` is composed of values for location and orientation with respect to the origin.
Location is expressed as distance, which is represented by x, y, and z coordinate values.
Orientation is expressed as an orientation vector, which is represented by o_x, o_y, o_z, and theta values.
diff --git a/src/viam/components/audio_input/service.py b/src/viam/components/audio_input/service.py
index 6d19242b9..41acd2257 100644
--- a/src/viam/components/audio_input/service.py
+++ b/src/viam/components/audio_input/service.py
@@ -2,7 +2,7 @@
from datetime import timedelta
from io import BytesIO
-from google.api.httpbody_pb2 import HttpBody
+from google.api.httpbody_pb2 import HttpBody # type: ignore
from grpclib import GRPCError, Status
from grpclib.server import Stream
diff --git a/src/viam/components/camera/service.py b/src/viam/components/camera/service.py
index 34bb6ba4f..568f85237 100644
--- a/src/viam/components/camera/service.py
+++ b/src/viam/components/camera/service.py
@@ -1,6 +1,6 @@
# TODO: Update type checking based with RSDK-4089
# pyright: reportGeneralTypeIssues=false
-from google.api.httpbody_pb2 import HttpBody
+from google.api.httpbody_pb2 import HttpBody # type: ignore
from grpclib.server import Stream
from viam.proto.common import DoCommandRequest, DoCommandResponse, GetGeometriesRequest, GetGeometriesResponse
diff --git a/src/viam/gen/app/data/v1/data_pb2.pyi b/src/viam/gen/app/data/v1/data_pb2.pyi
index 953e24beb..f62fcec71 100644
--- a/src/viam/gen/app/data/v1/data_pb2.pyi
+++ b/src/viam/gen/app/data/v1/data_pb2.pyi
@@ -642,9 +642,12 @@ global___BinaryMetadata = BinaryMetadata
@typing.final
class DeleteTabularDataRequest(google.protobuf.message.Message):
- """DeleteTabularDataRequest deletes the data from the organization that is older than `delete_older_than_days`.
- For example if `delete_older_than_days` is 10, this deletes any data that was captured up to 10 days ago.
- If it is 0, all existing data is deleted.
+ """DeleteTabularDataRequest deletes the data from the organization that is older than `delete_older_than_days`
+ in UTC time. For example, if delete_older_than_days=1 and the request is made at 1AM EST on March 11
+ (March 11 5AM UTC), this deletes all data captured through March 10 11:59:59PM UTC.
+ If the request is at 10PM EST on March 11 (March 12 2AM UTC), this deletes all data captured
+ through March 11 11:59:59PM UTC.
+ If delete_older_than_days is 0, all existing data is deleted.
"""
DESCRIPTOR: google.protobuf.descriptor.Descriptor
ORGANIZATION_ID_FIELD_NUMBER: builtins.int
diff --git a/src/viam/gen/app/v1/app_grpc.py b/src/viam/gen/app/v1/app_grpc.py
index 97aa23239..4f2045b07 100644
--- a/src/viam/gen/app/v1/app_grpc.py
+++ b/src/viam/gen/app/v1/app_grpc.py
@@ -209,6 +209,10 @@ async def UpdateFragment(self, stream: 'grpclib.server.Stream[app.v1.app_pb2.Upd
async def DeleteFragment(self, stream: 'grpclib.server.Stream[app.v1.app_pb2.DeleteFragmentRequest, app.v1.app_pb2.DeleteFragmentResponse]') -> None:
pass
+ @abc.abstractmethod
+ async def GetFragmentHistory(self, stream: 'grpclib.server.Stream[app.v1.app_pb2.GetFragmentHistoryRequest, app.v1.app_pb2.GetFragmentHistoryResponse]') -> None:
+ pass
+
@abc.abstractmethod
async def AddRole(self, stream: 'grpclib.server.Stream[app.v1.app_pb2.AddRoleRequest, app.v1.app_pb2.AddRoleResponse]') -> None:
pass
@@ -298,7 +302,7 @@ async def CreateKeyFromExistingKeyAuthorizations(self, stream: 'grpclib.server.S
pass
def __mapping__(self) -> typing.Dict[str, grpclib.const.Handler]:
- return {'/viam.app.v1.AppService/GetUserIDByEmail': grpclib.const.Handler(self.GetUserIDByEmail, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetUserIDByEmailRequest, app.v1.app_pb2.GetUserIDByEmailResponse), '/viam.app.v1.AppService/CreateOrganization': grpclib.const.Handler(self.CreateOrganization, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.CreateOrganizationRequest, app.v1.app_pb2.CreateOrganizationResponse), '/viam.app.v1.AppService/ListOrganizations': grpclib.const.Handler(self.ListOrganizations, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.ListOrganizationsRequest, app.v1.app_pb2.ListOrganizationsResponse), '/viam.app.v1.AppService/GetOrganizationsWithAccessToLocation': grpclib.const.Handler(self.GetOrganizationsWithAccessToLocation, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetOrganizationsWithAccessToLocationRequest, app.v1.app_pb2.GetOrganizationsWithAccessToLocationResponse), '/viam.app.v1.AppService/ListOrganizationsByUser': grpclib.const.Handler(self.ListOrganizationsByUser, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.ListOrganizationsByUserRequest, app.v1.app_pb2.ListOrganizationsByUserResponse), '/viam.app.v1.AppService/GetOrganization': grpclib.const.Handler(self.GetOrganization, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetOrganizationRequest, app.v1.app_pb2.GetOrganizationResponse), '/viam.app.v1.AppService/GetOrganizationNamespaceAvailability': grpclib.const.Handler(self.GetOrganizationNamespaceAvailability, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetOrganizationNamespaceAvailabilityRequest, app.v1.app_pb2.GetOrganizationNamespaceAvailabilityResponse), '/viam.app.v1.AppService/UpdateOrganization': grpclib.const.Handler(self.UpdateOrganization, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.UpdateOrganizationRequest, app.v1.app_pb2.UpdateOrganizationResponse), '/viam.app.v1.AppService/DeleteOrganization': grpclib.const.Handler(self.DeleteOrganization, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.DeleteOrganizationRequest, app.v1.app_pb2.DeleteOrganizationResponse), '/viam.app.v1.AppService/ListOrganizationMembers': grpclib.const.Handler(self.ListOrganizationMembers, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.ListOrganizationMembersRequest, app.v1.app_pb2.ListOrganizationMembersResponse), '/viam.app.v1.AppService/CreateOrganizationInvite': grpclib.const.Handler(self.CreateOrganizationInvite, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.CreateOrganizationInviteRequest, app.v1.app_pb2.CreateOrganizationInviteResponse), '/viam.app.v1.AppService/UpdateOrganizationInviteAuthorizations': grpclib.const.Handler(self.UpdateOrganizationInviteAuthorizations, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.UpdateOrganizationInviteAuthorizationsRequest, app.v1.app_pb2.UpdateOrganizationInviteAuthorizationsResponse), '/viam.app.v1.AppService/DeleteOrganizationMember': grpclib.const.Handler(self.DeleteOrganizationMember, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.DeleteOrganizationMemberRequest, app.v1.app_pb2.DeleteOrganizationMemberResponse), '/viam.app.v1.AppService/DeleteOrganizationInvite': grpclib.const.Handler(self.DeleteOrganizationInvite, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.DeleteOrganizationInviteRequest, app.v1.app_pb2.DeleteOrganizationInviteResponse), '/viam.app.v1.AppService/ResendOrganizationInvite': grpclib.const.Handler(self.ResendOrganizationInvite, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.ResendOrganizationInviteRequest, app.v1.app_pb2.ResendOrganizationInviteResponse), '/viam.app.v1.AppService/CreateLocation': grpclib.const.Handler(self.CreateLocation, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.CreateLocationRequest, app.v1.app_pb2.CreateLocationResponse), '/viam.app.v1.AppService/GetLocation': grpclib.const.Handler(self.GetLocation, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetLocationRequest, app.v1.app_pb2.GetLocationResponse), '/viam.app.v1.AppService/UpdateLocation': grpclib.const.Handler(self.UpdateLocation, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.UpdateLocationRequest, app.v1.app_pb2.UpdateLocationResponse), '/viam.app.v1.AppService/DeleteLocation': grpclib.const.Handler(self.DeleteLocation, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.DeleteLocationRequest, app.v1.app_pb2.DeleteLocationResponse), '/viam.app.v1.AppService/ListLocations': grpclib.const.Handler(self.ListLocations, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.ListLocationsRequest, app.v1.app_pb2.ListLocationsResponse), '/viam.app.v1.AppService/ShareLocation': grpclib.const.Handler(self.ShareLocation, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.ShareLocationRequest, app.v1.app_pb2.ShareLocationResponse), '/viam.app.v1.AppService/UnshareLocation': grpclib.const.Handler(self.UnshareLocation, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.UnshareLocationRequest, app.v1.app_pb2.UnshareLocationResponse), '/viam.app.v1.AppService/LocationAuth': grpclib.const.Handler(self.LocationAuth, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.LocationAuthRequest, app.v1.app_pb2.LocationAuthResponse), '/viam.app.v1.AppService/CreateLocationSecret': grpclib.const.Handler(self.CreateLocationSecret, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.CreateLocationSecretRequest, app.v1.app_pb2.CreateLocationSecretResponse), '/viam.app.v1.AppService/DeleteLocationSecret': grpclib.const.Handler(self.DeleteLocationSecret, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.DeleteLocationSecretRequest, app.v1.app_pb2.DeleteLocationSecretResponse), '/viam.app.v1.AppService/GetRobot': grpclib.const.Handler(self.GetRobot, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetRobotRequest, app.v1.app_pb2.GetRobotResponse), '/viam.app.v1.AppService/GetRoverRentalRobots': grpclib.const.Handler(self.GetRoverRentalRobots, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetRoverRentalRobotsRequest, app.v1.app_pb2.GetRoverRentalRobotsResponse), '/viam.app.v1.AppService/GetRobotParts': grpclib.const.Handler(self.GetRobotParts, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetRobotPartsRequest, app.v1.app_pb2.GetRobotPartsResponse), '/viam.app.v1.AppService/GetRobotPart': grpclib.const.Handler(self.GetRobotPart, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetRobotPartRequest, app.v1.app_pb2.GetRobotPartResponse), '/viam.app.v1.AppService/GetRobotPartLogs': grpclib.const.Handler(self.GetRobotPartLogs, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetRobotPartLogsRequest, app.v1.app_pb2.GetRobotPartLogsResponse), '/viam.app.v1.AppService/TailRobotPartLogs': grpclib.const.Handler(self.TailRobotPartLogs, grpclib.const.Cardinality.UNARY_STREAM, app.v1.app_pb2.TailRobotPartLogsRequest, app.v1.app_pb2.TailRobotPartLogsResponse), '/viam.app.v1.AppService/GetRobotPartHistory': grpclib.const.Handler(self.GetRobotPartHistory, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetRobotPartHistoryRequest, app.v1.app_pb2.GetRobotPartHistoryResponse), '/viam.app.v1.AppService/UpdateRobotPart': grpclib.const.Handler(self.UpdateRobotPart, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.UpdateRobotPartRequest, app.v1.app_pb2.UpdateRobotPartResponse), '/viam.app.v1.AppService/NewRobotPart': grpclib.const.Handler(self.NewRobotPart, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.NewRobotPartRequest, app.v1.app_pb2.NewRobotPartResponse), '/viam.app.v1.AppService/DeleteRobotPart': grpclib.const.Handler(self.DeleteRobotPart, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.DeleteRobotPartRequest, app.v1.app_pb2.DeleteRobotPartResponse), '/viam.app.v1.AppService/GetRobotAPIKeys': grpclib.const.Handler(self.GetRobotAPIKeys, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetRobotAPIKeysRequest, app.v1.app_pb2.GetRobotAPIKeysResponse), '/viam.app.v1.AppService/MarkPartAsMain': grpclib.const.Handler(self.MarkPartAsMain, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.MarkPartAsMainRequest, app.v1.app_pb2.MarkPartAsMainResponse), '/viam.app.v1.AppService/MarkPartForRestart': grpclib.const.Handler(self.MarkPartForRestart, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.MarkPartForRestartRequest, app.v1.app_pb2.MarkPartForRestartResponse), '/viam.app.v1.AppService/CreateRobotPartSecret': grpclib.const.Handler(self.CreateRobotPartSecret, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.CreateRobotPartSecretRequest, app.v1.app_pb2.CreateRobotPartSecretResponse), '/viam.app.v1.AppService/DeleteRobotPartSecret': grpclib.const.Handler(self.DeleteRobotPartSecret, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.DeleteRobotPartSecretRequest, app.v1.app_pb2.DeleteRobotPartSecretResponse), '/viam.app.v1.AppService/ListRobots': grpclib.const.Handler(self.ListRobots, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.ListRobotsRequest, app.v1.app_pb2.ListRobotsResponse), '/viam.app.v1.AppService/NewRobot': grpclib.const.Handler(self.NewRobot, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.NewRobotRequest, app.v1.app_pb2.NewRobotResponse), '/viam.app.v1.AppService/UpdateRobot': grpclib.const.Handler(self.UpdateRobot, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.UpdateRobotRequest, app.v1.app_pb2.UpdateRobotResponse), '/viam.app.v1.AppService/DeleteRobot': grpclib.const.Handler(self.DeleteRobot, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.DeleteRobotRequest, app.v1.app_pb2.DeleteRobotResponse), '/viam.app.v1.AppService/ListFragments': grpclib.const.Handler(self.ListFragments, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.ListFragmentsRequest, app.v1.app_pb2.ListFragmentsResponse), '/viam.app.v1.AppService/GetFragment': grpclib.const.Handler(self.GetFragment, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetFragmentRequest, app.v1.app_pb2.GetFragmentResponse), '/viam.app.v1.AppService/CreateFragment': grpclib.const.Handler(self.CreateFragment, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.CreateFragmentRequest, app.v1.app_pb2.CreateFragmentResponse), '/viam.app.v1.AppService/UpdateFragment': grpclib.const.Handler(self.UpdateFragment, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.UpdateFragmentRequest, app.v1.app_pb2.UpdateFragmentResponse), '/viam.app.v1.AppService/DeleteFragment': grpclib.const.Handler(self.DeleteFragment, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.DeleteFragmentRequest, app.v1.app_pb2.DeleteFragmentResponse), '/viam.app.v1.AppService/AddRole': grpclib.const.Handler(self.AddRole, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.AddRoleRequest, app.v1.app_pb2.AddRoleResponse), '/viam.app.v1.AppService/RemoveRole': grpclib.const.Handler(self.RemoveRole, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.RemoveRoleRequest, app.v1.app_pb2.RemoveRoleResponse), '/viam.app.v1.AppService/ChangeRole': grpclib.const.Handler(self.ChangeRole, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.ChangeRoleRequest, app.v1.app_pb2.ChangeRoleResponse), '/viam.app.v1.AppService/ListAuthorizations': grpclib.const.Handler(self.ListAuthorizations, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.ListAuthorizationsRequest, app.v1.app_pb2.ListAuthorizationsResponse), '/viam.app.v1.AppService/CheckPermissions': grpclib.const.Handler(self.CheckPermissions, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.CheckPermissionsRequest, app.v1.app_pb2.CheckPermissionsResponse), '/viam.app.v1.AppService/GetRegistryItem': grpclib.const.Handler(self.GetRegistryItem, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetRegistryItemRequest, app.v1.app_pb2.GetRegistryItemResponse), '/viam.app.v1.AppService/CreateRegistryItem': grpclib.const.Handler(self.CreateRegistryItem, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.CreateRegistryItemRequest, app.v1.app_pb2.CreateRegistryItemResponse), '/viam.app.v1.AppService/UpdateRegistryItem': grpclib.const.Handler(self.UpdateRegistryItem, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.UpdateRegistryItemRequest, app.v1.app_pb2.UpdateRegistryItemResponse), '/viam.app.v1.AppService/ListRegistryItems': grpclib.const.Handler(self.ListRegistryItems, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.ListRegistryItemsRequest, app.v1.app_pb2.ListRegistryItemsResponse), '/viam.app.v1.AppService/DeleteRegistryItem': grpclib.const.Handler(self.DeleteRegistryItem, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.DeleteRegistryItemRequest, app.v1.app_pb2.DeleteRegistryItemResponse), '/viam.app.v1.AppService/TransferRegistryItem': grpclib.const.Handler(self.TransferRegistryItem, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.TransferRegistryItemRequest, app.v1.app_pb2.TransferRegistryItemResponse), '/viam.app.v1.AppService/CreateModule': grpclib.const.Handler(self.CreateModule, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.CreateModuleRequest, app.v1.app_pb2.CreateModuleResponse), '/viam.app.v1.AppService/UpdateModule': grpclib.const.Handler(self.UpdateModule, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.UpdateModuleRequest, app.v1.app_pb2.UpdateModuleResponse), '/viam.app.v1.AppService/UploadModuleFile': grpclib.const.Handler(self.UploadModuleFile, grpclib.const.Cardinality.STREAM_UNARY, app.v1.app_pb2.UploadModuleFileRequest, app.v1.app_pb2.UploadModuleFileResponse), '/viam.app.v1.AppService/GetModule': grpclib.const.Handler(self.GetModule, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetModuleRequest, app.v1.app_pb2.GetModuleResponse), '/viam.app.v1.AppService/ListModules': grpclib.const.Handler(self.ListModules, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.ListModulesRequest, app.v1.app_pb2.ListModulesResponse), '/viam.app.v1.AppService/CreateKey': grpclib.const.Handler(self.CreateKey, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.CreateKeyRequest, app.v1.app_pb2.CreateKeyResponse), '/viam.app.v1.AppService/DeleteKey': grpclib.const.Handler(self.DeleteKey, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.DeleteKeyRequest, app.v1.app_pb2.DeleteKeyResponse), '/viam.app.v1.AppService/ListKeys': grpclib.const.Handler(self.ListKeys, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.ListKeysRequest, app.v1.app_pb2.ListKeysResponse), '/viam.app.v1.AppService/RenameKey': grpclib.const.Handler(self.RenameKey, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.RenameKeyRequest, app.v1.app_pb2.RenameKeyResponse), '/viam.app.v1.AppService/RotateKey': grpclib.const.Handler(self.RotateKey, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.RotateKeyRequest, app.v1.app_pb2.RotateKeyResponse), '/viam.app.v1.AppService/CreateKeyFromExistingKeyAuthorizations': grpclib.const.Handler(self.CreateKeyFromExistingKeyAuthorizations, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.CreateKeyFromExistingKeyAuthorizationsRequest, app.v1.app_pb2.CreateKeyFromExistingKeyAuthorizationsResponse)}
+ return {'/viam.app.v1.AppService/GetUserIDByEmail': grpclib.const.Handler(self.GetUserIDByEmail, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetUserIDByEmailRequest, app.v1.app_pb2.GetUserIDByEmailResponse), '/viam.app.v1.AppService/CreateOrganization': grpclib.const.Handler(self.CreateOrganization, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.CreateOrganizationRequest, app.v1.app_pb2.CreateOrganizationResponse), '/viam.app.v1.AppService/ListOrganizations': grpclib.const.Handler(self.ListOrganizations, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.ListOrganizationsRequest, app.v1.app_pb2.ListOrganizationsResponse), '/viam.app.v1.AppService/GetOrganizationsWithAccessToLocation': grpclib.const.Handler(self.GetOrganizationsWithAccessToLocation, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetOrganizationsWithAccessToLocationRequest, app.v1.app_pb2.GetOrganizationsWithAccessToLocationResponse), '/viam.app.v1.AppService/ListOrganizationsByUser': grpclib.const.Handler(self.ListOrganizationsByUser, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.ListOrganizationsByUserRequest, app.v1.app_pb2.ListOrganizationsByUserResponse), '/viam.app.v1.AppService/GetOrganization': grpclib.const.Handler(self.GetOrganization, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetOrganizationRequest, app.v1.app_pb2.GetOrganizationResponse), '/viam.app.v1.AppService/GetOrganizationNamespaceAvailability': grpclib.const.Handler(self.GetOrganizationNamespaceAvailability, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetOrganizationNamespaceAvailabilityRequest, app.v1.app_pb2.GetOrganizationNamespaceAvailabilityResponse), '/viam.app.v1.AppService/UpdateOrganization': grpclib.const.Handler(self.UpdateOrganization, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.UpdateOrganizationRequest, app.v1.app_pb2.UpdateOrganizationResponse), '/viam.app.v1.AppService/DeleteOrganization': grpclib.const.Handler(self.DeleteOrganization, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.DeleteOrganizationRequest, app.v1.app_pb2.DeleteOrganizationResponse), '/viam.app.v1.AppService/ListOrganizationMembers': grpclib.const.Handler(self.ListOrganizationMembers, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.ListOrganizationMembersRequest, app.v1.app_pb2.ListOrganizationMembersResponse), '/viam.app.v1.AppService/CreateOrganizationInvite': grpclib.const.Handler(self.CreateOrganizationInvite, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.CreateOrganizationInviteRequest, app.v1.app_pb2.CreateOrganizationInviteResponse), '/viam.app.v1.AppService/UpdateOrganizationInviteAuthorizations': grpclib.const.Handler(self.UpdateOrganizationInviteAuthorizations, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.UpdateOrganizationInviteAuthorizationsRequest, app.v1.app_pb2.UpdateOrganizationInviteAuthorizationsResponse), '/viam.app.v1.AppService/DeleteOrganizationMember': grpclib.const.Handler(self.DeleteOrganizationMember, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.DeleteOrganizationMemberRequest, app.v1.app_pb2.DeleteOrganizationMemberResponse), '/viam.app.v1.AppService/DeleteOrganizationInvite': grpclib.const.Handler(self.DeleteOrganizationInvite, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.DeleteOrganizationInviteRequest, app.v1.app_pb2.DeleteOrganizationInviteResponse), '/viam.app.v1.AppService/ResendOrganizationInvite': grpclib.const.Handler(self.ResendOrganizationInvite, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.ResendOrganizationInviteRequest, app.v1.app_pb2.ResendOrganizationInviteResponse), '/viam.app.v1.AppService/CreateLocation': grpclib.const.Handler(self.CreateLocation, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.CreateLocationRequest, app.v1.app_pb2.CreateLocationResponse), '/viam.app.v1.AppService/GetLocation': grpclib.const.Handler(self.GetLocation, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetLocationRequest, app.v1.app_pb2.GetLocationResponse), '/viam.app.v1.AppService/UpdateLocation': grpclib.const.Handler(self.UpdateLocation, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.UpdateLocationRequest, app.v1.app_pb2.UpdateLocationResponse), '/viam.app.v1.AppService/DeleteLocation': grpclib.const.Handler(self.DeleteLocation, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.DeleteLocationRequest, app.v1.app_pb2.DeleteLocationResponse), '/viam.app.v1.AppService/ListLocations': grpclib.const.Handler(self.ListLocations, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.ListLocationsRequest, app.v1.app_pb2.ListLocationsResponse), '/viam.app.v1.AppService/ShareLocation': grpclib.const.Handler(self.ShareLocation, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.ShareLocationRequest, app.v1.app_pb2.ShareLocationResponse), '/viam.app.v1.AppService/UnshareLocation': grpclib.const.Handler(self.UnshareLocation, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.UnshareLocationRequest, app.v1.app_pb2.UnshareLocationResponse), '/viam.app.v1.AppService/LocationAuth': grpclib.const.Handler(self.LocationAuth, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.LocationAuthRequest, app.v1.app_pb2.LocationAuthResponse), '/viam.app.v1.AppService/CreateLocationSecret': grpclib.const.Handler(self.CreateLocationSecret, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.CreateLocationSecretRequest, app.v1.app_pb2.CreateLocationSecretResponse), '/viam.app.v1.AppService/DeleteLocationSecret': grpclib.const.Handler(self.DeleteLocationSecret, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.DeleteLocationSecretRequest, app.v1.app_pb2.DeleteLocationSecretResponse), '/viam.app.v1.AppService/GetRobot': grpclib.const.Handler(self.GetRobot, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetRobotRequest, app.v1.app_pb2.GetRobotResponse), '/viam.app.v1.AppService/GetRoverRentalRobots': grpclib.const.Handler(self.GetRoverRentalRobots, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetRoverRentalRobotsRequest, app.v1.app_pb2.GetRoverRentalRobotsResponse), '/viam.app.v1.AppService/GetRobotParts': grpclib.const.Handler(self.GetRobotParts, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetRobotPartsRequest, app.v1.app_pb2.GetRobotPartsResponse), '/viam.app.v1.AppService/GetRobotPart': grpclib.const.Handler(self.GetRobotPart, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetRobotPartRequest, app.v1.app_pb2.GetRobotPartResponse), '/viam.app.v1.AppService/GetRobotPartLogs': grpclib.const.Handler(self.GetRobotPartLogs, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetRobotPartLogsRequest, app.v1.app_pb2.GetRobotPartLogsResponse), '/viam.app.v1.AppService/TailRobotPartLogs': grpclib.const.Handler(self.TailRobotPartLogs, grpclib.const.Cardinality.UNARY_STREAM, app.v1.app_pb2.TailRobotPartLogsRequest, app.v1.app_pb2.TailRobotPartLogsResponse), '/viam.app.v1.AppService/GetRobotPartHistory': grpclib.const.Handler(self.GetRobotPartHistory, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetRobotPartHistoryRequest, app.v1.app_pb2.GetRobotPartHistoryResponse), '/viam.app.v1.AppService/UpdateRobotPart': grpclib.const.Handler(self.UpdateRobotPart, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.UpdateRobotPartRequest, app.v1.app_pb2.UpdateRobotPartResponse), '/viam.app.v1.AppService/NewRobotPart': grpclib.const.Handler(self.NewRobotPart, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.NewRobotPartRequest, app.v1.app_pb2.NewRobotPartResponse), '/viam.app.v1.AppService/DeleteRobotPart': grpclib.const.Handler(self.DeleteRobotPart, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.DeleteRobotPartRequest, app.v1.app_pb2.DeleteRobotPartResponse), '/viam.app.v1.AppService/GetRobotAPIKeys': grpclib.const.Handler(self.GetRobotAPIKeys, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetRobotAPIKeysRequest, app.v1.app_pb2.GetRobotAPIKeysResponse), '/viam.app.v1.AppService/MarkPartAsMain': grpclib.const.Handler(self.MarkPartAsMain, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.MarkPartAsMainRequest, app.v1.app_pb2.MarkPartAsMainResponse), '/viam.app.v1.AppService/MarkPartForRestart': grpclib.const.Handler(self.MarkPartForRestart, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.MarkPartForRestartRequest, app.v1.app_pb2.MarkPartForRestartResponse), '/viam.app.v1.AppService/CreateRobotPartSecret': grpclib.const.Handler(self.CreateRobotPartSecret, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.CreateRobotPartSecretRequest, app.v1.app_pb2.CreateRobotPartSecretResponse), '/viam.app.v1.AppService/DeleteRobotPartSecret': grpclib.const.Handler(self.DeleteRobotPartSecret, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.DeleteRobotPartSecretRequest, app.v1.app_pb2.DeleteRobotPartSecretResponse), '/viam.app.v1.AppService/ListRobots': grpclib.const.Handler(self.ListRobots, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.ListRobotsRequest, app.v1.app_pb2.ListRobotsResponse), '/viam.app.v1.AppService/NewRobot': grpclib.const.Handler(self.NewRobot, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.NewRobotRequest, app.v1.app_pb2.NewRobotResponse), '/viam.app.v1.AppService/UpdateRobot': grpclib.const.Handler(self.UpdateRobot, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.UpdateRobotRequest, app.v1.app_pb2.UpdateRobotResponse), '/viam.app.v1.AppService/DeleteRobot': grpclib.const.Handler(self.DeleteRobot, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.DeleteRobotRequest, app.v1.app_pb2.DeleteRobotResponse), '/viam.app.v1.AppService/ListFragments': grpclib.const.Handler(self.ListFragments, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.ListFragmentsRequest, app.v1.app_pb2.ListFragmentsResponse), '/viam.app.v1.AppService/GetFragment': grpclib.const.Handler(self.GetFragment, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetFragmentRequest, app.v1.app_pb2.GetFragmentResponse), '/viam.app.v1.AppService/CreateFragment': grpclib.const.Handler(self.CreateFragment, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.CreateFragmentRequest, app.v1.app_pb2.CreateFragmentResponse), '/viam.app.v1.AppService/UpdateFragment': grpclib.const.Handler(self.UpdateFragment, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.UpdateFragmentRequest, app.v1.app_pb2.UpdateFragmentResponse), '/viam.app.v1.AppService/DeleteFragment': grpclib.const.Handler(self.DeleteFragment, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.DeleteFragmentRequest, app.v1.app_pb2.DeleteFragmentResponse), '/viam.app.v1.AppService/GetFragmentHistory': grpclib.const.Handler(self.GetFragmentHistory, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetFragmentHistoryRequest, app.v1.app_pb2.GetFragmentHistoryResponse), '/viam.app.v1.AppService/AddRole': grpclib.const.Handler(self.AddRole, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.AddRoleRequest, app.v1.app_pb2.AddRoleResponse), '/viam.app.v1.AppService/RemoveRole': grpclib.const.Handler(self.RemoveRole, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.RemoveRoleRequest, app.v1.app_pb2.RemoveRoleResponse), '/viam.app.v1.AppService/ChangeRole': grpclib.const.Handler(self.ChangeRole, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.ChangeRoleRequest, app.v1.app_pb2.ChangeRoleResponse), '/viam.app.v1.AppService/ListAuthorizations': grpclib.const.Handler(self.ListAuthorizations, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.ListAuthorizationsRequest, app.v1.app_pb2.ListAuthorizationsResponse), '/viam.app.v1.AppService/CheckPermissions': grpclib.const.Handler(self.CheckPermissions, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.CheckPermissionsRequest, app.v1.app_pb2.CheckPermissionsResponse), '/viam.app.v1.AppService/GetRegistryItem': grpclib.const.Handler(self.GetRegistryItem, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetRegistryItemRequest, app.v1.app_pb2.GetRegistryItemResponse), '/viam.app.v1.AppService/CreateRegistryItem': grpclib.const.Handler(self.CreateRegistryItem, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.CreateRegistryItemRequest, app.v1.app_pb2.CreateRegistryItemResponse), '/viam.app.v1.AppService/UpdateRegistryItem': grpclib.const.Handler(self.UpdateRegistryItem, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.UpdateRegistryItemRequest, app.v1.app_pb2.UpdateRegistryItemResponse), '/viam.app.v1.AppService/ListRegistryItems': grpclib.const.Handler(self.ListRegistryItems, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.ListRegistryItemsRequest, app.v1.app_pb2.ListRegistryItemsResponse), '/viam.app.v1.AppService/DeleteRegistryItem': grpclib.const.Handler(self.DeleteRegistryItem, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.DeleteRegistryItemRequest, app.v1.app_pb2.DeleteRegistryItemResponse), '/viam.app.v1.AppService/TransferRegistryItem': grpclib.const.Handler(self.TransferRegistryItem, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.TransferRegistryItemRequest, app.v1.app_pb2.TransferRegistryItemResponse), '/viam.app.v1.AppService/CreateModule': grpclib.const.Handler(self.CreateModule, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.CreateModuleRequest, app.v1.app_pb2.CreateModuleResponse), '/viam.app.v1.AppService/UpdateModule': grpclib.const.Handler(self.UpdateModule, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.UpdateModuleRequest, app.v1.app_pb2.UpdateModuleResponse), '/viam.app.v1.AppService/UploadModuleFile': grpclib.const.Handler(self.UploadModuleFile, grpclib.const.Cardinality.STREAM_UNARY, app.v1.app_pb2.UploadModuleFileRequest, app.v1.app_pb2.UploadModuleFileResponse), '/viam.app.v1.AppService/GetModule': grpclib.const.Handler(self.GetModule, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.GetModuleRequest, app.v1.app_pb2.GetModuleResponse), '/viam.app.v1.AppService/ListModules': grpclib.const.Handler(self.ListModules, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.ListModulesRequest, app.v1.app_pb2.ListModulesResponse), '/viam.app.v1.AppService/CreateKey': grpclib.const.Handler(self.CreateKey, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.CreateKeyRequest, app.v1.app_pb2.CreateKeyResponse), '/viam.app.v1.AppService/DeleteKey': grpclib.const.Handler(self.DeleteKey, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.DeleteKeyRequest, app.v1.app_pb2.DeleteKeyResponse), '/viam.app.v1.AppService/ListKeys': grpclib.const.Handler(self.ListKeys, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.ListKeysRequest, app.v1.app_pb2.ListKeysResponse), '/viam.app.v1.AppService/RenameKey': grpclib.const.Handler(self.RenameKey, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.RenameKeyRequest, app.v1.app_pb2.RenameKeyResponse), '/viam.app.v1.AppService/RotateKey': grpclib.const.Handler(self.RotateKey, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.RotateKeyRequest, app.v1.app_pb2.RotateKeyResponse), '/viam.app.v1.AppService/CreateKeyFromExistingKeyAuthorizations': grpclib.const.Handler(self.CreateKeyFromExistingKeyAuthorizations, grpclib.const.Cardinality.UNARY_UNARY, app.v1.app_pb2.CreateKeyFromExistingKeyAuthorizationsRequest, app.v1.app_pb2.CreateKeyFromExistingKeyAuthorizationsResponse)}
class UnimplementedAppServiceBase(AppServiceBase):
@@ -449,6 +453,9 @@ async def UpdateFragment(self, stream: 'grpclib.server.Stream[app.v1.app_pb2.Upd
async def DeleteFragment(self, stream: 'grpclib.server.Stream[app.v1.app_pb2.DeleteFragmentRequest, app.v1.app_pb2.DeleteFragmentResponse]') -> None:
raise grpclib.exceptions.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
+ async def GetFragmentHistory(self, stream: 'grpclib.server.Stream[app.v1.app_pb2.GetFragmentHistoryRequest, app.v1.app_pb2.GetFragmentHistoryResponse]') -> None:
+ raise grpclib.exceptions.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
+
async def AddRole(self, stream: 'grpclib.server.Stream[app.v1.app_pb2.AddRoleRequest, app.v1.app_pb2.AddRoleResponse]') -> None:
raise grpclib.exceptions.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
@@ -567,6 +574,7 @@ def __init__(self, channel: grpclib.client.Channel) -> None:
self.CreateFragment = grpclib.client.UnaryUnaryMethod(channel, '/viam.app.v1.AppService/CreateFragment', app.v1.app_pb2.CreateFragmentRequest, app.v1.app_pb2.CreateFragmentResponse)
self.UpdateFragment = grpclib.client.UnaryUnaryMethod(channel, '/viam.app.v1.AppService/UpdateFragment', app.v1.app_pb2.UpdateFragmentRequest, app.v1.app_pb2.UpdateFragmentResponse)
self.DeleteFragment = grpclib.client.UnaryUnaryMethod(channel, '/viam.app.v1.AppService/DeleteFragment', app.v1.app_pb2.DeleteFragmentRequest, app.v1.app_pb2.DeleteFragmentResponse)
+ self.GetFragmentHistory = grpclib.client.UnaryUnaryMethod(channel, '/viam.app.v1.AppService/GetFragmentHistory', app.v1.app_pb2.GetFragmentHistoryRequest, app.v1.app_pb2.GetFragmentHistoryResponse)
self.AddRole = grpclib.client.UnaryUnaryMethod(channel, '/viam.app.v1.AppService/AddRole', app.v1.app_pb2.AddRoleRequest, app.v1.app_pb2.AddRoleResponse)
self.RemoveRole = grpclib.client.UnaryUnaryMethod(channel, '/viam.app.v1.AppService/RemoveRole', app.v1.app_pb2.RemoveRoleRequest, app.v1.app_pb2.RemoveRoleResponse)
self.ChangeRole = grpclib.client.UnaryUnaryMethod(channel, '/viam.app.v1.AppService/ChangeRole', app.v1.app_pb2.ChangeRoleRequest, app.v1.app_pb2.ChangeRoleResponse)
diff --git a/src/viam/gen/app/v1/app_pb2.py b/src/viam/gen/app/v1/app_pb2.py
index e90fd8ded..470238966 100644
--- a/src/viam/gen/app/v1/app_pb2.py
+++ b/src/viam/gen/app/v1/app_pb2.py
@@ -10,7 +10,7 @@
from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
from ...tagger.v1 import tagger_pb2 as tagger_dot_v1_dot_tagger__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10app/v1/app.proto\x12\x0bviam.app.v1\x1a#app/mltraining/v1/ml_training.proto\x1a\x1eapp/packages/v1/packages.proto\x1a\x16common/v1/common.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x16tagger/v1/tagger.proto"\xec\x02\n\x05Robot\x123\n\x02id\x18\x01 \x01(\tB#\x9a\x84\x9e\x03\x1ebson:"_id" json:"id,omitempty"R\x02id\x120\n\x04name\x18\x02 \x01(\tB\x1c\x9a\x84\x9e\x03\x17bson:"name" json:"name"R\x04name\x12@\n\x08location\x18\x03 \x01(\tB$\x9a\x84\x9e\x03\x1fbson:"location" json:"location"R\x08location\x12g\n\x0blast_access\x18\x04 \x01(\x0b2\x1a.google.protobuf.TimestampB*\x9a\x84\x9e\x03%bson:"last_access" json:"last_access"R\nlastAccess\x12Q\n\ncreated_on\x18\x05 \x01(\x0b2\x1a.google.protobuf.TimestampB\x16\x9a\x84\x9e\x03\x11bson:"created_on"R\tcreatedOn"\xd3\x07\n\tRobotPart\x123\n\x02id\x18\x01 \x01(\tB#\x9a\x84\x9e\x03\x1ebson:"_id" json:"id,omitempty"R\x02id\x120\n\x04name\x18\x02 \x01(\tB\x1c\x9a\x84\x9e\x03\x17bson:"name" json:"name"R\x04name\x12?\n\x08dns_name\x18\n \x01(\tB$\x9a\x84\x9e\x03\x1fbson:"dns_name" json:"dns_name"R\x07dnsName\x12B\n\x06secret\x18\x03 \x01(\tB*\x9a\x84\x9e\x03%bson:"secret" json:"secret,omitempty"R\x06secret\x124\n\x05robot\x18\x04 \x01(\tB\x1e\x9a\x84\x9e\x03\x19bson:"robot" json:"robot"R\x05robot\x12A\n\x0blocation_id\x18\x0c \x01(\tB \x9a\x84\x9e\x03\x1bbson:"location_id" json:"-"R\nlocationId\x12b\n\x0crobot_config\x18\x05 \x01(\x0b2\x17.google.protobuf.StructB&\x9a\x84\x9e\x03!bson:"config" json:"robot_config"R\x0brobotConfig\x12g\n\x0blast_access\x18\x06 \x01(\x0b2\x1a.google.protobuf.TimestampB*\x9a\x84\x9e\x03%bson:"last_access" json:"last_access"R\nlastAccess\x12\x7f\n\x12user_supplied_info\x18\x07 \x01(\x0b2\x17.google.protobuf.StructB8\x9a\x84\x9e\x033bson:"user_supplied_info" json:"user_supplied_info"R\x10userSuppliedInfo\x12C\n\tmain_part\x18\x08 \x01(\x08B&\x9a\x84\x9e\x03!bson:"main_part" json:"main_part"R\x08mainPart\x12\x12\n\x04fqdn\x18\t \x01(\tR\x04fqdn\x12\x1d\n\nlocal_fqdn\x18\x0b \x01(\tR\tlocalFqdn\x12Q\n\ncreated_on\x18\r \x01(\x0b2\x1a.google.protobuf.TimestampB\x16\x9a\x84\x9e\x03\x11bson:"created_on"R\tcreatedOn\x12H\n\x07secrets\x18\x0e \x03(\x0b2\x19.viam.app.v1.SharedSecretB\x13\x9a\x84\x9e\x03\x0ebson:"secrets"R\x07secrets"\xf8\x02\n\x15RobotPartHistoryEntry\x120\n\x04part\x18\x01 \x01(\tB\x1c\x9a\x84\x9e\x03\x17bson:"part" json:"part"R\x04part\x124\n\x05robot\x18\x02 \x01(\tB\x1e\x9a\x84\x9e\x03\x19bson:"robot" json:"robot"R\x05robot\x12L\n\x04when\x18\x03 \x01(\x0b2\x1a.google.protobuf.TimestampB\x1c\x9a\x84\x9e\x03\x17bson:"when" json:"when"R\x04when\x12D\n\x03old\x18\x04 \x01(\x0b2\x16.viam.app.v1.RobotPartB\x1a\x9a\x84\x9e\x03\x15bson:"old" json:"old"R\x03old\x12c\n\tedited_by\x18\x05 \x01(\x0b2\x1e.viam.app.v1.AuthenticatorInfoB&\x9a\x84\x9e\x03!bson:"edited_by" json:"edited_by"R\x08editedBy"\x85\x01\n\x11AuthenticatorInfo\x123\n\x04type\x18\x01 \x01(\x0e2\x1f.viam.app.v1.AuthenticationTypeR\x04type\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value\x12%\n\x0eis_deactivated\x18\x03 \x01(\x08R\risDeactivated"\x1a\n\x18ListOrganizationsRequest"\xde\x01\n\x0cOrganization\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x129\n\ncreated_on\x18\x03 \x01(\x0b2\x1a.google.protobuf.TimestampR\tcreatedOn\x12)\n\x10public_namespace\x18\x04 \x01(\tR\x0fpublicNamespace\x12%\n\x0edefault_region\x18\x05 \x01(\tR\rdefaultRegion\x12\x15\n\x03cid\x18\x06 \x01(\tH\x00R\x03cid\x88\x01\x01B\x06\n\x04_cid"\xcf\x01\n\x12OrganizationMember\x12\x17\n\x07user_id\x18\x01 \x01(\tR\x06userId\x12\x16\n\x06emails\x18\x02 \x03(\tR\x06emails\x129\n\ndate_added\x18\x03 \x01(\x0b2\x1a.google.protobuf.TimestampR\tdateAdded\x12>\n\nlast_login\x18\x04 \x01(\x0b2\x1a.google.protobuf.TimestampH\x00R\tlastLogin\x88\x01\x01B\r\n\x0b_last_login"\\\n\x19ListOrganizationsResponse\x12?\n\rorganizations\x18\x01 \x03(\x0b2\x19.viam.app.v1.OrganizationR\rorganizations"\xd2\x01\n\x12OrganizationInvite\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12\x14\n\x05email\x18\x02 \x01(\tR\x05email\x129\n\ncreated_on\x18\x03 \x01(\x0b2\x1a.google.protobuf.TimestampR\tcreatedOn\x12B\n\x0eauthorizations\x18\x04 \x03(\x0b2\x1a.viam.app.v1.AuthorizationR\x0eauthorizations"/\n\x19CreateOrganizationRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name"[\n\x1aCreateOrganizationResponse\x12=\n\x0corganization\x18\x01 \x01(\x0b2\x19.viam.app.v1.OrganizationR\x0corganization"A\n\x16GetOrganizationRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId"X\n\x17GetOrganizationResponse\x12=\n\x0corganization\x18\x01 \x01(\x0b2\x19.viam.app.v1.OrganizationR\x0corganization"X\n+GetOrganizationNamespaceAvailabilityRequest\x12)\n\x10public_namespace\x18\x01 \x01(\tR\x0fpublicNamespace"L\n,GetOrganizationNamespaceAvailabilityResponse\x12\x1c\n\tavailable\x18\x01 \x01(\x08R\tavailable"\xf2\x01\n\x19UpdateOrganizationRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12\x17\n\x04name\x18\x02 \x01(\tH\x00R\x04name\x88\x01\x01\x12.\n\x10public_namespace\x18\x03 \x01(\tH\x01R\x0fpublicNamespace\x88\x01\x01\x12\x1b\n\x06region\x18\x04 \x01(\tH\x02R\x06region\x88\x01\x01\x12\x15\n\x03cid\x18\x05 \x01(\tH\x03R\x03cid\x88\x01\x01B\x07\n\x05_nameB\x13\n\x11_public_namespaceB\t\n\x07_regionB\x06\n\x04_cid"[\n\x1aUpdateOrganizationResponse\x12=\n\x0corganization\x18\x01 \x01(\x0b2\x19.viam.app.v1.OrganizationR\x0corganization"D\n\x19DeleteOrganizationRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId"\x1c\n\x1aDeleteOrganizationResponse"I\n\x1eListOrganizationMembersRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId"\xc0\x01\n\x1fListOrganizationMembersResponse\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x129\n\x07members\x18\x02 \x03(\x0b2\x1f.viam.app.v1.OrganizationMemberR\x07members\x129\n\x07invites\x18\x03 \x03(\x0b2\x1f.viam.app.v1.OrganizationInviteR\x07invites"\xeb\x01\n\x1fCreateOrganizationInviteRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12\x14\n\x05email\x18\x02 \x01(\tR\x05email\x12B\n\x0eauthorizations\x18\x03 \x03(\x0b2\x1a.viam.app.v1.AuthorizationR\x0eauthorizations\x12/\n\x11send_email_invite\x18\x04 \x01(\x08H\x00R\x0fsendEmailInvite\x88\x01\x01B\x14\n\x12_send_email_invite"[\n CreateOrganizationInviteResponse\x127\n\x06invite\x18\x01 \x01(\x0b2\x1f.viam.app.v1.OrganizationInviteR\x06invite"\x8a\x02\n-UpdateOrganizationInviteAuthorizationsRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12\x14\n\x05email\x18\x02 \x01(\tR\x05email\x12I\n\x12add_authorizations\x18\x03 \x03(\x0b2\x1a.viam.app.v1.AuthorizationR\x11addAuthorizations\x12O\n\x15remove_authorizations\x18\x04 \x03(\x0b2\x1a.viam.app.v1.AuthorizationR\x14removeAuthorizations"i\n.UpdateOrganizationInviteAuthorizationsResponse\x127\n\x06invite\x18\x01 \x01(\x0b2\x1f.viam.app.v1.OrganizationInviteR\x06invite"`\n\x1fDeleteOrganizationInviteRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12\x14\n\x05email\x18\x02 \x01(\tR\x05email""\n DeleteOrganizationInviteResponse"`\n\x1fResendOrganizationInviteRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12\x14\n\x05email\x18\x02 \x01(\tR\x05email"[\n ResendOrganizationInviteResponse\x127\n\x06invite\x18\x01 \x01(\x0b2\x1f.viam.app.v1.OrganizationInviteR\x06invite"c\n\x1fDeleteOrganizationMemberRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12\x17\n\x07user_id\x18\x02 \x01(\tR\x06userId""\n DeleteOrganizationMemberResponse":\n\x14OrganizationIdentity\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name"Y\n\x14LocationOrganization\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12\x18\n\x07primary\x18\x02 \x01(\x08R\x07primary"\x80\x01\n\x0cLocationAuth\x12\x1a\n\x06secret\x18\x01 \x01(\tB\x02\x18\x01R\x06secret\x12\x1f\n\x0blocation_id\x18\x02 \x01(\tR\nlocationId\x123\n\x07secrets\x18\x03 \x03(\x0b2\x19.viam.app.v1.SharedSecretR\x07secrets"\'\n\rStorageConfig\x12\x16\n\x06region\x18\x01 \x01(\tR\x06region"\xe4\x02\n\x08Location\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x12,\n\x12parent_location_id\x18\x04 \x01(\tR\x10parentLocationId\x12-\n\x04auth\x18\x05 \x01(\x0b2\x19.viam.app.v1.LocationAuthR\x04auth\x12G\n\rorganizations\x18\x06 \x03(\x0b2!.viam.app.v1.LocationOrganizationR\rorganizations\x129\n\ncreated_on\x18\x03 \x01(\x0b2\x1a.google.protobuf.TimestampR\tcreatedOn\x12\x1f\n\x0brobot_count\x18\x07 \x01(\x05R\nrobotCount\x122\n\x06config\x18\x08 \x01(\x0b2\x1a.viam.app.v1.StorageConfigR\x06config"\xd0\x02\n\x0cSharedSecret\x12\x1e\n\x02id\x18\x01 \x01(\tB\x0e\x9a\x84\x9e\x03\tbson:"id"R\x02id\x12*\n\x06secret\x18\x02 \x01(\tB\x12\x9a\x84\x9e\x03\rbson:"secret"R\x06secret\x12c\n\ncreated_on\x18\x03 \x01(\x0b2\x1a.google.protobuf.TimestampB(\x9a\x84\x9e\x03#bson:"created_on" json:"created_on"R\tcreatedOn\x12H\n\x05state\x18\x04 \x01(\x0e2\x1f.viam.app.v1.SharedSecret.StateB\x11\x9a\x84\x9e\x03\x0cbson:"state"R\x05state"E\n\x05State\x12\x15\n\x11STATE_UNSPECIFIED\x10\x00\x12\x11\n\rSTATE_ENABLED\x10\x01\x12\x12\n\x0eSTATE_DISABLED\x10\x02"\x9e\x01\n\x15CreateLocationRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x121\n\x12parent_location_id\x18\x03 \x01(\tH\x00R\x10parentLocationId\x88\x01\x01B\x15\n\x13_parent_location_id"K\n\x16CreateLocationResponse\x121\n\x08location\x18\x01 \x01(\x0b2\x15.viam.app.v1.LocationR\x08location"5\n\x12GetLocationRequest\x12\x1f\n\x0blocation_id\x18\x01 \x01(\tR\nlocationId"H\n\x13GetLocationResponse\x121\n\x08location\x18\x01 \x01(\x0b2\x15.viam.app.v1.LocationR\x08location"\xcc\x01\n\x15UpdateLocationRequest\x12\x1f\n\x0blocation_id\x18\x01 \x01(\tR\nlocationId\x12\x17\n\x04name\x18\x02 \x01(\tH\x00R\x04name\x88\x01\x01\x121\n\x12parent_location_id\x18\x03 \x01(\tH\x01R\x10parentLocationId\x88\x01\x01\x12\x1b\n\x06region\x18\x04 \x01(\tH\x02R\x06region\x88\x01\x01B\x07\n\x05_nameB\x15\n\x13_parent_location_idB\t\n\x07_region"K\n\x16UpdateLocationResponse\x121\n\x08location\x18\x01 \x01(\x0b2\x15.viam.app.v1.LocationR\x08location"8\n\x15DeleteLocationRequest\x12\x1f\n\x0blocation_id\x18\x01 \x01(\tR\nlocationId"\x18\n\x16DeleteLocationResponse"N\n+GetOrganizationsWithAccessToLocationRequest\x12\x1f\n\x0blocation_id\x18\x01 \x01(\tR\nlocationId"\x8a\x01\n,GetOrganizationsWithAccessToLocationResponse\x12Z\n\x17organization_identities\x18\x01 \x03(\x0b2!.viam.app.v1.OrganizationIdentityR\x16organizationIdentities"?\n\x14ListLocationsRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId"`\n\x14ShareLocationRequest\x12\x1f\n\x0blocation_id\x18\x01 \x01(\tR\nlocationId\x12\'\n\x0forganization_id\x18\x02 \x01(\tR\x0eorganizationId"\x17\n\x15ShareLocationResponse"b\n\x16UnshareLocationRequest\x12\x1f\n\x0blocation_id\x18\x01 \x01(\tR\nlocationId\x12\'\n\x0forganization_id\x18\x02 \x01(\tR\x0eorganizationId"\x19\n\x17UnshareLocationResponse"L\n\x15ListLocationsResponse\x123\n\tlocations\x18\x01 \x03(\x0b2\x15.viam.app.v1.LocationR\tlocations">\n\x1bCreateLocationSecretRequest\x12\x1f\n\x0blocation_id\x18\x01 \x01(\tR\nlocationId"M\n\x1cCreateLocationSecretResponse\x12-\n\x04auth\x18\x01 \x01(\x0b2\x19.viam.app.v1.LocationAuthR\x04auth"[\n\x1bDeleteLocationSecretRequest\x12\x1f\n\x0blocation_id\x18\x01 \x01(\tR\nlocationId\x12\x1b\n\tsecret_id\x18\x02 \x01(\tR\x08secretId"\x1e\n\x1cDeleteLocationSecretResponse"6\n\x13LocationAuthRequest\x12\x1f\n\x0blocation_id\x18\x01 \x01(\tR\nlocationId"E\n\x14LocationAuthResponse\x12-\n\x04auth\x18\x01 \x01(\x0b2\x19.viam.app.v1.LocationAuthR\x04auth"!\n\x0fGetRobotRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"4\n\x1bGetRoverRentalRobotsRequest\x12\x15\n\x06org_id\x18\x01 \x01(\tR\x05orgId"\x9a\x01\n\x10RoverRentalRobot\x12\x19\n\x08robot_id\x18\x01 \x01(\tR\x07robotId\x12\x1f\n\x0blocation_id\x18\x02 \x01(\tR\nlocationId\x12\x1d\n\nrobot_name\x18\x03 \x01(\tR\trobotName\x12+\n\x12robot_main_part_id\x18\x04 \x01(\tR\x0frobotMainPartId"U\n\x1cGetRoverRentalRobotsResponse\x125\n\x06robots\x18\x01 \x03(\x0b2\x1d.viam.app.v1.RoverRentalRobotR\x06robots"<\n\x10GetRobotResponse\x12(\n\x05robot\x18\x01 \x01(\x0b2\x12.viam.app.v1.RobotR\x05robot"1\n\x14GetRobotPartsRequest\x12\x19\n\x08robot_id\x18\x01 \x01(\tR\x07robotId"E\n\x15GetRobotPartsResponse\x12,\n\x05parts\x18\x01 \x03(\x0b2\x16.viam.app.v1.RobotPartR\x05parts"%\n\x13GetRobotPartRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"c\n\x14GetRobotPartResponse\x12*\n\x04part\x18\x01 \x01(\x0b2\x16.viam.app.v1.RobotPartR\x04part\x12\x1f\n\x0bconfig_json\x18\x02 \x01(\tR\nconfigJson"\xc1\x01\n\x17GetRobotPartLogsRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12#\n\x0berrors_only\x18\x02 \x01(\x08B\x02\x18\x01R\nerrorsOnly\x12\x1b\n\x06filter\x18\x03 \x01(\tH\x00R\x06filter\x88\x01\x01\x12"\n\npage_token\x18\x04 \x01(\tH\x01R\tpageToken\x88\x01\x01\x12\x16\n\x06levels\x18\x05 \x03(\tR\x06levelsB\t\n\x07_filterB\r\n\x0b_page_token"p\n\x18GetRobotPartLogsResponse\x12,\n\x04logs\x18\x01 \x03(\x0b2\x18.viam.common.v1.LogEntryR\x04logs\x12&\n\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken"s\n\x18TailRobotPartLogsRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x1f\n\x0berrors_only\x18\x02 \x01(\x08R\nerrorsOnly\x12\x1b\n\x06filter\x18\x03 \x01(\tH\x00R\x06filter\x88\x01\x01B\t\n\x07_filter"I\n\x19TailRobotPartLogsResponse\x12,\n\x04logs\x18\x01 \x03(\x0b2\x18.viam.common.v1.LogEntryR\x04logs",\n\x1aGetRobotPartHistoryRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"[\n\x1bGetRobotPartHistoryResponse\x12<\n\x07history\x18\x01 \x03(\x0b2".viam.app.v1.RobotPartHistoryEntryR\x07history"x\n\x16UpdateRobotPartRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x12:\n\x0crobot_config\x18\x03 \x01(\x0b2\x17.google.protobuf.StructR\x0brobotConfig"E\n\x17UpdateRobotPartResponse\x12*\n\x04part\x18\x01 \x01(\x0b2\x16.viam.app.v1.RobotPartR\x04part"M\n\x13NewRobotPartRequest\x12\x19\n\x08robot_id\x18\x01 \x01(\tR\x07robotId\x12\x1b\n\tpart_name\x18\x02 \x01(\tR\x08partName"/\n\x14NewRobotPartResponse\x12\x17\n\x07part_id\x18\x01 \x01(\tR\x06partId"1\n\x16DeleteRobotPartRequest\x12\x17\n\x07part_id\x18\x01 \x01(\tR\x06partId"3\n\x16GetRobotAPIKeysRequest\x12\x19\n\x08robot_id\x18\x01 \x01(\tR\x07robotId"y\n\x06APIKey\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x10\n\x03key\x18\x02 \x01(\tR\x03key\x12\x12\n\x04name\x18\x03 \x01(\tR\x04name\x129\n\ncreated_on\x18\x04 \x01(\x0b2\x1a.google.protobuf.TimestampR\tcreatedOn"[\n\x17GetRobotAPIKeysResponse\x12@\n\x08api_keys\x18\x01 \x03(\x0b2%.viam.app.v1.APIKeyWithAuthorizationsR\x07apiKeys"\x19\n\x17DeleteRobotPartResponse"\xa9\x05\n\x08Fragment\x123\n\x02id\x18\x01 \x01(\tB#\x9a\x84\x9e\x03\x1ebson:"_id" json:"id,omitempty"R\x02id\x120\n\x04name\x18\x02 \x01(\tB\x1c\x9a\x84\x9e\x03\x17bson:"name" json:"name"R\x04name\x12Y\n\x08fragment\x18\x03 \x01(\x0b2\x17.google.protobuf.StructB$\x9a\x84\x9e\x03\x1fbson:"fragment" json:"fragment"R\x08fragment\x12Z\n\x12organization_owner\x18\x04 \x01(\tB+\x9a\x84\x9e\x03&bson:"organization_owner" json:"owner"R\x11organizationOwner\x128\n\x06public\x18\x05 \x01(\x08B \x9a\x84\x9e\x03\x1bbson:"public" json:"public"R\x06public\x12Q\n\ncreated_on\x18\x06 \x01(\x0b2\x1a.google.protobuf.TimestampB\x16\x9a\x84\x9e\x03\x11bson:"created_on"R\tcreatedOn\x12+\n\x11organization_name\x18\x07 \x01(\tR\x10organizationName\x12(\n\x10robot_part_count\x18\t \x01(\x05R\x0erobotPartCount\x12-\n\x12organization_count\x18\n \x01(\x05R\x11organizationCount\x12+\n\x12only_used_by_owner\x18\x0b \x01(\x08R\x0fonlyUsedByOwner\x12?\n\nvisibility\x18\x0c \x01(\x0e2\x1f.viam.app.v1.FragmentVisibilityR\nvisibility"\xb2\x01\n\x14ListFragmentsRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12\x1f\n\x0bshow_public\x18\x02 \x01(\x08R\nshowPublic\x12P\n\x13fragment_visibility\x18\x03 \x03(\x0e2\x1f.viam.app.v1.FragmentVisibilityR\x12fragmentVisibility"L\n\x15ListFragmentsResponse\x123\n\tfragments\x18\x01 \x03(\x0b2\x15.viam.app.v1.FragmentR\tfragments"$\n\x12GetFragmentRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"H\n\x13GetFragmentResponse\x121\n\x08fragment\x18\x01 \x01(\x0b2\x15.viam.app.v1.FragmentR\x08fragment"\x85\x01\n\x15CreateFragmentRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12/\n\x06config\x18\x02 \x01(\x0b2\x17.google.protobuf.StructR\x06config\x12\'\n\x0forganization_id\x18\x03 \x01(\tR\x0eorganizationId"K\n\x16CreateFragmentResponse\x121\n\x08fragment\x18\x01 \x01(\x0b2\x15.viam.app.v1.FragmentR\x08fragment"\xe9\x01\n\x15UpdateFragmentRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x12/\n\x06config\x18\x03 \x01(\x0b2\x17.google.protobuf.StructR\x06config\x12\x1b\n\x06public\x18\x04 \x01(\x08H\x00R\x06public\x88\x01\x01\x12D\n\nvisibility\x18\x05 \x01(\x0e2\x1f.viam.app.v1.FragmentVisibilityH\x01R\nvisibility\x88\x01\x01B\t\n\x07_publicB\r\n\x0b_visibility"K\n\x16UpdateFragmentResponse\x121\n\x08fragment\x18\x01 \x01(\x0b2\x15.viam.app.v1.FragmentR\x08fragment"\'\n\x15DeleteFragmentRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"\x18\n\x16DeleteFragmentResponse"4\n\x11ListRobotsRequest\x12\x1f\n\x0blocation_id\x18\x01 \x01(\tR\nlocationId"@\n\x12ListRobotsResponse\x12*\n\x06robots\x18\x01 \x03(\x0b2\x12.viam.app.v1.RobotR\x06robots"A\n\x0fNewRobotRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x1a\n\x08location\x18\x02 \x01(\tR\x08location""\n\x10NewRobotResponse\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"T\n\x12UpdateRobotRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x12\x1a\n\x08location\x18\x03 \x01(\tR\x08location"?\n\x13UpdateRobotResponse\x12(\n\x05robot\x18\x01 \x01(\x0b2\x12.viam.app.v1.RobotR\x05robot"$\n\x12DeleteRobotRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"\x15\n\x13DeleteRobotResponse"0\n\x15MarkPartAsMainRequest\x12\x17\n\x07part_id\x18\x01 \x01(\tR\x06partId"\x18\n\x16MarkPartAsMainResponse"4\n\x19MarkPartForRestartRequest\x12\x17\n\x07part_id\x18\x01 \x01(\tR\x06partId"\x1c\n\x1aMarkPartForRestartResponse"7\n\x1cCreateRobotPartSecretRequest\x12\x17\n\x07part_id\x18\x01 \x01(\tR\x06partId"K\n\x1dCreateRobotPartSecretResponse\x12*\n\x04part\x18\x01 \x01(\x0b2\x16.viam.app.v1.RobotPartR\x04part"T\n\x1cDeleteRobotPartSecretRequest\x12\x17\n\x07part_id\x18\x01 \x01(\tR\x06partId\x12\x1b\n\tsecret_id\x18\x02 \x01(\tR\x08secretId"\x1f\n\x1dDeleteRobotPartSecretResponse"\x9e\x02\n\rAuthorization\x12-\n\x12authorization_type\x18\x01 \x01(\tR\x11authorizationType\x12)\n\x10authorization_id\x18\x02 \x01(\tR\x0fauthorizationId\x12#\n\rresource_type\x18\x03 \x01(\tR\x0cresourceType\x12\x1f\n\x0bresource_id\x18\x04 \x01(\tR\nresourceId\x12\x1f\n\x0bidentity_id\x18\x05 \x01(\tR\nidentityId\x12\'\n\x0forganization_id\x18\x06 \x01(\tR\x0eorganizationId\x12#\n\ridentity_type\x18\x07 \x01(\tR\x0cidentityType"R\n\x0eAddRoleRequest\x12@\n\rauthorization\x18\x01 \x01(\x0b2\x1a.viam.app.v1.AuthorizationR\rauthorization"\x11\n\x0fAddRoleResponse"U\n\x11RemoveRoleRequest\x12@\n\rauthorization\x18\x01 \x01(\x0b2\x1a.viam.app.v1.AuthorizationR\rauthorization"\x14\n\x12RemoveRoleResponse"\xa5\x01\n\x11ChangeRoleRequest\x12G\n\x11old_authorization\x18\x01 \x01(\x0b2\x1a.viam.app.v1.AuthorizationR\x10oldAuthorization\x12G\n\x11new_authorization\x18\x02 \x01(\x0b2\x1a.viam.app.v1.AuthorizationR\x10newAuthorization"\x14\n\x12ChangeRoleResponse"g\n\x19ListAuthorizationsRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12!\n\x0cresource_ids\x18\x02 \x03(\tR\x0bresourceIds"`\n\x1aListAuthorizationsResponse\x12B\n\x0eauthorizations\x18\x01 \x03(\x0b2\x1a.viam.app.v1.AuthorizationR\x0eauthorizations"_\n\x17CheckPermissionsRequest\x12D\n\x0bpermissions\x18\x01 \x03(\x0b2".viam.app.v1.AuthorizedPermissionsR\x0bpermissions"\x7f\n\x15AuthorizedPermissions\x12#\n\rresource_type\x18\x01 \x01(\tR\x0cresourceType\x12\x1f\n\x0bresource_id\x18\x02 \x01(\tR\nresourceId\x12 \n\x0bpermissions\x18\x03 \x03(\tR\x0bpermissions"u\n\x18CheckPermissionsResponse\x12Y\n\x16authorized_permissions\x18\x01 \x03(\x0b2".viam.app.v1.AuthorizedPermissionsR\x15authorizedPermissions"\xa1\x01\n\rModuleVersion\x12\x18\n\x07version\x18\x01 \x01(\tR\x07version\x12*\n\x05files\x18\x02 \x03(\x0b2\x14.viam.app.v1.UploadsR\x05files\x12*\n\x06models\x18\x03 \x03(\x0b2\x12.viam.app.v1.ModelR\x06models\x12\x1e\n\nentrypoint\x18\x04 \x01(\tR\nentrypoint"\x94\x01\n\x0eModuleMetadata\x12*\n\x06models\x18\x01 \x03(\x0b2\x12.viam.app.v1.ModelR\x06models\x126\n\x08versions\x18\x02 \x03(\x0b2\x1a.viam.app.v1.ModuleVersionR\x08versions\x12\x1e\n\nentrypoint\x18\x03 \x01(\tR\nentrypoint"\xc0\x01\n\x0fMLModelMetadata\x12\x1a\n\x08versions\x18\x01 \x03(\tR\x08versions\x12@\n\nmodel_type\x18\x02 \x01(\x0e2!.viam.app.mltraining.v1.ModelTypeR\tmodelType\x12O\n\x0fmodel_framework\x18\x03 \x01(\x0e2&.viam.app.mltraining.v1.ModelFrameworkR\x0emodelFramework"h\n\x11MLTrainingVersion\x12\x18\n\x07version\x18\x01 \x01(\tR\x07version\x129\n\ncreated_on\x18\x02 \x01(\x0b2\x1a.google.protobuf.TimestampR\tcreatedOn"\xff\x01\n\x12MLTrainingMetadata\x12:\n\x08versions\x18\x05 \x03(\x0b2\x1e.viam.app.v1.MLTrainingVersionR\x08versions\x12@\n\nmodel_type\x18\x02 \x01(\x0e2!.viam.app.mltraining.v1.ModelTypeR\tmodelType\x12O\n\x0fmodel_framework\x18\x03 \x01(\x0e2&.viam.app.mltraining.v1.ModelFrameworkR\x0emodelFramework\x12\x14\n\x05draft\x18\x04 \x01(\x08R\x05draftJ\x04\x08\x01\x10\x02"\x8c\x07\n\x0cRegistryItem\x12\x17\n\x07item_id\x18\x01 \x01(\tR\x06itemId\x12\'\n\x0forganization_id\x18\x02 \x01(\tR\x0eorganizationId\x12)\n\x10public_namespace\x18\x03 \x01(\tR\x0fpublicNamespace\x12\x12\n\x04name\x18\x04 \x01(\tR\x04name\x125\n\x04type\x18\x05 \x01(\x0e2!.viam.app.packages.v1.PackageTypeR\x04type\x127\n\nvisibility\x18\x06 \x01(\x0e2\x17.viam.app.v1.VisibilityR\nvisibility\x12\x10\n\x03url\x18\x07 \x01(\tR\x03url\x12 \n\x0bdescription\x18\x08 \x01(\tR\x0bdescription\x12*\n\x11total_robot_usage\x18\t \x01(\x03R\x0ftotalRobotUsage\x12;\n\x1atotal_external_robot_usage\x18\r \x01(\x03R\x17totalExternalRobotUsage\x128\n\x18total_organization_usage\x18\n \x01(\x03R\x16totalOrganizationUsage\x12I\n!total_external_organization_usage\x18\x0e \x01(\x03R\x1etotalExternalOrganizationUsage\x12F\n\x0fmodule_metadata\x18\x0b \x01(\x0b2\x1b.viam.app.v1.ModuleMetadataH\x00R\x0emoduleMetadata\x12J\n\x11ml_model_metadata\x18\x0c \x01(\x0b2\x1c.viam.app.v1.MLModelMetadataH\x00R\x0fmlModelMetadata\x12S\n\x14ml_training_metadata\x18\x12 \x01(\x0b2\x1f.viam.app.v1.MLTrainingMetadataH\x00R\x12mlTrainingMetadata\x129\n\ncreated_at\x18\x0f \x01(\x0b2\x1a.google.protobuf.TimestampR\tcreatedAt\x129\n\nupdated_at\x18\x10 \x01(\x0b2\x1a.google.protobuf.TimestampR\tupdatedAtB\n\n\x08metadata"1\n\x16GetRegistryItemRequest\x12\x17\n\x07item_id\x18\x01 \x01(\tR\x06itemId"H\n\x17GetRegistryItemResponse\x12-\n\x04item\x18\x01 \x01(\x0b2\x19.viam.app.v1.RegistryItemR\x04item"\x8f\x01\n\x19CreateRegistryItemRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x125\n\x04type\x18\x03 \x01(\x0e2!.viam.app.packages.v1.PackageTypeR\x04type"\x1c\n\x1aCreateRegistryItemResponse"\xc6\x01\n\x19UpdateRegistryItemRequest\x12\x17\n\x07item_id\x18\x01 \x01(\tR\x06itemId\x125\n\x04type\x18\x02 \x01(\x0e2!.viam.app.packages.v1.PackageTypeR\x04type\x12 \n\x0bdescription\x18\x03 \x01(\tR\x0bdescription\x127\n\nvisibility\x18\x04 \x01(\x0e2\x17.viam.app.v1.VisibilityR\nvisibility"\x1c\n\x1aUpdateRegistryItemResponse"\xc3\x03\n\x18ListRegistryItemsRequest\x12,\n\x0forganization_id\x18\x01 \x01(\tH\x00R\x0eorganizationId\x88\x01\x01\x127\n\x05types\x18\x02 \x03(\x0e2!.viam.app.packages.v1.PackageTypeR\x05types\x12;\n\x0cvisibilities\x18\x03 \x03(\x0e2\x17.viam.app.v1.VisibilityR\x0cvisibilities\x12\x1c\n\tplatforms\x18\x04 \x03(\tR\tplatforms\x12;\n\x08statuses\x18\x05 \x03(\x0e2\x1f.viam.app.v1.RegistryItemStatusR\x08statuses\x12$\n\x0bsearch_term\x18\x06 \x01(\tH\x01R\nsearchTerm\x88\x01\x01\x12"\n\npage_token\x18\x07 \x01(\tH\x02R\tpageToken\x88\x01\x01\x12+\n\x11public_namespaces\x18\x08 \x03(\tR\x10publicNamespacesB\x12\n\x10_organization_idB\x0e\n\x0c_search_termB\r\n\x0b_page_token"L\n\x19ListRegistryItemsResponse\x12/\n\x05items\x18\x01 \x03(\x0b2\x19.viam.app.v1.RegistryItemR\x05items"4\n\x19DeleteRegistryItemRequest\x12\x17\n\x07item_id\x18\x01 \x01(\tR\x06itemId"\x1c\n\x1aDeleteRegistryItemResponse"h\n\x1bTransferRegistryItemRequest\x12\x17\n\x07item_id\x18\x01 \x01(\tR\x06itemId\x120\n\x14new_public_namespace\x18\x02 \x01(\tR\x12newPublicNamespace"\x1e\n\x1cTransferRegistryItemResponse"R\n\x13CreateModuleRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name"E\n\x14CreateModuleResponse\x12\x1b\n\tmodule_id\x18\x01 \x01(\tR\x08moduleId\x12\x10\n\x03url\x18\x02 \x01(\tR\x03url"\xeb\x01\n\x13UpdateModuleRequest\x12\x1b\n\tmodule_id\x18\x01 \x01(\tR\x08moduleId\x127\n\nvisibility\x18\x02 \x01(\x0e2\x17.viam.app.v1.VisibilityR\nvisibility\x12\x10\n\x03url\x18\x03 \x01(\tR\x03url\x12 \n\x0bdescription\x18\x04 \x01(\tR\x0bdescription\x12*\n\x06models\x18\x05 \x03(\x0b2\x12.viam.app.v1.ModelR\x06models\x12\x1e\n\nentrypoint\x18\x06 \x01(\tR\nentrypoint"(\n\x14UpdateModuleResponse\x12\x10\n\x03url\x18\x01 \x01(\tR\x03url"/\n\x05Model\x12\x10\n\x03api\x18\x01 \x01(\tR\x03api\x12\x14\n\x05model\x18\x02 \x01(\tR\x05model"c\n\x0eModuleFileInfo\x12\x1b\n\tmodule_id\x18\x01 \x01(\tR\x08moduleId\x12\x18\n\x07version\x18\x02 \x01(\tR\x07version\x12\x1a\n\x08platform\x18\x03 \x01(\tR\x08platform"\x87\x01\n\x17UploadModuleFileRequest\x12G\n\x10module_file_info\x18\x01 \x01(\x0b2\x1b.viam.app.v1.ModuleFileInfoH\x00R\x0emoduleFileInfo\x12\x14\n\x04file\x18\x02 \x01(\x0cH\x00R\x04fileB\r\n\x0bmodule_file",\n\x18UploadModuleFileResponse\x12\x10\n\x03url\x18\x01 \x01(\tR\x03url"/\n\x10GetModuleRequest\x12\x1b\n\tmodule_id\x18\x01 \x01(\tR\x08moduleId"@\n\x11GetModuleResponse\x12+\n\x06module\x18\x01 \x01(\x0b2\x13.viam.app.v1.ModuleR\x06module"\xe5\x03\n\x06Module\x12\x1b\n\tmodule_id\x18\x01 \x01(\tR\x08moduleId\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x127\n\nvisibility\x18\x03 \x01(\x0e2\x17.viam.app.v1.VisibilityR\nvisibility\x127\n\x08versions\x18\x04 \x03(\x0b2\x1b.viam.app.v1.VersionHistoryR\x08versions\x12\x10\n\x03url\x18\x05 \x01(\tR\x03url\x12 \n\x0bdescription\x18\x06 \x01(\tR\x0bdescription\x12*\n\x06models\x18\x07 \x03(\x0b2\x12.viam.app.v1.ModelR\x06models\x12*\n\x11total_robot_usage\x18\x08 \x01(\x03R\x0ftotalRobotUsage\x128\n\x18total_organization_usage\x18\t \x01(\x03R\x16totalOrganizationUsage\x12\'\n\x0forganization_id\x18\n \x01(\tR\x0eorganizationId\x12\x1e\n\nentrypoint\x18\x0b \x01(\tR\nentrypoint\x12)\n\x10public_namespace\x18\x0c \x01(\tR\x0fpublicNamespace"\xa2\x01\n\x0eVersionHistory\x12\x18\n\x07version\x18\x01 \x01(\tR\x07version\x12*\n\x05files\x18\x02 \x03(\x0b2\x14.viam.app.v1.UploadsR\x05files\x12*\n\x06models\x18\x03 \x03(\x0b2\x12.viam.app.v1.ModelR\x06models\x12\x1e\n\nentrypoint\x18\x04 \x01(\tR\nentrypoint"b\n\x07Uploads\x12\x1a\n\x08platform\x18\x01 \x01(\tR\x08platform\x12;\n\x0buploaded_at\x18\x02 \x01(\x0b2\x1a.google.protobuf.TimestampR\nuploadedAt"V\n\x12ListModulesRequest\x12,\n\x0forganization_id\x18\x01 \x01(\tH\x00R\x0eorganizationId\x88\x01\x01B\x12\n\x10_organization_id"D\n\x13ListModulesResponse\x12-\n\x07modules\x18\x01 \x03(\x0b2\x13.viam.app.v1.ModuleR\x07modules"/\n\x17GetUserIDByEmailRequest\x12\x14\n\x05email\x18\x01 \x01(\tR\x05email"3\n\x18GetUserIDByEmailResponse\x12\x17\n\x07user_id\x18\x01 \x01(\tR\x06userId"9\n\x1eListOrganizationsByUserRequest\x12\x17\n\x07user_id\x18\x01 \x01(\tR\x06userId">\n\nOrgDetails\x12\x15\n\x06org_id\x18\x01 \x01(\tR\x05orgId\x12\x19\n\x08org_name\x18\x02 \x01(\tR\x07orgName"N\n\x1fListOrganizationsByUserResponse\x12+\n\x04orgs\x18\x01 \x03(\x0b2\x17.viam.app.v1.OrgDetailsR\x04orgs"j\n\x10CreateKeyRequest\x12B\n\x0eauthorizations\x18\x01 \x03(\x0b2\x1a.viam.app.v1.AuthorizationR\x0eauthorizations\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name"5\n\x11CreateKeyResponse\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x0e\n\x02id\x18\x02 \x01(\tR\x02id""\n\x10DeleteKeyRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"\x13\n\x11DeleteKeyResponse"6\n\x10RenameKeyRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name"7\n\x11RenameKeyResponse\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name"\xcd\x01\n\x14AuthorizationDetails\x12-\n\x12authorization_type\x18\x01 \x01(\tR\x11authorizationType\x12)\n\x10authorization_id\x18\x02 \x01(\tR\x0fauthorizationId\x12#\n\rresource_type\x18\x03 \x01(\tR\x0cresourceType\x12\x1f\n\x0bresource_id\x18\x04 \x01(\tR\nresourceId\x12\x15\n\x06org_id\x18\x05 \x01(\tR\x05orgId"\x93\x01\n\x18APIKeyWithAuthorizations\x12,\n\x07api_key\x18\x01 \x01(\x0b2\x13.viam.app.v1.APIKeyR\x06apiKey\x12I\n\x0eauthorizations\x18\x02 \x03(\x0b2!.viam.app.v1.AuthorizationDetailsR\x0eauthorizations"(\n\x0fListKeysRequest\x12\x15\n\x06org_id\x18\x01 \x01(\tR\x05orgId"T\n\x10ListKeysResponse\x12@\n\x08api_keys\x18\x01 \x03(\x0b2%.viam.app.v1.APIKeyWithAuthorizationsR\x07apiKeys""\n\x10RotateKeyRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"5\n\x11RotateKeyResponse\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x10\n\x03key\x18\x02 \x01(\tR\x03key"?\n-CreateKeyFromExistingKeyAuthorizationsRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"R\n.CreateKeyFromExistingKeyAuthorizationsResponse\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x10\n\x03key\x18\x02 \x01(\tR\x03key*\xd1\x01\n\x12AuthenticationType\x12#\n\x1fAUTHENTICATION_TYPE_UNSPECIFIED\x10\x00\x12!\n\x1dAUTHENTICATION_TYPE_WEB_OAUTH\x10\x01\x12\x1f\n\x1bAUTHENTICATION_TYPE_API_KEY\x10\x02\x12)\n%AUTHENTICATION_TYPE_ROBOT_PART_SECRET\x10\x03\x12\'\n#AUTHENTICATION_TYPE_LOCATION_SECRET\x10\x04*\xa3\x01\n\x12FragmentVisibility\x12#\n\x1fFRAGMENT_VISIBILITY_UNSPECIFIED\x10\x00\x12\x1f\n\x1bFRAGMENT_VISIBILITY_PRIVATE\x10\x01\x12\x1e\n\x1aFRAGMENT_VISIBILITY_PUBLIC\x10\x02\x12\'\n#FRAGMENT_VISIBILITY_PUBLIC_UNLISTED\x10\x03*\x87\x01\n\x12RegistryItemStatus\x12$\n REGISTRY_ITEM_STATUS_UNSPECIFIED\x10\x00\x12"\n\x1eREGISTRY_ITEM_STATUS_PUBLISHED\x10\x01\x12\'\n#REGISTRY_ITEM_STATUS_IN_DEVELOPMENT\x10\x02*W\n\nVisibility\x12\x1a\n\x16VISIBILITY_UNSPECIFIED\x10\x00\x12\x16\n\x12VISIBILITY_PRIVATE\x10\x01\x12\x15\n\x11VISIBILITY_PUBLIC\x10\x022\xa86\n\nAppService\x12_\n\x10GetUserIDByEmail\x12$.viam.app.v1.GetUserIDByEmailRequest\x1a%.viam.app.v1.GetUserIDByEmailResponse\x12e\n\x12CreateOrganization\x12&.viam.app.v1.CreateOrganizationRequest\x1a\'.viam.app.v1.CreateOrganizationResponse\x12b\n\x11ListOrganizations\x12%.viam.app.v1.ListOrganizationsRequest\x1a&.viam.app.v1.ListOrganizationsResponse\x12\x9b\x01\n$GetOrganizationsWithAccessToLocation\x128.viam.app.v1.GetOrganizationsWithAccessToLocationRequest\x1a9.viam.app.v1.GetOrganizationsWithAccessToLocationResponse\x12t\n\x17ListOrganizationsByUser\x12+.viam.app.v1.ListOrganizationsByUserRequest\x1a,.viam.app.v1.ListOrganizationsByUserResponse\x12\\\n\x0fGetOrganization\x12#.viam.app.v1.GetOrganizationRequest\x1a$.viam.app.v1.GetOrganizationResponse\x12\x9b\x01\n$GetOrganizationNamespaceAvailability\x128.viam.app.v1.GetOrganizationNamespaceAvailabilityRequest\x1a9.viam.app.v1.GetOrganizationNamespaceAvailabilityResponse\x12e\n\x12UpdateOrganization\x12&.viam.app.v1.UpdateOrganizationRequest\x1a\'.viam.app.v1.UpdateOrganizationResponse\x12e\n\x12DeleteOrganization\x12&.viam.app.v1.DeleteOrganizationRequest\x1a\'.viam.app.v1.DeleteOrganizationResponse\x12t\n\x17ListOrganizationMembers\x12+.viam.app.v1.ListOrganizationMembersRequest\x1a,.viam.app.v1.ListOrganizationMembersResponse\x12w\n\x18CreateOrganizationInvite\x12,.viam.app.v1.CreateOrganizationInviteRequest\x1a-.viam.app.v1.CreateOrganizationInviteResponse\x12\xa1\x01\n&UpdateOrganizationInviteAuthorizations\x12:.viam.app.v1.UpdateOrganizationInviteAuthorizationsRequest\x1a;.viam.app.v1.UpdateOrganizationInviteAuthorizationsResponse\x12w\n\x18DeleteOrganizationMember\x12,.viam.app.v1.DeleteOrganizationMemberRequest\x1a-.viam.app.v1.DeleteOrganizationMemberResponse\x12w\n\x18DeleteOrganizationInvite\x12,.viam.app.v1.DeleteOrganizationInviteRequest\x1a-.viam.app.v1.DeleteOrganizationInviteResponse\x12w\n\x18ResendOrganizationInvite\x12,.viam.app.v1.ResendOrganizationInviteRequest\x1a-.viam.app.v1.ResendOrganizationInviteResponse\x12Y\n\x0eCreateLocation\x12".viam.app.v1.CreateLocationRequest\x1a#.viam.app.v1.CreateLocationResponse\x12P\n\x0bGetLocation\x12\x1f.viam.app.v1.GetLocationRequest\x1a .viam.app.v1.GetLocationResponse\x12Y\n\x0eUpdateLocation\x12".viam.app.v1.UpdateLocationRequest\x1a#.viam.app.v1.UpdateLocationResponse\x12Y\n\x0eDeleteLocation\x12".viam.app.v1.DeleteLocationRequest\x1a#.viam.app.v1.DeleteLocationResponse\x12V\n\rListLocations\x12!.viam.app.v1.ListLocationsRequest\x1a".viam.app.v1.ListLocationsResponse\x12V\n\rShareLocation\x12!.viam.app.v1.ShareLocationRequest\x1a".viam.app.v1.ShareLocationResponse\x12\\\n\x0fUnshareLocation\x12#.viam.app.v1.UnshareLocationRequest\x1a$.viam.app.v1.UnshareLocationResponse\x12S\n\x0cLocationAuth\x12 .viam.app.v1.LocationAuthRequest\x1a!.viam.app.v1.LocationAuthResponse\x12k\n\x14CreateLocationSecret\x12(.viam.app.v1.CreateLocationSecretRequest\x1a).viam.app.v1.CreateLocationSecretResponse\x12k\n\x14DeleteLocationSecret\x12(.viam.app.v1.DeleteLocationSecretRequest\x1a).viam.app.v1.DeleteLocationSecretResponse\x12G\n\x08GetRobot\x12\x1c.viam.app.v1.GetRobotRequest\x1a\x1d.viam.app.v1.GetRobotResponse\x12k\n\x14GetRoverRentalRobots\x12(.viam.app.v1.GetRoverRentalRobotsRequest\x1a).viam.app.v1.GetRoverRentalRobotsResponse\x12V\n\rGetRobotParts\x12!.viam.app.v1.GetRobotPartsRequest\x1a".viam.app.v1.GetRobotPartsResponse\x12S\n\x0cGetRobotPart\x12 .viam.app.v1.GetRobotPartRequest\x1a!.viam.app.v1.GetRobotPartResponse\x12_\n\x10GetRobotPartLogs\x12$.viam.app.v1.GetRobotPartLogsRequest\x1a%.viam.app.v1.GetRobotPartLogsResponse\x12d\n\x11TailRobotPartLogs\x12%.viam.app.v1.TailRobotPartLogsRequest\x1a&.viam.app.v1.TailRobotPartLogsResponse0\x01\x12h\n\x13GetRobotPartHistory\x12\'.viam.app.v1.GetRobotPartHistoryRequest\x1a(.viam.app.v1.GetRobotPartHistoryResponse\x12\\\n\x0fUpdateRobotPart\x12#.viam.app.v1.UpdateRobotPartRequest\x1a$.viam.app.v1.UpdateRobotPartResponse\x12S\n\x0cNewRobotPart\x12 .viam.app.v1.NewRobotPartRequest\x1a!.viam.app.v1.NewRobotPartResponse\x12\\\n\x0fDeleteRobotPart\x12#.viam.app.v1.DeleteRobotPartRequest\x1a$.viam.app.v1.DeleteRobotPartResponse\x12\\\n\x0fGetRobotAPIKeys\x12#.viam.app.v1.GetRobotAPIKeysRequest\x1a$.viam.app.v1.GetRobotAPIKeysResponse\x12Y\n\x0eMarkPartAsMain\x12".viam.app.v1.MarkPartAsMainRequest\x1a#.viam.app.v1.MarkPartAsMainResponse\x12e\n\x12MarkPartForRestart\x12&.viam.app.v1.MarkPartForRestartRequest\x1a\'.viam.app.v1.MarkPartForRestartResponse\x12n\n\x15CreateRobotPartSecret\x12).viam.app.v1.CreateRobotPartSecretRequest\x1a*.viam.app.v1.CreateRobotPartSecretResponse\x12n\n\x15DeleteRobotPartSecret\x12).viam.app.v1.DeleteRobotPartSecretRequest\x1a*.viam.app.v1.DeleteRobotPartSecretResponse\x12M\n\nListRobots\x12\x1e.viam.app.v1.ListRobotsRequest\x1a\x1f.viam.app.v1.ListRobotsResponse\x12G\n\x08NewRobot\x12\x1c.viam.app.v1.NewRobotRequest\x1a\x1d.viam.app.v1.NewRobotResponse\x12P\n\x0bUpdateRobot\x12\x1f.viam.app.v1.UpdateRobotRequest\x1a .viam.app.v1.UpdateRobotResponse\x12P\n\x0bDeleteRobot\x12\x1f.viam.app.v1.DeleteRobotRequest\x1a .viam.app.v1.DeleteRobotResponse\x12V\n\rListFragments\x12!.viam.app.v1.ListFragmentsRequest\x1a".viam.app.v1.ListFragmentsResponse\x12P\n\x0bGetFragment\x12\x1f.viam.app.v1.GetFragmentRequest\x1a .viam.app.v1.GetFragmentResponse\x12Y\n\x0eCreateFragment\x12".viam.app.v1.CreateFragmentRequest\x1a#.viam.app.v1.CreateFragmentResponse\x12Y\n\x0eUpdateFragment\x12".viam.app.v1.UpdateFragmentRequest\x1a#.viam.app.v1.UpdateFragmentResponse\x12Y\n\x0eDeleteFragment\x12".viam.app.v1.DeleteFragmentRequest\x1a#.viam.app.v1.DeleteFragmentResponse\x12D\n\x07AddRole\x12\x1b.viam.app.v1.AddRoleRequest\x1a\x1c.viam.app.v1.AddRoleResponse\x12M\n\nRemoveRole\x12\x1e.viam.app.v1.RemoveRoleRequest\x1a\x1f.viam.app.v1.RemoveRoleResponse\x12M\n\nChangeRole\x12\x1e.viam.app.v1.ChangeRoleRequest\x1a\x1f.viam.app.v1.ChangeRoleResponse\x12e\n\x12ListAuthorizations\x12&.viam.app.v1.ListAuthorizationsRequest\x1a\'.viam.app.v1.ListAuthorizationsResponse\x12_\n\x10CheckPermissions\x12$.viam.app.v1.CheckPermissionsRequest\x1a%.viam.app.v1.CheckPermissionsResponse\x12\\\n\x0fGetRegistryItem\x12#.viam.app.v1.GetRegistryItemRequest\x1a$.viam.app.v1.GetRegistryItemResponse\x12e\n\x12CreateRegistryItem\x12&.viam.app.v1.CreateRegistryItemRequest\x1a\'.viam.app.v1.CreateRegistryItemResponse\x12e\n\x12UpdateRegistryItem\x12&.viam.app.v1.UpdateRegistryItemRequest\x1a\'.viam.app.v1.UpdateRegistryItemResponse\x12b\n\x11ListRegistryItems\x12%.viam.app.v1.ListRegistryItemsRequest\x1a&.viam.app.v1.ListRegistryItemsResponse\x12e\n\x12DeleteRegistryItem\x12&.viam.app.v1.DeleteRegistryItemRequest\x1a\'.viam.app.v1.DeleteRegistryItemResponse\x12k\n\x14TransferRegistryItem\x12(.viam.app.v1.TransferRegistryItemRequest\x1a).viam.app.v1.TransferRegistryItemResponse\x12S\n\x0cCreateModule\x12 .viam.app.v1.CreateModuleRequest\x1a!.viam.app.v1.CreateModuleResponse\x12S\n\x0cUpdateModule\x12 .viam.app.v1.UpdateModuleRequest\x1a!.viam.app.v1.UpdateModuleResponse\x12a\n\x10UploadModuleFile\x12$.viam.app.v1.UploadModuleFileRequest\x1a%.viam.app.v1.UploadModuleFileResponse(\x01\x12J\n\tGetModule\x12\x1d.viam.app.v1.GetModuleRequest\x1a\x1e.viam.app.v1.GetModuleResponse\x12P\n\x0bListModules\x12\x1f.viam.app.v1.ListModulesRequest\x1a .viam.app.v1.ListModulesResponse\x12J\n\tCreateKey\x12\x1d.viam.app.v1.CreateKeyRequest\x1a\x1e.viam.app.v1.CreateKeyResponse\x12J\n\tDeleteKey\x12\x1d.viam.app.v1.DeleteKeyRequest\x1a\x1e.viam.app.v1.DeleteKeyResponse\x12G\n\x08ListKeys\x12\x1c.viam.app.v1.ListKeysRequest\x1a\x1d.viam.app.v1.ListKeysResponse\x12J\n\tRenameKey\x12\x1d.viam.app.v1.RenameKeyRequest\x1a\x1e.viam.app.v1.RenameKeyResponse\x12J\n\tRotateKey\x12\x1d.viam.app.v1.RotateKeyRequest\x1a\x1e.viam.app.v1.RotateKeyResponse\x12\xa1\x01\n&CreateKeyFromExistingKeyAuthorizations\x12:.viam.app.v1.CreateKeyFromExistingKeyAuthorizationsRequest\x1a;.viam.app.v1.CreateKeyFromExistingKeyAuthorizationsResponseB\x18Z\x16go.viam.com/api/app/v1b\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10app/v1/app.proto\x12\x0bviam.app.v1\x1a#app/mltraining/v1/ml_training.proto\x1a\x1eapp/packages/v1/packages.proto\x1a\x16common/v1/common.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x16tagger/v1/tagger.proto"\xec\x02\n\x05Robot\x123\n\x02id\x18\x01 \x01(\tB#\x9a\x84\x9e\x03\x1ebson:"_id" json:"id,omitempty"R\x02id\x120\n\x04name\x18\x02 \x01(\tB\x1c\x9a\x84\x9e\x03\x17bson:"name" json:"name"R\x04name\x12@\n\x08location\x18\x03 \x01(\tB$\x9a\x84\x9e\x03\x1fbson:"location" json:"location"R\x08location\x12g\n\x0blast_access\x18\x04 \x01(\x0b2\x1a.google.protobuf.TimestampB*\x9a\x84\x9e\x03%bson:"last_access" json:"last_access"R\nlastAccess\x12Q\n\ncreated_on\x18\x05 \x01(\x0b2\x1a.google.protobuf.TimestampB\x16\x9a\x84\x9e\x03\x11bson:"created_on"R\tcreatedOn"\xd3\x07\n\tRobotPart\x123\n\x02id\x18\x01 \x01(\tB#\x9a\x84\x9e\x03\x1ebson:"_id" json:"id,omitempty"R\x02id\x120\n\x04name\x18\x02 \x01(\tB\x1c\x9a\x84\x9e\x03\x17bson:"name" json:"name"R\x04name\x12?\n\x08dns_name\x18\n \x01(\tB$\x9a\x84\x9e\x03\x1fbson:"dns_name" json:"dns_name"R\x07dnsName\x12B\n\x06secret\x18\x03 \x01(\tB*\x9a\x84\x9e\x03%bson:"secret" json:"secret,omitempty"R\x06secret\x124\n\x05robot\x18\x04 \x01(\tB\x1e\x9a\x84\x9e\x03\x19bson:"robot" json:"robot"R\x05robot\x12A\n\x0blocation_id\x18\x0c \x01(\tB \x9a\x84\x9e\x03\x1bbson:"location_id" json:"-"R\nlocationId\x12b\n\x0crobot_config\x18\x05 \x01(\x0b2\x17.google.protobuf.StructB&\x9a\x84\x9e\x03!bson:"config" json:"robot_config"R\x0brobotConfig\x12g\n\x0blast_access\x18\x06 \x01(\x0b2\x1a.google.protobuf.TimestampB*\x9a\x84\x9e\x03%bson:"last_access" json:"last_access"R\nlastAccess\x12\x7f\n\x12user_supplied_info\x18\x07 \x01(\x0b2\x17.google.protobuf.StructB8\x9a\x84\x9e\x033bson:"user_supplied_info" json:"user_supplied_info"R\x10userSuppliedInfo\x12C\n\tmain_part\x18\x08 \x01(\x08B&\x9a\x84\x9e\x03!bson:"main_part" json:"main_part"R\x08mainPart\x12\x12\n\x04fqdn\x18\t \x01(\tR\x04fqdn\x12\x1d\n\nlocal_fqdn\x18\x0b \x01(\tR\tlocalFqdn\x12Q\n\ncreated_on\x18\r \x01(\x0b2\x1a.google.protobuf.TimestampB\x16\x9a\x84\x9e\x03\x11bson:"created_on"R\tcreatedOn\x12H\n\x07secrets\x18\x0e \x03(\x0b2\x19.viam.app.v1.SharedSecretB\x13\x9a\x84\x9e\x03\x0ebson:"secrets"R\x07secrets"\xf8\x02\n\x15RobotPartHistoryEntry\x120\n\x04part\x18\x01 \x01(\tB\x1c\x9a\x84\x9e\x03\x17bson:"part" json:"part"R\x04part\x124\n\x05robot\x18\x02 \x01(\tB\x1e\x9a\x84\x9e\x03\x19bson:"robot" json:"robot"R\x05robot\x12L\n\x04when\x18\x03 \x01(\x0b2\x1a.google.protobuf.TimestampB\x1c\x9a\x84\x9e\x03\x17bson:"when" json:"when"R\x04when\x12D\n\x03old\x18\x04 \x01(\x0b2\x16.viam.app.v1.RobotPartB\x1a\x9a\x84\x9e\x03\x15bson:"old" json:"old"R\x03old\x12c\n\tedited_by\x18\x05 \x01(\x0b2\x1e.viam.app.v1.AuthenticatorInfoB&\x9a\x84\x9e\x03!bson:"edited_by" json:"edited_by"R\x08editedBy"\x85\x01\n\x11AuthenticatorInfo\x123\n\x04type\x18\x01 \x01(\x0e2\x1f.viam.app.v1.AuthenticationTypeR\x04type\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value\x12%\n\x0eis_deactivated\x18\x03 \x01(\x08R\risDeactivated"\x1a\n\x18ListOrganizationsRequest"\xde\x01\n\x0cOrganization\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x129\n\ncreated_on\x18\x03 \x01(\x0b2\x1a.google.protobuf.TimestampR\tcreatedOn\x12)\n\x10public_namespace\x18\x04 \x01(\tR\x0fpublicNamespace\x12%\n\x0edefault_region\x18\x05 \x01(\tR\rdefaultRegion\x12\x15\n\x03cid\x18\x06 \x01(\tH\x00R\x03cid\x88\x01\x01B\x06\n\x04_cid"\xcf\x01\n\x12OrganizationMember\x12\x17\n\x07user_id\x18\x01 \x01(\tR\x06userId\x12\x16\n\x06emails\x18\x02 \x03(\tR\x06emails\x129\n\ndate_added\x18\x03 \x01(\x0b2\x1a.google.protobuf.TimestampR\tdateAdded\x12>\n\nlast_login\x18\x04 \x01(\x0b2\x1a.google.protobuf.TimestampH\x00R\tlastLogin\x88\x01\x01B\r\n\x0b_last_login"\\\n\x19ListOrganizationsResponse\x12?\n\rorganizations\x18\x01 \x03(\x0b2\x19.viam.app.v1.OrganizationR\rorganizations"\xd2\x01\n\x12OrganizationInvite\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12\x14\n\x05email\x18\x02 \x01(\tR\x05email\x129\n\ncreated_on\x18\x03 \x01(\x0b2\x1a.google.protobuf.TimestampR\tcreatedOn\x12B\n\x0eauthorizations\x18\x04 \x03(\x0b2\x1a.viam.app.v1.AuthorizationR\x0eauthorizations"/\n\x19CreateOrganizationRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name"[\n\x1aCreateOrganizationResponse\x12=\n\x0corganization\x18\x01 \x01(\x0b2\x19.viam.app.v1.OrganizationR\x0corganization"A\n\x16GetOrganizationRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId"X\n\x17GetOrganizationResponse\x12=\n\x0corganization\x18\x01 \x01(\x0b2\x19.viam.app.v1.OrganizationR\x0corganization"X\n+GetOrganizationNamespaceAvailabilityRequest\x12)\n\x10public_namespace\x18\x01 \x01(\tR\x0fpublicNamespace"L\n,GetOrganizationNamespaceAvailabilityResponse\x12\x1c\n\tavailable\x18\x01 \x01(\x08R\tavailable"\xf2\x01\n\x19UpdateOrganizationRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12\x17\n\x04name\x18\x02 \x01(\tH\x00R\x04name\x88\x01\x01\x12.\n\x10public_namespace\x18\x03 \x01(\tH\x01R\x0fpublicNamespace\x88\x01\x01\x12\x1b\n\x06region\x18\x04 \x01(\tH\x02R\x06region\x88\x01\x01\x12\x15\n\x03cid\x18\x05 \x01(\tH\x03R\x03cid\x88\x01\x01B\x07\n\x05_nameB\x13\n\x11_public_namespaceB\t\n\x07_regionB\x06\n\x04_cid"[\n\x1aUpdateOrganizationResponse\x12=\n\x0corganization\x18\x01 \x01(\x0b2\x19.viam.app.v1.OrganizationR\x0corganization"D\n\x19DeleteOrganizationRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId"\x1c\n\x1aDeleteOrganizationResponse"I\n\x1eListOrganizationMembersRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId"\xc0\x01\n\x1fListOrganizationMembersResponse\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x129\n\x07members\x18\x02 \x03(\x0b2\x1f.viam.app.v1.OrganizationMemberR\x07members\x129\n\x07invites\x18\x03 \x03(\x0b2\x1f.viam.app.v1.OrganizationInviteR\x07invites"\xeb\x01\n\x1fCreateOrganizationInviteRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12\x14\n\x05email\x18\x02 \x01(\tR\x05email\x12B\n\x0eauthorizations\x18\x03 \x03(\x0b2\x1a.viam.app.v1.AuthorizationR\x0eauthorizations\x12/\n\x11send_email_invite\x18\x04 \x01(\x08H\x00R\x0fsendEmailInvite\x88\x01\x01B\x14\n\x12_send_email_invite"[\n CreateOrganizationInviteResponse\x127\n\x06invite\x18\x01 \x01(\x0b2\x1f.viam.app.v1.OrganizationInviteR\x06invite"\x8a\x02\n-UpdateOrganizationInviteAuthorizationsRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12\x14\n\x05email\x18\x02 \x01(\tR\x05email\x12I\n\x12add_authorizations\x18\x03 \x03(\x0b2\x1a.viam.app.v1.AuthorizationR\x11addAuthorizations\x12O\n\x15remove_authorizations\x18\x04 \x03(\x0b2\x1a.viam.app.v1.AuthorizationR\x14removeAuthorizations"i\n.UpdateOrganizationInviteAuthorizationsResponse\x127\n\x06invite\x18\x01 \x01(\x0b2\x1f.viam.app.v1.OrganizationInviteR\x06invite"`\n\x1fDeleteOrganizationInviteRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12\x14\n\x05email\x18\x02 \x01(\tR\x05email""\n DeleteOrganizationInviteResponse"`\n\x1fResendOrganizationInviteRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12\x14\n\x05email\x18\x02 \x01(\tR\x05email"[\n ResendOrganizationInviteResponse\x127\n\x06invite\x18\x01 \x01(\x0b2\x1f.viam.app.v1.OrganizationInviteR\x06invite"c\n\x1fDeleteOrganizationMemberRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12\x17\n\x07user_id\x18\x02 \x01(\tR\x06userId""\n DeleteOrganizationMemberResponse":\n\x14OrganizationIdentity\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name"Y\n\x14LocationOrganization\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12\x18\n\x07primary\x18\x02 \x01(\x08R\x07primary"\x80\x01\n\x0cLocationAuth\x12\x1a\n\x06secret\x18\x01 \x01(\tB\x02\x18\x01R\x06secret\x12\x1f\n\x0blocation_id\x18\x02 \x01(\tR\nlocationId\x123\n\x07secrets\x18\x03 \x03(\x0b2\x19.viam.app.v1.SharedSecretR\x07secrets"\'\n\rStorageConfig\x12\x16\n\x06region\x18\x01 \x01(\tR\x06region"\xe4\x02\n\x08Location\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x12,\n\x12parent_location_id\x18\x04 \x01(\tR\x10parentLocationId\x12-\n\x04auth\x18\x05 \x01(\x0b2\x19.viam.app.v1.LocationAuthR\x04auth\x12G\n\rorganizations\x18\x06 \x03(\x0b2!.viam.app.v1.LocationOrganizationR\rorganizations\x129\n\ncreated_on\x18\x03 \x01(\x0b2\x1a.google.protobuf.TimestampR\tcreatedOn\x12\x1f\n\x0brobot_count\x18\x07 \x01(\x05R\nrobotCount\x122\n\x06config\x18\x08 \x01(\x0b2\x1a.viam.app.v1.StorageConfigR\x06config"\xd0\x02\n\x0cSharedSecret\x12\x1e\n\x02id\x18\x01 \x01(\tB\x0e\x9a\x84\x9e\x03\tbson:"id"R\x02id\x12*\n\x06secret\x18\x02 \x01(\tB\x12\x9a\x84\x9e\x03\rbson:"secret"R\x06secret\x12c\n\ncreated_on\x18\x03 \x01(\x0b2\x1a.google.protobuf.TimestampB(\x9a\x84\x9e\x03#bson:"created_on" json:"created_on"R\tcreatedOn\x12H\n\x05state\x18\x04 \x01(\x0e2\x1f.viam.app.v1.SharedSecret.StateB\x11\x9a\x84\x9e\x03\x0cbson:"state"R\x05state"E\n\x05State\x12\x15\n\x11STATE_UNSPECIFIED\x10\x00\x12\x11\n\rSTATE_ENABLED\x10\x01\x12\x12\n\x0eSTATE_DISABLED\x10\x02"\x9e\x01\n\x15CreateLocationRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x121\n\x12parent_location_id\x18\x03 \x01(\tH\x00R\x10parentLocationId\x88\x01\x01B\x15\n\x13_parent_location_id"K\n\x16CreateLocationResponse\x121\n\x08location\x18\x01 \x01(\x0b2\x15.viam.app.v1.LocationR\x08location"5\n\x12GetLocationRequest\x12\x1f\n\x0blocation_id\x18\x01 \x01(\tR\nlocationId"H\n\x13GetLocationResponse\x121\n\x08location\x18\x01 \x01(\x0b2\x15.viam.app.v1.LocationR\x08location"\xcc\x01\n\x15UpdateLocationRequest\x12\x1f\n\x0blocation_id\x18\x01 \x01(\tR\nlocationId\x12\x17\n\x04name\x18\x02 \x01(\tH\x00R\x04name\x88\x01\x01\x121\n\x12parent_location_id\x18\x03 \x01(\tH\x01R\x10parentLocationId\x88\x01\x01\x12\x1b\n\x06region\x18\x04 \x01(\tH\x02R\x06region\x88\x01\x01B\x07\n\x05_nameB\x15\n\x13_parent_location_idB\t\n\x07_region"K\n\x16UpdateLocationResponse\x121\n\x08location\x18\x01 \x01(\x0b2\x15.viam.app.v1.LocationR\x08location"8\n\x15DeleteLocationRequest\x12\x1f\n\x0blocation_id\x18\x01 \x01(\tR\nlocationId"\x18\n\x16DeleteLocationResponse"N\n+GetOrganizationsWithAccessToLocationRequest\x12\x1f\n\x0blocation_id\x18\x01 \x01(\tR\nlocationId"\x8a\x01\n,GetOrganizationsWithAccessToLocationResponse\x12Z\n\x17organization_identities\x18\x01 \x03(\x0b2!.viam.app.v1.OrganizationIdentityR\x16organizationIdentities"?\n\x14ListLocationsRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId"`\n\x14ShareLocationRequest\x12\x1f\n\x0blocation_id\x18\x01 \x01(\tR\nlocationId\x12\'\n\x0forganization_id\x18\x02 \x01(\tR\x0eorganizationId"\x17\n\x15ShareLocationResponse"b\n\x16UnshareLocationRequest\x12\x1f\n\x0blocation_id\x18\x01 \x01(\tR\nlocationId\x12\'\n\x0forganization_id\x18\x02 \x01(\tR\x0eorganizationId"\x19\n\x17UnshareLocationResponse"L\n\x15ListLocationsResponse\x123\n\tlocations\x18\x01 \x03(\x0b2\x15.viam.app.v1.LocationR\tlocations">\n\x1bCreateLocationSecretRequest\x12\x1f\n\x0blocation_id\x18\x01 \x01(\tR\nlocationId"M\n\x1cCreateLocationSecretResponse\x12-\n\x04auth\x18\x01 \x01(\x0b2\x19.viam.app.v1.LocationAuthR\x04auth"[\n\x1bDeleteLocationSecretRequest\x12\x1f\n\x0blocation_id\x18\x01 \x01(\tR\nlocationId\x12\x1b\n\tsecret_id\x18\x02 \x01(\tR\x08secretId"\x1e\n\x1cDeleteLocationSecretResponse"6\n\x13LocationAuthRequest\x12\x1f\n\x0blocation_id\x18\x01 \x01(\tR\nlocationId"E\n\x14LocationAuthResponse\x12-\n\x04auth\x18\x01 \x01(\x0b2\x19.viam.app.v1.LocationAuthR\x04auth"!\n\x0fGetRobotRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"4\n\x1bGetRoverRentalRobotsRequest\x12\x15\n\x06org_id\x18\x01 \x01(\tR\x05orgId"\x9a\x01\n\x10RoverRentalRobot\x12\x19\n\x08robot_id\x18\x01 \x01(\tR\x07robotId\x12\x1f\n\x0blocation_id\x18\x02 \x01(\tR\nlocationId\x12\x1d\n\nrobot_name\x18\x03 \x01(\tR\trobotName\x12+\n\x12robot_main_part_id\x18\x04 \x01(\tR\x0frobotMainPartId"U\n\x1cGetRoverRentalRobotsResponse\x125\n\x06robots\x18\x01 \x03(\x0b2\x1d.viam.app.v1.RoverRentalRobotR\x06robots"<\n\x10GetRobotResponse\x12(\n\x05robot\x18\x01 \x01(\x0b2\x12.viam.app.v1.RobotR\x05robot"1\n\x14GetRobotPartsRequest\x12\x19\n\x08robot_id\x18\x01 \x01(\tR\x07robotId"E\n\x15GetRobotPartsResponse\x12,\n\x05parts\x18\x01 \x03(\x0b2\x16.viam.app.v1.RobotPartR\x05parts"%\n\x13GetRobotPartRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"c\n\x14GetRobotPartResponse\x12*\n\x04part\x18\x01 \x01(\x0b2\x16.viam.app.v1.RobotPartR\x04part\x12\x1f\n\x0bconfig_json\x18\x02 \x01(\tR\nconfigJson"\xc1\x01\n\x17GetRobotPartLogsRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12#\n\x0berrors_only\x18\x02 \x01(\x08B\x02\x18\x01R\nerrorsOnly\x12\x1b\n\x06filter\x18\x03 \x01(\tH\x00R\x06filter\x88\x01\x01\x12"\n\npage_token\x18\x04 \x01(\tH\x01R\tpageToken\x88\x01\x01\x12\x16\n\x06levels\x18\x05 \x03(\tR\x06levelsB\t\n\x07_filterB\r\n\x0b_page_token"p\n\x18GetRobotPartLogsResponse\x12,\n\x04logs\x18\x01 \x03(\x0b2\x18.viam.common.v1.LogEntryR\x04logs\x12&\n\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken"s\n\x18TailRobotPartLogsRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x1f\n\x0berrors_only\x18\x02 \x01(\x08R\nerrorsOnly\x12\x1b\n\x06filter\x18\x03 \x01(\tH\x00R\x06filter\x88\x01\x01B\t\n\x07_filter"I\n\x19TailRobotPartLogsResponse\x12,\n\x04logs\x18\x01 \x03(\x0b2\x18.viam.common.v1.LogEntryR\x04logs",\n\x1aGetRobotPartHistoryRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"[\n\x1bGetRobotPartHistoryResponse\x12<\n\x07history\x18\x01 \x03(\x0b2".viam.app.v1.RobotPartHistoryEntryR\x07history"x\n\x16UpdateRobotPartRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x12:\n\x0crobot_config\x18\x03 \x01(\x0b2\x17.google.protobuf.StructR\x0brobotConfig"E\n\x17UpdateRobotPartResponse\x12*\n\x04part\x18\x01 \x01(\x0b2\x16.viam.app.v1.RobotPartR\x04part"M\n\x13NewRobotPartRequest\x12\x19\n\x08robot_id\x18\x01 \x01(\tR\x07robotId\x12\x1b\n\tpart_name\x18\x02 \x01(\tR\x08partName"/\n\x14NewRobotPartResponse\x12\x17\n\x07part_id\x18\x01 \x01(\tR\x06partId"1\n\x16DeleteRobotPartRequest\x12\x17\n\x07part_id\x18\x01 \x01(\tR\x06partId"3\n\x16GetRobotAPIKeysRequest\x12\x19\n\x08robot_id\x18\x01 \x01(\tR\x07robotId"y\n\x06APIKey\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x10\n\x03key\x18\x02 \x01(\tR\x03key\x12\x12\n\x04name\x18\x03 \x01(\tR\x04name\x129\n\ncreated_on\x18\x04 \x01(\x0b2\x1a.google.protobuf.TimestampR\tcreatedOn"[\n\x17GetRobotAPIKeysResponse\x12@\n\x08api_keys\x18\x01 \x03(\x0b2%.viam.app.v1.APIKeyWithAuthorizationsR\x07apiKeys"\x19\n\x17DeleteRobotPartResponse"\xa9\x05\n\x08Fragment\x123\n\x02id\x18\x01 \x01(\tB#\x9a\x84\x9e\x03\x1ebson:"_id" json:"id,omitempty"R\x02id\x120\n\x04name\x18\x02 \x01(\tB\x1c\x9a\x84\x9e\x03\x17bson:"name" json:"name"R\x04name\x12Y\n\x08fragment\x18\x03 \x01(\x0b2\x17.google.protobuf.StructB$\x9a\x84\x9e\x03\x1fbson:"fragment" json:"fragment"R\x08fragment\x12Z\n\x12organization_owner\x18\x04 \x01(\tB+\x9a\x84\x9e\x03&bson:"organization_owner" json:"owner"R\x11organizationOwner\x128\n\x06public\x18\x05 \x01(\x08B \x9a\x84\x9e\x03\x1bbson:"public" json:"public"R\x06public\x12Q\n\ncreated_on\x18\x06 \x01(\x0b2\x1a.google.protobuf.TimestampB\x16\x9a\x84\x9e\x03\x11bson:"created_on"R\tcreatedOn\x12+\n\x11organization_name\x18\x07 \x01(\tR\x10organizationName\x12(\n\x10robot_part_count\x18\t \x01(\x05R\x0erobotPartCount\x12-\n\x12organization_count\x18\n \x01(\x05R\x11organizationCount\x12+\n\x12only_used_by_owner\x18\x0b \x01(\x08R\x0fonlyUsedByOwner\x12?\n\nvisibility\x18\x0c \x01(\x0e2\x1f.viam.app.v1.FragmentVisibilityR\nvisibility"\xe3\x02\n\x14FragmentHistoryEntry\x12@\n\x08fragment\x18\x01 \x01(\tB$\x9a\x84\x9e\x03\x1fbson:"fragment" json:"fragment"R\x08fragment\x12_\n\tedited_on\x18\x02 \x01(\x0b2\x1a.google.protobuf.TimestampB&\x9a\x84\x9e\x03!bson:"edited_on" json:"edited_on"R\x08editedOn\x12C\n\x03old\x18\x03 \x01(\x0b2\x15.viam.app.v1.FragmentB\x1a\x9a\x84\x9e\x03\x15bson:"old" json:"old"R\x03old\x12c\n\tedited_by\x18\x04 \x01(\x0b2\x1e.viam.app.v1.AuthenticatorInfoB&\x9a\x84\x9e\x03!bson:"edited_by" json:"edited_by"R\x08editedBy"\xb2\x01\n\x14ListFragmentsRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12\x1f\n\x0bshow_public\x18\x02 \x01(\x08R\nshowPublic\x12P\n\x13fragment_visibility\x18\x03 \x03(\x0e2\x1f.viam.app.v1.FragmentVisibilityR\x12fragmentVisibility"L\n\x15ListFragmentsResponse\x123\n\tfragments\x18\x01 \x03(\x0b2\x15.viam.app.v1.FragmentR\tfragments"$\n\x12GetFragmentRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"H\n\x13GetFragmentResponse\x121\n\x08fragment\x18\x01 \x01(\x0b2\x15.viam.app.v1.FragmentR\x08fragment"\x85\x01\n\x15CreateFragmentRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12/\n\x06config\x18\x02 \x01(\x0b2\x17.google.protobuf.StructR\x06config\x12\'\n\x0forganization_id\x18\x03 \x01(\tR\x0eorganizationId"K\n\x16CreateFragmentResponse\x121\n\x08fragment\x18\x01 \x01(\x0b2\x15.viam.app.v1.FragmentR\x08fragment"\xe9\x01\n\x15UpdateFragmentRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x12/\n\x06config\x18\x03 \x01(\x0b2\x17.google.protobuf.StructR\x06config\x12\x1b\n\x06public\x18\x04 \x01(\x08H\x00R\x06public\x88\x01\x01\x12D\n\nvisibility\x18\x05 \x01(\x0e2\x1f.viam.app.v1.FragmentVisibilityH\x01R\nvisibility\x88\x01\x01B\t\n\x07_publicB\r\n\x0b_visibility"K\n\x16UpdateFragmentResponse\x121\n\x08fragment\x18\x01 \x01(\x0b2\x15.viam.app.v1.FragmentR\x08fragment"\'\n\x15DeleteFragmentRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"\x18\n\x16DeleteFragmentResponse"\x91\x01\n\x19GetFragmentHistoryRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12"\n\npage_token\x18\x02 \x01(\tH\x00R\tpageToken\x88\x01\x01\x12"\n\npage_limit\x18\x03 \x01(\x03H\x01R\tpageLimit\x88\x01\x01B\r\n\x0b_page_tokenB\r\n\x0b_page_limit"\x81\x01\n\x1aGetFragmentHistoryResponse\x12;\n\x07history\x18\x01 \x03(\x0b2!.viam.app.v1.FragmentHistoryEntryR\x07history\x12&\n\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken"4\n\x11ListRobotsRequest\x12\x1f\n\x0blocation_id\x18\x01 \x01(\tR\nlocationId"@\n\x12ListRobotsResponse\x12*\n\x06robots\x18\x01 \x03(\x0b2\x12.viam.app.v1.RobotR\x06robots"A\n\x0fNewRobotRequest\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x1a\n\x08location\x18\x02 \x01(\tR\x08location""\n\x10NewRobotResponse\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"T\n\x12UpdateRobotRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x12\x1a\n\x08location\x18\x03 \x01(\tR\x08location"?\n\x13UpdateRobotResponse\x12(\n\x05robot\x18\x01 \x01(\x0b2\x12.viam.app.v1.RobotR\x05robot"$\n\x12DeleteRobotRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"\x15\n\x13DeleteRobotResponse"0\n\x15MarkPartAsMainRequest\x12\x17\n\x07part_id\x18\x01 \x01(\tR\x06partId"\x18\n\x16MarkPartAsMainResponse"4\n\x19MarkPartForRestartRequest\x12\x17\n\x07part_id\x18\x01 \x01(\tR\x06partId"\x1c\n\x1aMarkPartForRestartResponse"7\n\x1cCreateRobotPartSecretRequest\x12\x17\n\x07part_id\x18\x01 \x01(\tR\x06partId"K\n\x1dCreateRobotPartSecretResponse\x12*\n\x04part\x18\x01 \x01(\x0b2\x16.viam.app.v1.RobotPartR\x04part"T\n\x1cDeleteRobotPartSecretRequest\x12\x17\n\x07part_id\x18\x01 \x01(\tR\x06partId\x12\x1b\n\tsecret_id\x18\x02 \x01(\tR\x08secretId"\x1f\n\x1dDeleteRobotPartSecretResponse"\x9e\x02\n\rAuthorization\x12-\n\x12authorization_type\x18\x01 \x01(\tR\x11authorizationType\x12)\n\x10authorization_id\x18\x02 \x01(\tR\x0fauthorizationId\x12#\n\rresource_type\x18\x03 \x01(\tR\x0cresourceType\x12\x1f\n\x0bresource_id\x18\x04 \x01(\tR\nresourceId\x12\x1f\n\x0bidentity_id\x18\x05 \x01(\tR\nidentityId\x12\'\n\x0forganization_id\x18\x06 \x01(\tR\x0eorganizationId\x12#\n\ridentity_type\x18\x07 \x01(\tR\x0cidentityType"R\n\x0eAddRoleRequest\x12@\n\rauthorization\x18\x01 \x01(\x0b2\x1a.viam.app.v1.AuthorizationR\rauthorization"\x11\n\x0fAddRoleResponse"U\n\x11RemoveRoleRequest\x12@\n\rauthorization\x18\x01 \x01(\x0b2\x1a.viam.app.v1.AuthorizationR\rauthorization"\x14\n\x12RemoveRoleResponse"\xa5\x01\n\x11ChangeRoleRequest\x12G\n\x11old_authorization\x18\x01 \x01(\x0b2\x1a.viam.app.v1.AuthorizationR\x10oldAuthorization\x12G\n\x11new_authorization\x18\x02 \x01(\x0b2\x1a.viam.app.v1.AuthorizationR\x10newAuthorization"\x14\n\x12ChangeRoleResponse"g\n\x19ListAuthorizationsRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12!\n\x0cresource_ids\x18\x02 \x03(\tR\x0bresourceIds"`\n\x1aListAuthorizationsResponse\x12B\n\x0eauthorizations\x18\x01 \x03(\x0b2\x1a.viam.app.v1.AuthorizationR\x0eauthorizations"_\n\x17CheckPermissionsRequest\x12D\n\x0bpermissions\x18\x01 \x03(\x0b2".viam.app.v1.AuthorizedPermissionsR\x0bpermissions"\x7f\n\x15AuthorizedPermissions\x12#\n\rresource_type\x18\x01 \x01(\tR\x0cresourceType\x12\x1f\n\x0bresource_id\x18\x02 \x01(\tR\nresourceId\x12 \n\x0bpermissions\x18\x03 \x03(\tR\x0bpermissions"u\n\x18CheckPermissionsResponse\x12Y\n\x16authorized_permissions\x18\x01 \x03(\x0b2".viam.app.v1.AuthorizedPermissionsR\x15authorizedPermissions"\xa1\x01\n\rModuleVersion\x12\x18\n\x07version\x18\x01 \x01(\tR\x07version\x12*\n\x05files\x18\x02 \x03(\x0b2\x14.viam.app.v1.UploadsR\x05files\x12*\n\x06models\x18\x03 \x03(\x0b2\x12.viam.app.v1.ModelR\x06models\x12\x1e\n\nentrypoint\x18\x04 \x01(\tR\nentrypoint"\x94\x01\n\x0eModuleMetadata\x12*\n\x06models\x18\x01 \x03(\x0b2\x12.viam.app.v1.ModelR\x06models\x126\n\x08versions\x18\x02 \x03(\x0b2\x1a.viam.app.v1.ModuleVersionR\x08versions\x12\x1e\n\nentrypoint\x18\x03 \x01(\tR\nentrypoint"\xc0\x01\n\x0fMLModelMetadata\x12\x1a\n\x08versions\x18\x01 \x03(\tR\x08versions\x12@\n\nmodel_type\x18\x02 \x01(\x0e2!.viam.app.mltraining.v1.ModelTypeR\tmodelType\x12O\n\x0fmodel_framework\x18\x03 \x01(\x0e2&.viam.app.mltraining.v1.ModelFrameworkR\x0emodelFramework"h\n\x11MLTrainingVersion\x12\x18\n\x07version\x18\x01 \x01(\tR\x07version\x129\n\ncreated_on\x18\x02 \x01(\x0b2\x1a.google.protobuf.TimestampR\tcreatedOn"\xff\x01\n\x12MLTrainingMetadata\x12:\n\x08versions\x18\x05 \x03(\x0b2\x1e.viam.app.v1.MLTrainingVersionR\x08versions\x12@\n\nmodel_type\x18\x02 \x01(\x0e2!.viam.app.mltraining.v1.ModelTypeR\tmodelType\x12O\n\x0fmodel_framework\x18\x03 \x01(\x0e2&.viam.app.mltraining.v1.ModelFrameworkR\x0emodelFramework\x12\x14\n\x05draft\x18\x04 \x01(\x08R\x05draftJ\x04\x08\x01\x10\x02"\x8c\x07\n\x0cRegistryItem\x12\x17\n\x07item_id\x18\x01 \x01(\tR\x06itemId\x12\'\n\x0forganization_id\x18\x02 \x01(\tR\x0eorganizationId\x12)\n\x10public_namespace\x18\x03 \x01(\tR\x0fpublicNamespace\x12\x12\n\x04name\x18\x04 \x01(\tR\x04name\x125\n\x04type\x18\x05 \x01(\x0e2!.viam.app.packages.v1.PackageTypeR\x04type\x127\n\nvisibility\x18\x06 \x01(\x0e2\x17.viam.app.v1.VisibilityR\nvisibility\x12\x10\n\x03url\x18\x07 \x01(\tR\x03url\x12 \n\x0bdescription\x18\x08 \x01(\tR\x0bdescription\x12*\n\x11total_robot_usage\x18\t \x01(\x03R\x0ftotalRobotUsage\x12;\n\x1atotal_external_robot_usage\x18\r \x01(\x03R\x17totalExternalRobotUsage\x128\n\x18total_organization_usage\x18\n \x01(\x03R\x16totalOrganizationUsage\x12I\n!total_external_organization_usage\x18\x0e \x01(\x03R\x1etotalExternalOrganizationUsage\x12F\n\x0fmodule_metadata\x18\x0b \x01(\x0b2\x1b.viam.app.v1.ModuleMetadataH\x00R\x0emoduleMetadata\x12J\n\x11ml_model_metadata\x18\x0c \x01(\x0b2\x1c.viam.app.v1.MLModelMetadataH\x00R\x0fmlModelMetadata\x12S\n\x14ml_training_metadata\x18\x12 \x01(\x0b2\x1f.viam.app.v1.MLTrainingMetadataH\x00R\x12mlTrainingMetadata\x129\n\ncreated_at\x18\x0f \x01(\x0b2\x1a.google.protobuf.TimestampR\tcreatedAt\x129\n\nupdated_at\x18\x10 \x01(\x0b2\x1a.google.protobuf.TimestampR\tupdatedAtB\n\n\x08metadata"1\n\x16GetRegistryItemRequest\x12\x17\n\x07item_id\x18\x01 \x01(\tR\x06itemId"H\n\x17GetRegistryItemResponse\x12-\n\x04item\x18\x01 \x01(\x0b2\x19.viam.app.v1.RegistryItemR\x04item"\x8f\x01\n\x19CreateRegistryItemRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x125\n\x04type\x18\x03 \x01(\x0e2!.viam.app.packages.v1.PackageTypeR\x04type"\x1c\n\x1aCreateRegistryItemResponse"\xc6\x01\n\x19UpdateRegistryItemRequest\x12\x17\n\x07item_id\x18\x01 \x01(\tR\x06itemId\x125\n\x04type\x18\x02 \x01(\x0e2!.viam.app.packages.v1.PackageTypeR\x04type\x12 \n\x0bdescription\x18\x03 \x01(\tR\x0bdescription\x127\n\nvisibility\x18\x04 \x01(\x0e2\x17.viam.app.v1.VisibilityR\nvisibility"\x1c\n\x1aUpdateRegistryItemResponse"\xc3\x03\n\x18ListRegistryItemsRequest\x12,\n\x0forganization_id\x18\x01 \x01(\tH\x00R\x0eorganizationId\x88\x01\x01\x127\n\x05types\x18\x02 \x03(\x0e2!.viam.app.packages.v1.PackageTypeR\x05types\x12;\n\x0cvisibilities\x18\x03 \x03(\x0e2\x17.viam.app.v1.VisibilityR\x0cvisibilities\x12\x1c\n\tplatforms\x18\x04 \x03(\tR\tplatforms\x12;\n\x08statuses\x18\x05 \x03(\x0e2\x1f.viam.app.v1.RegistryItemStatusR\x08statuses\x12$\n\x0bsearch_term\x18\x06 \x01(\tH\x01R\nsearchTerm\x88\x01\x01\x12"\n\npage_token\x18\x07 \x01(\tH\x02R\tpageToken\x88\x01\x01\x12+\n\x11public_namespaces\x18\x08 \x03(\tR\x10publicNamespacesB\x12\n\x10_organization_idB\x0e\n\x0c_search_termB\r\n\x0b_page_token"L\n\x19ListRegistryItemsResponse\x12/\n\x05items\x18\x01 \x03(\x0b2\x19.viam.app.v1.RegistryItemR\x05items"4\n\x19DeleteRegistryItemRequest\x12\x17\n\x07item_id\x18\x01 \x01(\tR\x06itemId"\x1c\n\x1aDeleteRegistryItemResponse"h\n\x1bTransferRegistryItemRequest\x12\x17\n\x07item_id\x18\x01 \x01(\tR\x06itemId\x120\n\x14new_public_namespace\x18\x02 \x01(\tR\x12newPublicNamespace"\x1e\n\x1cTransferRegistryItemResponse"R\n\x13CreateModuleRequest\x12\'\n\x0forganization_id\x18\x01 \x01(\tR\x0eorganizationId\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name"E\n\x14CreateModuleResponse\x12\x1b\n\tmodule_id\x18\x01 \x01(\tR\x08moduleId\x12\x10\n\x03url\x18\x02 \x01(\tR\x03url"\xeb\x01\n\x13UpdateModuleRequest\x12\x1b\n\tmodule_id\x18\x01 \x01(\tR\x08moduleId\x127\n\nvisibility\x18\x02 \x01(\x0e2\x17.viam.app.v1.VisibilityR\nvisibility\x12\x10\n\x03url\x18\x03 \x01(\tR\x03url\x12 \n\x0bdescription\x18\x04 \x01(\tR\x0bdescription\x12*\n\x06models\x18\x05 \x03(\x0b2\x12.viam.app.v1.ModelR\x06models\x12\x1e\n\nentrypoint\x18\x06 \x01(\tR\nentrypoint"(\n\x14UpdateModuleResponse\x12\x10\n\x03url\x18\x01 \x01(\tR\x03url"/\n\x05Model\x12\x10\n\x03api\x18\x01 \x01(\tR\x03api\x12\x14\n\x05model\x18\x02 \x01(\tR\x05model"c\n\x0eModuleFileInfo\x12\x1b\n\tmodule_id\x18\x01 \x01(\tR\x08moduleId\x12\x18\n\x07version\x18\x02 \x01(\tR\x07version\x12\x1a\n\x08platform\x18\x03 \x01(\tR\x08platform"\x87\x01\n\x17UploadModuleFileRequest\x12G\n\x10module_file_info\x18\x01 \x01(\x0b2\x1b.viam.app.v1.ModuleFileInfoH\x00R\x0emoduleFileInfo\x12\x14\n\x04file\x18\x02 \x01(\x0cH\x00R\x04fileB\r\n\x0bmodule_file",\n\x18UploadModuleFileResponse\x12\x10\n\x03url\x18\x01 \x01(\tR\x03url"/\n\x10GetModuleRequest\x12\x1b\n\tmodule_id\x18\x01 \x01(\tR\x08moduleId"@\n\x11GetModuleResponse\x12+\n\x06module\x18\x01 \x01(\x0b2\x13.viam.app.v1.ModuleR\x06module"\xe5\x03\n\x06Module\x12\x1b\n\tmodule_id\x18\x01 \x01(\tR\x08moduleId\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x127\n\nvisibility\x18\x03 \x01(\x0e2\x17.viam.app.v1.VisibilityR\nvisibility\x127\n\x08versions\x18\x04 \x03(\x0b2\x1b.viam.app.v1.VersionHistoryR\x08versions\x12\x10\n\x03url\x18\x05 \x01(\tR\x03url\x12 \n\x0bdescription\x18\x06 \x01(\tR\x0bdescription\x12*\n\x06models\x18\x07 \x03(\x0b2\x12.viam.app.v1.ModelR\x06models\x12*\n\x11total_robot_usage\x18\x08 \x01(\x03R\x0ftotalRobotUsage\x128\n\x18total_organization_usage\x18\t \x01(\x03R\x16totalOrganizationUsage\x12\'\n\x0forganization_id\x18\n \x01(\tR\x0eorganizationId\x12\x1e\n\nentrypoint\x18\x0b \x01(\tR\nentrypoint\x12)\n\x10public_namespace\x18\x0c \x01(\tR\x0fpublicNamespace"\xa2\x01\n\x0eVersionHistory\x12\x18\n\x07version\x18\x01 \x01(\tR\x07version\x12*\n\x05files\x18\x02 \x03(\x0b2\x14.viam.app.v1.UploadsR\x05files\x12*\n\x06models\x18\x03 \x03(\x0b2\x12.viam.app.v1.ModelR\x06models\x12\x1e\n\nentrypoint\x18\x04 \x01(\tR\nentrypoint"b\n\x07Uploads\x12\x1a\n\x08platform\x18\x01 \x01(\tR\x08platform\x12;\n\x0buploaded_at\x18\x02 \x01(\x0b2\x1a.google.protobuf.TimestampR\nuploadedAt"V\n\x12ListModulesRequest\x12,\n\x0forganization_id\x18\x01 \x01(\tH\x00R\x0eorganizationId\x88\x01\x01B\x12\n\x10_organization_id"D\n\x13ListModulesResponse\x12-\n\x07modules\x18\x01 \x03(\x0b2\x13.viam.app.v1.ModuleR\x07modules"/\n\x17GetUserIDByEmailRequest\x12\x14\n\x05email\x18\x01 \x01(\tR\x05email"3\n\x18GetUserIDByEmailResponse\x12\x17\n\x07user_id\x18\x01 \x01(\tR\x06userId"9\n\x1eListOrganizationsByUserRequest\x12\x17\n\x07user_id\x18\x01 \x01(\tR\x06userId">\n\nOrgDetails\x12\x15\n\x06org_id\x18\x01 \x01(\tR\x05orgId\x12\x19\n\x08org_name\x18\x02 \x01(\tR\x07orgName"N\n\x1fListOrganizationsByUserResponse\x12+\n\x04orgs\x18\x01 \x03(\x0b2\x17.viam.app.v1.OrgDetailsR\x04orgs"j\n\x10CreateKeyRequest\x12B\n\x0eauthorizations\x18\x01 \x03(\x0b2\x1a.viam.app.v1.AuthorizationR\x0eauthorizations\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name"5\n\x11CreateKeyResponse\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x0e\n\x02id\x18\x02 \x01(\tR\x02id""\n\x10DeleteKeyRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"\x13\n\x11DeleteKeyResponse"6\n\x10RenameKeyRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name"7\n\x11RenameKeyResponse\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name"\xcd\x01\n\x14AuthorizationDetails\x12-\n\x12authorization_type\x18\x01 \x01(\tR\x11authorizationType\x12)\n\x10authorization_id\x18\x02 \x01(\tR\x0fauthorizationId\x12#\n\rresource_type\x18\x03 \x01(\tR\x0cresourceType\x12\x1f\n\x0bresource_id\x18\x04 \x01(\tR\nresourceId\x12\x15\n\x06org_id\x18\x05 \x01(\tR\x05orgId"\x93\x01\n\x18APIKeyWithAuthorizations\x12,\n\x07api_key\x18\x01 \x01(\x0b2\x13.viam.app.v1.APIKeyR\x06apiKey\x12I\n\x0eauthorizations\x18\x02 \x03(\x0b2!.viam.app.v1.AuthorizationDetailsR\x0eauthorizations"(\n\x0fListKeysRequest\x12\x15\n\x06org_id\x18\x01 \x01(\tR\x05orgId"T\n\x10ListKeysResponse\x12@\n\x08api_keys\x18\x01 \x03(\x0b2%.viam.app.v1.APIKeyWithAuthorizationsR\x07apiKeys""\n\x10RotateKeyRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"5\n\x11RotateKeyResponse\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x10\n\x03key\x18\x02 \x01(\tR\x03key"?\n-CreateKeyFromExistingKeyAuthorizationsRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"R\n.CreateKeyFromExistingKeyAuthorizationsResponse\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x10\n\x03key\x18\x02 \x01(\tR\x03key*\xd1\x01\n\x12AuthenticationType\x12#\n\x1fAUTHENTICATION_TYPE_UNSPECIFIED\x10\x00\x12!\n\x1dAUTHENTICATION_TYPE_WEB_OAUTH\x10\x01\x12\x1f\n\x1bAUTHENTICATION_TYPE_API_KEY\x10\x02\x12)\n%AUTHENTICATION_TYPE_ROBOT_PART_SECRET\x10\x03\x12\'\n#AUTHENTICATION_TYPE_LOCATION_SECRET\x10\x04*\xa3\x01\n\x12FragmentVisibility\x12#\n\x1fFRAGMENT_VISIBILITY_UNSPECIFIED\x10\x00\x12\x1f\n\x1bFRAGMENT_VISIBILITY_PRIVATE\x10\x01\x12\x1e\n\x1aFRAGMENT_VISIBILITY_PUBLIC\x10\x02\x12\'\n#FRAGMENT_VISIBILITY_PUBLIC_UNLISTED\x10\x03*\x87\x01\n\x12RegistryItemStatus\x12$\n REGISTRY_ITEM_STATUS_UNSPECIFIED\x10\x00\x12"\n\x1eREGISTRY_ITEM_STATUS_PUBLISHED\x10\x01\x12\'\n#REGISTRY_ITEM_STATUS_IN_DEVELOPMENT\x10\x02*W\n\nVisibility\x12\x1a\n\x16VISIBILITY_UNSPECIFIED\x10\x00\x12\x16\n\x12VISIBILITY_PRIVATE\x10\x01\x12\x15\n\x11VISIBILITY_PUBLIC\x10\x022\x8f7\n\nAppService\x12_\n\x10GetUserIDByEmail\x12$.viam.app.v1.GetUserIDByEmailRequest\x1a%.viam.app.v1.GetUserIDByEmailResponse\x12e\n\x12CreateOrganization\x12&.viam.app.v1.CreateOrganizationRequest\x1a\'.viam.app.v1.CreateOrganizationResponse\x12b\n\x11ListOrganizations\x12%.viam.app.v1.ListOrganizationsRequest\x1a&.viam.app.v1.ListOrganizationsResponse\x12\x9b\x01\n$GetOrganizationsWithAccessToLocation\x128.viam.app.v1.GetOrganizationsWithAccessToLocationRequest\x1a9.viam.app.v1.GetOrganizationsWithAccessToLocationResponse\x12t\n\x17ListOrganizationsByUser\x12+.viam.app.v1.ListOrganizationsByUserRequest\x1a,.viam.app.v1.ListOrganizationsByUserResponse\x12\\\n\x0fGetOrganization\x12#.viam.app.v1.GetOrganizationRequest\x1a$.viam.app.v1.GetOrganizationResponse\x12\x9b\x01\n$GetOrganizationNamespaceAvailability\x128.viam.app.v1.GetOrganizationNamespaceAvailabilityRequest\x1a9.viam.app.v1.GetOrganizationNamespaceAvailabilityResponse\x12e\n\x12UpdateOrganization\x12&.viam.app.v1.UpdateOrganizationRequest\x1a\'.viam.app.v1.UpdateOrganizationResponse\x12e\n\x12DeleteOrganization\x12&.viam.app.v1.DeleteOrganizationRequest\x1a\'.viam.app.v1.DeleteOrganizationResponse\x12t\n\x17ListOrganizationMembers\x12+.viam.app.v1.ListOrganizationMembersRequest\x1a,.viam.app.v1.ListOrganizationMembersResponse\x12w\n\x18CreateOrganizationInvite\x12,.viam.app.v1.CreateOrganizationInviteRequest\x1a-.viam.app.v1.CreateOrganizationInviteResponse\x12\xa1\x01\n&UpdateOrganizationInviteAuthorizations\x12:.viam.app.v1.UpdateOrganizationInviteAuthorizationsRequest\x1a;.viam.app.v1.UpdateOrganizationInviteAuthorizationsResponse\x12w\n\x18DeleteOrganizationMember\x12,.viam.app.v1.DeleteOrganizationMemberRequest\x1a-.viam.app.v1.DeleteOrganizationMemberResponse\x12w\n\x18DeleteOrganizationInvite\x12,.viam.app.v1.DeleteOrganizationInviteRequest\x1a-.viam.app.v1.DeleteOrganizationInviteResponse\x12w\n\x18ResendOrganizationInvite\x12,.viam.app.v1.ResendOrganizationInviteRequest\x1a-.viam.app.v1.ResendOrganizationInviteResponse\x12Y\n\x0eCreateLocation\x12".viam.app.v1.CreateLocationRequest\x1a#.viam.app.v1.CreateLocationResponse\x12P\n\x0bGetLocation\x12\x1f.viam.app.v1.GetLocationRequest\x1a .viam.app.v1.GetLocationResponse\x12Y\n\x0eUpdateLocation\x12".viam.app.v1.UpdateLocationRequest\x1a#.viam.app.v1.UpdateLocationResponse\x12Y\n\x0eDeleteLocation\x12".viam.app.v1.DeleteLocationRequest\x1a#.viam.app.v1.DeleteLocationResponse\x12V\n\rListLocations\x12!.viam.app.v1.ListLocationsRequest\x1a".viam.app.v1.ListLocationsResponse\x12V\n\rShareLocation\x12!.viam.app.v1.ShareLocationRequest\x1a".viam.app.v1.ShareLocationResponse\x12\\\n\x0fUnshareLocation\x12#.viam.app.v1.UnshareLocationRequest\x1a$.viam.app.v1.UnshareLocationResponse\x12S\n\x0cLocationAuth\x12 .viam.app.v1.LocationAuthRequest\x1a!.viam.app.v1.LocationAuthResponse\x12k\n\x14CreateLocationSecret\x12(.viam.app.v1.CreateLocationSecretRequest\x1a).viam.app.v1.CreateLocationSecretResponse\x12k\n\x14DeleteLocationSecret\x12(.viam.app.v1.DeleteLocationSecretRequest\x1a).viam.app.v1.DeleteLocationSecretResponse\x12G\n\x08GetRobot\x12\x1c.viam.app.v1.GetRobotRequest\x1a\x1d.viam.app.v1.GetRobotResponse\x12k\n\x14GetRoverRentalRobots\x12(.viam.app.v1.GetRoverRentalRobotsRequest\x1a).viam.app.v1.GetRoverRentalRobotsResponse\x12V\n\rGetRobotParts\x12!.viam.app.v1.GetRobotPartsRequest\x1a".viam.app.v1.GetRobotPartsResponse\x12S\n\x0cGetRobotPart\x12 .viam.app.v1.GetRobotPartRequest\x1a!.viam.app.v1.GetRobotPartResponse\x12_\n\x10GetRobotPartLogs\x12$.viam.app.v1.GetRobotPartLogsRequest\x1a%.viam.app.v1.GetRobotPartLogsResponse\x12d\n\x11TailRobotPartLogs\x12%.viam.app.v1.TailRobotPartLogsRequest\x1a&.viam.app.v1.TailRobotPartLogsResponse0\x01\x12h\n\x13GetRobotPartHistory\x12\'.viam.app.v1.GetRobotPartHistoryRequest\x1a(.viam.app.v1.GetRobotPartHistoryResponse\x12\\\n\x0fUpdateRobotPart\x12#.viam.app.v1.UpdateRobotPartRequest\x1a$.viam.app.v1.UpdateRobotPartResponse\x12S\n\x0cNewRobotPart\x12 .viam.app.v1.NewRobotPartRequest\x1a!.viam.app.v1.NewRobotPartResponse\x12\\\n\x0fDeleteRobotPart\x12#.viam.app.v1.DeleteRobotPartRequest\x1a$.viam.app.v1.DeleteRobotPartResponse\x12\\\n\x0fGetRobotAPIKeys\x12#.viam.app.v1.GetRobotAPIKeysRequest\x1a$.viam.app.v1.GetRobotAPIKeysResponse\x12Y\n\x0eMarkPartAsMain\x12".viam.app.v1.MarkPartAsMainRequest\x1a#.viam.app.v1.MarkPartAsMainResponse\x12e\n\x12MarkPartForRestart\x12&.viam.app.v1.MarkPartForRestartRequest\x1a\'.viam.app.v1.MarkPartForRestartResponse\x12n\n\x15CreateRobotPartSecret\x12).viam.app.v1.CreateRobotPartSecretRequest\x1a*.viam.app.v1.CreateRobotPartSecretResponse\x12n\n\x15DeleteRobotPartSecret\x12).viam.app.v1.DeleteRobotPartSecretRequest\x1a*.viam.app.v1.DeleteRobotPartSecretResponse\x12M\n\nListRobots\x12\x1e.viam.app.v1.ListRobotsRequest\x1a\x1f.viam.app.v1.ListRobotsResponse\x12G\n\x08NewRobot\x12\x1c.viam.app.v1.NewRobotRequest\x1a\x1d.viam.app.v1.NewRobotResponse\x12P\n\x0bUpdateRobot\x12\x1f.viam.app.v1.UpdateRobotRequest\x1a .viam.app.v1.UpdateRobotResponse\x12P\n\x0bDeleteRobot\x12\x1f.viam.app.v1.DeleteRobotRequest\x1a .viam.app.v1.DeleteRobotResponse\x12V\n\rListFragments\x12!.viam.app.v1.ListFragmentsRequest\x1a".viam.app.v1.ListFragmentsResponse\x12P\n\x0bGetFragment\x12\x1f.viam.app.v1.GetFragmentRequest\x1a .viam.app.v1.GetFragmentResponse\x12Y\n\x0eCreateFragment\x12".viam.app.v1.CreateFragmentRequest\x1a#.viam.app.v1.CreateFragmentResponse\x12Y\n\x0eUpdateFragment\x12".viam.app.v1.UpdateFragmentRequest\x1a#.viam.app.v1.UpdateFragmentResponse\x12Y\n\x0eDeleteFragment\x12".viam.app.v1.DeleteFragmentRequest\x1a#.viam.app.v1.DeleteFragmentResponse\x12e\n\x12GetFragmentHistory\x12&.viam.app.v1.GetFragmentHistoryRequest\x1a\'.viam.app.v1.GetFragmentHistoryResponse\x12D\n\x07AddRole\x12\x1b.viam.app.v1.AddRoleRequest\x1a\x1c.viam.app.v1.AddRoleResponse\x12M\n\nRemoveRole\x12\x1e.viam.app.v1.RemoveRoleRequest\x1a\x1f.viam.app.v1.RemoveRoleResponse\x12M\n\nChangeRole\x12\x1e.viam.app.v1.ChangeRoleRequest\x1a\x1f.viam.app.v1.ChangeRoleResponse\x12e\n\x12ListAuthorizations\x12&.viam.app.v1.ListAuthorizationsRequest\x1a\'.viam.app.v1.ListAuthorizationsResponse\x12_\n\x10CheckPermissions\x12$.viam.app.v1.CheckPermissionsRequest\x1a%.viam.app.v1.CheckPermissionsResponse\x12\\\n\x0fGetRegistryItem\x12#.viam.app.v1.GetRegistryItemRequest\x1a$.viam.app.v1.GetRegistryItemResponse\x12e\n\x12CreateRegistryItem\x12&.viam.app.v1.CreateRegistryItemRequest\x1a\'.viam.app.v1.CreateRegistryItemResponse\x12e\n\x12UpdateRegistryItem\x12&.viam.app.v1.UpdateRegistryItemRequest\x1a\'.viam.app.v1.UpdateRegistryItemResponse\x12b\n\x11ListRegistryItems\x12%.viam.app.v1.ListRegistryItemsRequest\x1a&.viam.app.v1.ListRegistryItemsResponse\x12e\n\x12DeleteRegistryItem\x12&.viam.app.v1.DeleteRegistryItemRequest\x1a\'.viam.app.v1.DeleteRegistryItemResponse\x12k\n\x14TransferRegistryItem\x12(.viam.app.v1.TransferRegistryItemRequest\x1a).viam.app.v1.TransferRegistryItemResponse\x12S\n\x0cCreateModule\x12 .viam.app.v1.CreateModuleRequest\x1a!.viam.app.v1.CreateModuleResponse\x12S\n\x0cUpdateModule\x12 .viam.app.v1.UpdateModuleRequest\x1a!.viam.app.v1.UpdateModuleResponse\x12a\n\x10UploadModuleFile\x12$.viam.app.v1.UploadModuleFileRequest\x1a%.viam.app.v1.UploadModuleFileResponse(\x01\x12J\n\tGetModule\x12\x1d.viam.app.v1.GetModuleRequest\x1a\x1e.viam.app.v1.GetModuleResponse\x12P\n\x0bListModules\x12\x1f.viam.app.v1.ListModulesRequest\x1a .viam.app.v1.ListModulesResponse\x12J\n\tCreateKey\x12\x1d.viam.app.v1.CreateKeyRequest\x1a\x1e.viam.app.v1.CreateKeyResponse\x12J\n\tDeleteKey\x12\x1d.viam.app.v1.DeleteKeyRequest\x1a\x1e.viam.app.v1.DeleteKeyResponse\x12G\n\x08ListKeys\x12\x1c.viam.app.v1.ListKeysRequest\x1a\x1d.viam.app.v1.ListKeysResponse\x12J\n\tRenameKey\x12\x1d.viam.app.v1.RenameKeyRequest\x1a\x1e.viam.app.v1.RenameKeyResponse\x12J\n\tRotateKey\x12\x1d.viam.app.v1.RotateKeyRequest\x1a\x1e.viam.app.v1.RotateKeyResponse\x12\xa1\x01\n&CreateKeyFromExistingKeyAuthorizations\x12:.viam.app.v1.CreateKeyFromExistingKeyAuthorizationsRequest\x1a;.viam.app.v1.CreateKeyFromExistingKeyAuthorizationsResponseB\x18Z\x16go.viam.com/api/app/v1b\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'app.v1.app_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
@@ -84,14 +84,22 @@
_FRAGMENT.fields_by_name['public']._serialized_options = b'\x9a\x84\x9e\x03\x1bbson:"public" json:"public"'
_FRAGMENT.fields_by_name['created_on']._options = None
_FRAGMENT.fields_by_name['created_on']._serialized_options = b'\x9a\x84\x9e\x03\x11bson:"created_on"'
- _AUTHENTICATIONTYPE._serialized_start = 19888
- _AUTHENTICATIONTYPE._serialized_end = 20097
- _FRAGMENTVISIBILITY._serialized_start = 20100
- _FRAGMENTVISIBILITY._serialized_end = 20263
- _REGISTRYITEMSTATUS._serialized_start = 20266
- _REGISTRYITEMSTATUS._serialized_end = 20401
- _VISIBILITY._serialized_start = 20403
- _VISIBILITY._serialized_end = 20490
+ _FRAGMENTHISTORYENTRY.fields_by_name['fragment']._options = None
+ _FRAGMENTHISTORYENTRY.fields_by_name['fragment']._serialized_options = b'\x9a\x84\x9e\x03\x1fbson:"fragment" json:"fragment"'
+ _FRAGMENTHISTORYENTRY.fields_by_name['edited_on']._options = None
+ _FRAGMENTHISTORYENTRY.fields_by_name['edited_on']._serialized_options = b'\x9a\x84\x9e\x03!bson:"edited_on" json:"edited_on"'
+ _FRAGMENTHISTORYENTRY.fields_by_name['old']._options = None
+ _FRAGMENTHISTORYENTRY.fields_by_name['old']._serialized_options = b'\x9a\x84\x9e\x03\x15bson:"old" json:"old"'
+ _FRAGMENTHISTORYENTRY.fields_by_name['edited_by']._options = None
+ _FRAGMENTHISTORYENTRY.fields_by_name['edited_by']._serialized_options = b'\x9a\x84\x9e\x03!bson:"edited_by" json:"edited_by"'
+ _AUTHENTICATIONTYPE._serialized_start = 20526
+ _AUTHENTICATIONTYPE._serialized_end = 20735
+ _FRAGMENTVISIBILITY._serialized_start = 20738
+ _FRAGMENTVISIBILITY._serialized_end = 20901
+ _REGISTRYITEMSTATUS._serialized_start = 20904
+ _REGISTRYITEMSTATUS._serialized_end = 21039
+ _VISIBILITY._serialized_start = 21041
+ _VISIBILITY._serialized_end = 21128
_ROBOT._serialized_start = 214
_ROBOT._serialized_end = 578
_ROBOTPART._serialized_start = 581
@@ -262,185 +270,191 @@
_DELETEROBOTPARTRESPONSE._serialized_end = 9920
_FRAGMENT._serialized_start = 9923
_FRAGMENT._serialized_end = 10604
- _LISTFRAGMENTSREQUEST._serialized_start = 10607
- _LISTFRAGMENTSREQUEST._serialized_end = 10785
- _LISTFRAGMENTSRESPONSE._serialized_start = 10787
- _LISTFRAGMENTSRESPONSE._serialized_end = 10863
- _GETFRAGMENTREQUEST._serialized_start = 10865
- _GETFRAGMENTREQUEST._serialized_end = 10901
- _GETFRAGMENTRESPONSE._serialized_start = 10903
- _GETFRAGMENTRESPONSE._serialized_end = 10975
- _CREATEFRAGMENTREQUEST._serialized_start = 10978
- _CREATEFRAGMENTREQUEST._serialized_end = 11111
- _CREATEFRAGMENTRESPONSE._serialized_start = 11113
- _CREATEFRAGMENTRESPONSE._serialized_end = 11188
- _UPDATEFRAGMENTREQUEST._serialized_start = 11191
- _UPDATEFRAGMENTREQUEST._serialized_end = 11424
- _UPDATEFRAGMENTRESPONSE._serialized_start = 11426
- _UPDATEFRAGMENTRESPONSE._serialized_end = 11501
- _DELETEFRAGMENTREQUEST._serialized_start = 11503
- _DELETEFRAGMENTREQUEST._serialized_end = 11542
- _DELETEFRAGMENTRESPONSE._serialized_start = 11544
- _DELETEFRAGMENTRESPONSE._serialized_end = 11568
- _LISTROBOTSREQUEST._serialized_start = 11570
- _LISTROBOTSREQUEST._serialized_end = 11622
- _LISTROBOTSRESPONSE._serialized_start = 11624
- _LISTROBOTSRESPONSE._serialized_end = 11688
- _NEWROBOTREQUEST._serialized_start = 11690
- _NEWROBOTREQUEST._serialized_end = 11755
- _NEWROBOTRESPONSE._serialized_start = 11757
- _NEWROBOTRESPONSE._serialized_end = 11791
- _UPDATEROBOTREQUEST._serialized_start = 11793
- _UPDATEROBOTREQUEST._serialized_end = 11877
- _UPDATEROBOTRESPONSE._serialized_start = 11879
- _UPDATEROBOTRESPONSE._serialized_end = 11942
- _DELETEROBOTREQUEST._serialized_start = 11944
- _DELETEROBOTREQUEST._serialized_end = 11980
- _DELETEROBOTRESPONSE._serialized_start = 11982
- _DELETEROBOTRESPONSE._serialized_end = 12003
- _MARKPARTASMAINREQUEST._serialized_start = 12005
- _MARKPARTASMAINREQUEST._serialized_end = 12053
- _MARKPARTASMAINRESPONSE._serialized_start = 12055
- _MARKPARTASMAINRESPONSE._serialized_end = 12079
- _MARKPARTFORRESTARTREQUEST._serialized_start = 12081
- _MARKPARTFORRESTARTREQUEST._serialized_end = 12133
- _MARKPARTFORRESTARTRESPONSE._serialized_start = 12135
- _MARKPARTFORRESTARTRESPONSE._serialized_end = 12163
- _CREATEROBOTPARTSECRETREQUEST._serialized_start = 12165
- _CREATEROBOTPARTSECRETREQUEST._serialized_end = 12220
- _CREATEROBOTPARTSECRETRESPONSE._serialized_start = 12222
- _CREATEROBOTPARTSECRETRESPONSE._serialized_end = 12297
- _DELETEROBOTPARTSECRETREQUEST._serialized_start = 12299
- _DELETEROBOTPARTSECRETREQUEST._serialized_end = 12383
- _DELETEROBOTPARTSECRETRESPONSE._serialized_start = 12385
- _DELETEROBOTPARTSECRETRESPONSE._serialized_end = 12416
- _AUTHORIZATION._serialized_start = 12419
- _AUTHORIZATION._serialized_end = 12705
- _ADDROLEREQUEST._serialized_start = 12707
- _ADDROLEREQUEST._serialized_end = 12789
- _ADDROLERESPONSE._serialized_start = 12791
- _ADDROLERESPONSE._serialized_end = 12808
- _REMOVEROLEREQUEST._serialized_start = 12810
- _REMOVEROLEREQUEST._serialized_end = 12895
- _REMOVEROLERESPONSE._serialized_start = 12897
- _REMOVEROLERESPONSE._serialized_end = 12917
- _CHANGEROLEREQUEST._serialized_start = 12920
- _CHANGEROLEREQUEST._serialized_end = 13085
- _CHANGEROLERESPONSE._serialized_start = 13087
- _CHANGEROLERESPONSE._serialized_end = 13107
- _LISTAUTHORIZATIONSREQUEST._serialized_start = 13109
- _LISTAUTHORIZATIONSREQUEST._serialized_end = 13212
- _LISTAUTHORIZATIONSRESPONSE._serialized_start = 13214
- _LISTAUTHORIZATIONSRESPONSE._serialized_end = 13310
- _CHECKPERMISSIONSREQUEST._serialized_start = 13312
- _CHECKPERMISSIONSREQUEST._serialized_end = 13407
- _AUTHORIZEDPERMISSIONS._serialized_start = 13409
- _AUTHORIZEDPERMISSIONS._serialized_end = 13536
- _CHECKPERMISSIONSRESPONSE._serialized_start = 13538
- _CHECKPERMISSIONSRESPONSE._serialized_end = 13655
- _MODULEVERSION._serialized_start = 13658
- _MODULEVERSION._serialized_end = 13819
- _MODULEMETADATA._serialized_start = 13822
- _MODULEMETADATA._serialized_end = 13970
- _MLMODELMETADATA._serialized_start = 13973
- _MLMODELMETADATA._serialized_end = 14165
- _MLTRAININGVERSION._serialized_start = 14167
- _MLTRAININGVERSION._serialized_end = 14271
- _MLTRAININGMETADATA._serialized_start = 14274
- _MLTRAININGMETADATA._serialized_end = 14529
- _REGISTRYITEM._serialized_start = 14532
- _REGISTRYITEM._serialized_end = 15440
- _GETREGISTRYITEMREQUEST._serialized_start = 15442
- _GETREGISTRYITEMREQUEST._serialized_end = 15491
- _GETREGISTRYITEMRESPONSE._serialized_start = 15493
- _GETREGISTRYITEMRESPONSE._serialized_end = 15565
- _CREATEREGISTRYITEMREQUEST._serialized_start = 15568
- _CREATEREGISTRYITEMREQUEST._serialized_end = 15711
- _CREATEREGISTRYITEMRESPONSE._serialized_start = 15713
- _CREATEREGISTRYITEMRESPONSE._serialized_end = 15741
- _UPDATEREGISTRYITEMREQUEST._serialized_start = 15744
- _UPDATEREGISTRYITEMREQUEST._serialized_end = 15942
- _UPDATEREGISTRYITEMRESPONSE._serialized_start = 15944
- _UPDATEREGISTRYITEMRESPONSE._serialized_end = 15972
- _LISTREGISTRYITEMSREQUEST._serialized_start = 15975
- _LISTREGISTRYITEMSREQUEST._serialized_end = 16426
- _LISTREGISTRYITEMSRESPONSE._serialized_start = 16428
- _LISTREGISTRYITEMSRESPONSE._serialized_end = 16504
- _DELETEREGISTRYITEMREQUEST._serialized_start = 16506
- _DELETEREGISTRYITEMREQUEST._serialized_end = 16558
- _DELETEREGISTRYITEMRESPONSE._serialized_start = 16560
- _DELETEREGISTRYITEMRESPONSE._serialized_end = 16588
- _TRANSFERREGISTRYITEMREQUEST._serialized_start = 16590
- _TRANSFERREGISTRYITEMREQUEST._serialized_end = 16694
- _TRANSFERREGISTRYITEMRESPONSE._serialized_start = 16696
- _TRANSFERREGISTRYITEMRESPONSE._serialized_end = 16726
- _CREATEMODULEREQUEST._serialized_start = 16728
- _CREATEMODULEREQUEST._serialized_end = 16810
- _CREATEMODULERESPONSE._serialized_start = 16812
- _CREATEMODULERESPONSE._serialized_end = 16881
- _UPDATEMODULEREQUEST._serialized_start = 16884
- _UPDATEMODULEREQUEST._serialized_end = 17119
- _UPDATEMODULERESPONSE._serialized_start = 17121
- _UPDATEMODULERESPONSE._serialized_end = 17161
- _MODEL._serialized_start = 17163
- _MODEL._serialized_end = 17210
- _MODULEFILEINFO._serialized_start = 17212
- _MODULEFILEINFO._serialized_end = 17311
- _UPLOADMODULEFILEREQUEST._serialized_start = 17314
- _UPLOADMODULEFILEREQUEST._serialized_end = 17449
- _UPLOADMODULEFILERESPONSE._serialized_start = 17451
- _UPLOADMODULEFILERESPONSE._serialized_end = 17495
- _GETMODULEREQUEST._serialized_start = 17497
- _GETMODULEREQUEST._serialized_end = 17544
- _GETMODULERESPONSE._serialized_start = 17546
- _GETMODULERESPONSE._serialized_end = 17610
- _MODULE._serialized_start = 17613
- _MODULE._serialized_end = 18098
- _VERSIONHISTORY._serialized_start = 18101
- _VERSIONHISTORY._serialized_end = 18263
- _UPLOADS._serialized_start = 18265
- _UPLOADS._serialized_end = 18363
- _LISTMODULESREQUEST._serialized_start = 18365
- _LISTMODULESREQUEST._serialized_end = 18451
- _LISTMODULESRESPONSE._serialized_start = 18453
- _LISTMODULESRESPONSE._serialized_end = 18521
- _GETUSERIDBYEMAILREQUEST._serialized_start = 18523
- _GETUSERIDBYEMAILREQUEST._serialized_end = 18570
- _GETUSERIDBYEMAILRESPONSE._serialized_start = 18572
- _GETUSERIDBYEMAILRESPONSE._serialized_end = 18623
- _LISTORGANIZATIONSBYUSERREQUEST._serialized_start = 18625
- _LISTORGANIZATIONSBYUSERREQUEST._serialized_end = 18682
- _ORGDETAILS._serialized_start = 18684
- _ORGDETAILS._serialized_end = 18746
- _LISTORGANIZATIONSBYUSERRESPONSE._serialized_start = 18748
- _LISTORGANIZATIONSBYUSERRESPONSE._serialized_end = 18826
- _CREATEKEYREQUEST._serialized_start = 18828
- _CREATEKEYREQUEST._serialized_end = 18934
- _CREATEKEYRESPONSE._serialized_start = 18936
- _CREATEKEYRESPONSE._serialized_end = 18989
- _DELETEKEYREQUEST._serialized_start = 18991
- _DELETEKEYREQUEST._serialized_end = 19025
- _DELETEKEYRESPONSE._serialized_start = 19027
- _DELETEKEYRESPONSE._serialized_end = 19046
- _RENAMEKEYREQUEST._serialized_start = 19048
- _RENAMEKEYREQUEST._serialized_end = 19102
- _RENAMEKEYRESPONSE._serialized_start = 19104
- _RENAMEKEYRESPONSE._serialized_end = 19159
- _AUTHORIZATIONDETAILS._serialized_start = 19162
- _AUTHORIZATIONDETAILS._serialized_end = 19367
- _APIKEYWITHAUTHORIZATIONS._serialized_start = 19370
- _APIKEYWITHAUTHORIZATIONS._serialized_end = 19517
- _LISTKEYSREQUEST._serialized_start = 19519
- _LISTKEYSREQUEST._serialized_end = 19559
- _LISTKEYSRESPONSE._serialized_start = 19561
- _LISTKEYSRESPONSE._serialized_end = 19645
- _ROTATEKEYREQUEST._serialized_start = 19647
- _ROTATEKEYREQUEST._serialized_end = 19681
- _ROTATEKEYRESPONSE._serialized_start = 19683
- _ROTATEKEYRESPONSE._serialized_end = 19736
- _CREATEKEYFROMEXISTINGKEYAUTHORIZATIONSREQUEST._serialized_start = 19738
- _CREATEKEYFROMEXISTINGKEYAUTHORIZATIONSREQUEST._serialized_end = 19801
- _CREATEKEYFROMEXISTINGKEYAUTHORIZATIONSRESPONSE._serialized_start = 19803
- _CREATEKEYFROMEXISTINGKEYAUTHORIZATIONSRESPONSE._serialized_end = 19885
- _APPSERVICE._serialized_start = 20493
- _APPSERVICE._serialized_end = 27445
\ No newline at end of file
+ _FRAGMENTHISTORYENTRY._serialized_start = 10607
+ _FRAGMENTHISTORYENTRY._serialized_end = 10962
+ _LISTFRAGMENTSREQUEST._serialized_start = 10965
+ _LISTFRAGMENTSREQUEST._serialized_end = 11143
+ _LISTFRAGMENTSRESPONSE._serialized_start = 11145
+ _LISTFRAGMENTSRESPONSE._serialized_end = 11221
+ _GETFRAGMENTREQUEST._serialized_start = 11223
+ _GETFRAGMENTREQUEST._serialized_end = 11259
+ _GETFRAGMENTRESPONSE._serialized_start = 11261
+ _GETFRAGMENTRESPONSE._serialized_end = 11333
+ _CREATEFRAGMENTREQUEST._serialized_start = 11336
+ _CREATEFRAGMENTREQUEST._serialized_end = 11469
+ _CREATEFRAGMENTRESPONSE._serialized_start = 11471
+ _CREATEFRAGMENTRESPONSE._serialized_end = 11546
+ _UPDATEFRAGMENTREQUEST._serialized_start = 11549
+ _UPDATEFRAGMENTREQUEST._serialized_end = 11782
+ _UPDATEFRAGMENTRESPONSE._serialized_start = 11784
+ _UPDATEFRAGMENTRESPONSE._serialized_end = 11859
+ _DELETEFRAGMENTREQUEST._serialized_start = 11861
+ _DELETEFRAGMENTREQUEST._serialized_end = 11900
+ _DELETEFRAGMENTRESPONSE._serialized_start = 11902
+ _DELETEFRAGMENTRESPONSE._serialized_end = 11926
+ _GETFRAGMENTHISTORYREQUEST._serialized_start = 11929
+ _GETFRAGMENTHISTORYREQUEST._serialized_end = 12074
+ _GETFRAGMENTHISTORYRESPONSE._serialized_start = 12077
+ _GETFRAGMENTHISTORYRESPONSE._serialized_end = 12206
+ _LISTROBOTSREQUEST._serialized_start = 12208
+ _LISTROBOTSREQUEST._serialized_end = 12260
+ _LISTROBOTSRESPONSE._serialized_start = 12262
+ _LISTROBOTSRESPONSE._serialized_end = 12326
+ _NEWROBOTREQUEST._serialized_start = 12328
+ _NEWROBOTREQUEST._serialized_end = 12393
+ _NEWROBOTRESPONSE._serialized_start = 12395
+ _NEWROBOTRESPONSE._serialized_end = 12429
+ _UPDATEROBOTREQUEST._serialized_start = 12431
+ _UPDATEROBOTREQUEST._serialized_end = 12515
+ _UPDATEROBOTRESPONSE._serialized_start = 12517
+ _UPDATEROBOTRESPONSE._serialized_end = 12580
+ _DELETEROBOTREQUEST._serialized_start = 12582
+ _DELETEROBOTREQUEST._serialized_end = 12618
+ _DELETEROBOTRESPONSE._serialized_start = 12620
+ _DELETEROBOTRESPONSE._serialized_end = 12641
+ _MARKPARTASMAINREQUEST._serialized_start = 12643
+ _MARKPARTASMAINREQUEST._serialized_end = 12691
+ _MARKPARTASMAINRESPONSE._serialized_start = 12693
+ _MARKPARTASMAINRESPONSE._serialized_end = 12717
+ _MARKPARTFORRESTARTREQUEST._serialized_start = 12719
+ _MARKPARTFORRESTARTREQUEST._serialized_end = 12771
+ _MARKPARTFORRESTARTRESPONSE._serialized_start = 12773
+ _MARKPARTFORRESTARTRESPONSE._serialized_end = 12801
+ _CREATEROBOTPARTSECRETREQUEST._serialized_start = 12803
+ _CREATEROBOTPARTSECRETREQUEST._serialized_end = 12858
+ _CREATEROBOTPARTSECRETRESPONSE._serialized_start = 12860
+ _CREATEROBOTPARTSECRETRESPONSE._serialized_end = 12935
+ _DELETEROBOTPARTSECRETREQUEST._serialized_start = 12937
+ _DELETEROBOTPARTSECRETREQUEST._serialized_end = 13021
+ _DELETEROBOTPARTSECRETRESPONSE._serialized_start = 13023
+ _DELETEROBOTPARTSECRETRESPONSE._serialized_end = 13054
+ _AUTHORIZATION._serialized_start = 13057
+ _AUTHORIZATION._serialized_end = 13343
+ _ADDROLEREQUEST._serialized_start = 13345
+ _ADDROLEREQUEST._serialized_end = 13427
+ _ADDROLERESPONSE._serialized_start = 13429
+ _ADDROLERESPONSE._serialized_end = 13446
+ _REMOVEROLEREQUEST._serialized_start = 13448
+ _REMOVEROLEREQUEST._serialized_end = 13533
+ _REMOVEROLERESPONSE._serialized_start = 13535
+ _REMOVEROLERESPONSE._serialized_end = 13555
+ _CHANGEROLEREQUEST._serialized_start = 13558
+ _CHANGEROLEREQUEST._serialized_end = 13723
+ _CHANGEROLERESPONSE._serialized_start = 13725
+ _CHANGEROLERESPONSE._serialized_end = 13745
+ _LISTAUTHORIZATIONSREQUEST._serialized_start = 13747
+ _LISTAUTHORIZATIONSREQUEST._serialized_end = 13850
+ _LISTAUTHORIZATIONSRESPONSE._serialized_start = 13852
+ _LISTAUTHORIZATIONSRESPONSE._serialized_end = 13948
+ _CHECKPERMISSIONSREQUEST._serialized_start = 13950
+ _CHECKPERMISSIONSREQUEST._serialized_end = 14045
+ _AUTHORIZEDPERMISSIONS._serialized_start = 14047
+ _AUTHORIZEDPERMISSIONS._serialized_end = 14174
+ _CHECKPERMISSIONSRESPONSE._serialized_start = 14176
+ _CHECKPERMISSIONSRESPONSE._serialized_end = 14293
+ _MODULEVERSION._serialized_start = 14296
+ _MODULEVERSION._serialized_end = 14457
+ _MODULEMETADATA._serialized_start = 14460
+ _MODULEMETADATA._serialized_end = 14608
+ _MLMODELMETADATA._serialized_start = 14611
+ _MLMODELMETADATA._serialized_end = 14803
+ _MLTRAININGVERSION._serialized_start = 14805
+ _MLTRAININGVERSION._serialized_end = 14909
+ _MLTRAININGMETADATA._serialized_start = 14912
+ _MLTRAININGMETADATA._serialized_end = 15167
+ _REGISTRYITEM._serialized_start = 15170
+ _REGISTRYITEM._serialized_end = 16078
+ _GETREGISTRYITEMREQUEST._serialized_start = 16080
+ _GETREGISTRYITEMREQUEST._serialized_end = 16129
+ _GETREGISTRYITEMRESPONSE._serialized_start = 16131
+ _GETREGISTRYITEMRESPONSE._serialized_end = 16203
+ _CREATEREGISTRYITEMREQUEST._serialized_start = 16206
+ _CREATEREGISTRYITEMREQUEST._serialized_end = 16349
+ _CREATEREGISTRYITEMRESPONSE._serialized_start = 16351
+ _CREATEREGISTRYITEMRESPONSE._serialized_end = 16379
+ _UPDATEREGISTRYITEMREQUEST._serialized_start = 16382
+ _UPDATEREGISTRYITEMREQUEST._serialized_end = 16580
+ _UPDATEREGISTRYITEMRESPONSE._serialized_start = 16582
+ _UPDATEREGISTRYITEMRESPONSE._serialized_end = 16610
+ _LISTREGISTRYITEMSREQUEST._serialized_start = 16613
+ _LISTREGISTRYITEMSREQUEST._serialized_end = 17064
+ _LISTREGISTRYITEMSRESPONSE._serialized_start = 17066
+ _LISTREGISTRYITEMSRESPONSE._serialized_end = 17142
+ _DELETEREGISTRYITEMREQUEST._serialized_start = 17144
+ _DELETEREGISTRYITEMREQUEST._serialized_end = 17196
+ _DELETEREGISTRYITEMRESPONSE._serialized_start = 17198
+ _DELETEREGISTRYITEMRESPONSE._serialized_end = 17226
+ _TRANSFERREGISTRYITEMREQUEST._serialized_start = 17228
+ _TRANSFERREGISTRYITEMREQUEST._serialized_end = 17332
+ _TRANSFERREGISTRYITEMRESPONSE._serialized_start = 17334
+ _TRANSFERREGISTRYITEMRESPONSE._serialized_end = 17364
+ _CREATEMODULEREQUEST._serialized_start = 17366
+ _CREATEMODULEREQUEST._serialized_end = 17448
+ _CREATEMODULERESPONSE._serialized_start = 17450
+ _CREATEMODULERESPONSE._serialized_end = 17519
+ _UPDATEMODULEREQUEST._serialized_start = 17522
+ _UPDATEMODULEREQUEST._serialized_end = 17757
+ _UPDATEMODULERESPONSE._serialized_start = 17759
+ _UPDATEMODULERESPONSE._serialized_end = 17799
+ _MODEL._serialized_start = 17801
+ _MODEL._serialized_end = 17848
+ _MODULEFILEINFO._serialized_start = 17850
+ _MODULEFILEINFO._serialized_end = 17949
+ _UPLOADMODULEFILEREQUEST._serialized_start = 17952
+ _UPLOADMODULEFILEREQUEST._serialized_end = 18087
+ _UPLOADMODULEFILERESPONSE._serialized_start = 18089
+ _UPLOADMODULEFILERESPONSE._serialized_end = 18133
+ _GETMODULEREQUEST._serialized_start = 18135
+ _GETMODULEREQUEST._serialized_end = 18182
+ _GETMODULERESPONSE._serialized_start = 18184
+ _GETMODULERESPONSE._serialized_end = 18248
+ _MODULE._serialized_start = 18251
+ _MODULE._serialized_end = 18736
+ _VERSIONHISTORY._serialized_start = 18739
+ _VERSIONHISTORY._serialized_end = 18901
+ _UPLOADS._serialized_start = 18903
+ _UPLOADS._serialized_end = 19001
+ _LISTMODULESREQUEST._serialized_start = 19003
+ _LISTMODULESREQUEST._serialized_end = 19089
+ _LISTMODULESRESPONSE._serialized_start = 19091
+ _LISTMODULESRESPONSE._serialized_end = 19159
+ _GETUSERIDBYEMAILREQUEST._serialized_start = 19161
+ _GETUSERIDBYEMAILREQUEST._serialized_end = 19208
+ _GETUSERIDBYEMAILRESPONSE._serialized_start = 19210
+ _GETUSERIDBYEMAILRESPONSE._serialized_end = 19261
+ _LISTORGANIZATIONSBYUSERREQUEST._serialized_start = 19263
+ _LISTORGANIZATIONSBYUSERREQUEST._serialized_end = 19320
+ _ORGDETAILS._serialized_start = 19322
+ _ORGDETAILS._serialized_end = 19384
+ _LISTORGANIZATIONSBYUSERRESPONSE._serialized_start = 19386
+ _LISTORGANIZATIONSBYUSERRESPONSE._serialized_end = 19464
+ _CREATEKEYREQUEST._serialized_start = 19466
+ _CREATEKEYREQUEST._serialized_end = 19572
+ _CREATEKEYRESPONSE._serialized_start = 19574
+ _CREATEKEYRESPONSE._serialized_end = 19627
+ _DELETEKEYREQUEST._serialized_start = 19629
+ _DELETEKEYREQUEST._serialized_end = 19663
+ _DELETEKEYRESPONSE._serialized_start = 19665
+ _DELETEKEYRESPONSE._serialized_end = 19684
+ _RENAMEKEYREQUEST._serialized_start = 19686
+ _RENAMEKEYREQUEST._serialized_end = 19740
+ _RENAMEKEYRESPONSE._serialized_start = 19742
+ _RENAMEKEYRESPONSE._serialized_end = 19797
+ _AUTHORIZATIONDETAILS._serialized_start = 19800
+ _AUTHORIZATIONDETAILS._serialized_end = 20005
+ _APIKEYWITHAUTHORIZATIONS._serialized_start = 20008
+ _APIKEYWITHAUTHORIZATIONS._serialized_end = 20155
+ _LISTKEYSREQUEST._serialized_start = 20157
+ _LISTKEYSREQUEST._serialized_end = 20197
+ _LISTKEYSRESPONSE._serialized_start = 20199
+ _LISTKEYSRESPONSE._serialized_end = 20283
+ _ROTATEKEYREQUEST._serialized_start = 20285
+ _ROTATEKEYREQUEST._serialized_end = 20319
+ _ROTATEKEYRESPONSE._serialized_start = 20321
+ _ROTATEKEYRESPONSE._serialized_end = 20374
+ _CREATEKEYFROMEXISTINGKEYAUTHORIZATIONSREQUEST._serialized_start = 20376
+ _CREATEKEYFROMEXISTINGKEYAUTHORIZATIONSREQUEST._serialized_end = 20439
+ _CREATEKEYFROMEXISTINGKEYAUTHORIZATIONSRESPONSE._serialized_start = 20441
+ _CREATEKEYFROMEXISTINGKEYAUTHORIZATIONSRESPONSE._serialized_end = 20523
+ _APPSERVICE._serialized_start = 21131
+ _APPSERVICE._serialized_end = 28186
\ No newline at end of file
diff --git a/src/viam/gen/app/v1/app_pb2.pyi b/src/viam/gen/app/v1/app_pb2.pyi
index fb82ff96a..ac50ae83e 100644
--- a/src/viam/gen/app/v1/app_pb2.pyi
+++ b/src/viam/gen/app/v1/app_pb2.pyi
@@ -1714,6 +1714,37 @@ class Fragment(google.protobuf.message.Message):
...
global___Fragment = Fragment
+@typing.final
+class FragmentHistoryEntry(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+ FRAGMENT_FIELD_NUMBER: builtins.int
+ EDITED_ON_FIELD_NUMBER: builtins.int
+ OLD_FIELD_NUMBER: builtins.int
+ EDITED_BY_FIELD_NUMBER: builtins.int
+ fragment: builtins.str
+
+ @property
+ def edited_on(self) -> google.protobuf.timestamp_pb2.Timestamp:
+ ...
+
+ @property
+ def old(self) -> global___Fragment:
+ ...
+
+ @property
+ def edited_by(self) -> global___AuthenticatorInfo:
+ ...
+
+ def __init__(self, *, fragment: builtins.str=..., edited_on: google.protobuf.timestamp_pb2.Timestamp | None=..., old: global___Fragment | None=..., edited_by: global___AuthenticatorInfo | None=...) -> None:
+ ...
+
+ def HasField(self, field_name: typing.Literal['edited_by', b'edited_by', 'edited_on', b'edited_on', 'old', b'old']) -> builtins.bool:
+ ...
+
+ def ClearField(self, field_name: typing.Literal['edited_by', b'edited_by', 'edited_on', b'edited_on', 'fragment', b'fragment', 'old', b'old']) -> None:
+ ...
+global___FragmentHistoryEntry = FragmentHistoryEntry
+
@typing.final
class ListFragmentsRequest(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor
@@ -1899,6 +1930,52 @@ class DeleteFragmentResponse(google.protobuf.message.Message):
...
global___DeleteFragmentResponse = DeleteFragmentResponse
+@typing.final
+class GetFragmentHistoryRequest(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+ ID_FIELD_NUMBER: builtins.int
+ PAGE_TOKEN_FIELD_NUMBER: builtins.int
+ PAGE_LIMIT_FIELD_NUMBER: builtins.int
+ id: builtins.str
+ page_token: builtins.str
+ page_limit: builtins.int
+
+ def __init__(self, *, id: builtins.str=..., page_token: builtins.str | None=..., page_limit: builtins.int | None=...) -> None:
+ ...
+
+ def HasField(self, field_name: typing.Literal['_page_limit', b'_page_limit', '_page_token', b'_page_token', 'page_limit', b'page_limit', 'page_token', b'page_token']) -> builtins.bool:
+ ...
+
+ def ClearField(self, field_name: typing.Literal['_page_limit', b'_page_limit', '_page_token', b'_page_token', 'id', b'id', 'page_limit', b'page_limit', 'page_token', b'page_token']) -> None:
+ ...
+
+ @typing.overload
+ def WhichOneof(self, oneof_group: typing.Literal['_page_limit', b'_page_limit']) -> typing.Literal['page_limit'] | None:
+ ...
+
+ @typing.overload
+ def WhichOneof(self, oneof_group: typing.Literal['_page_token', b'_page_token']) -> typing.Literal['page_token'] | None:
+ ...
+global___GetFragmentHistoryRequest = GetFragmentHistoryRequest
+
+@typing.final
+class GetFragmentHistoryResponse(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+ HISTORY_FIELD_NUMBER: builtins.int
+ NEXT_PAGE_TOKEN_FIELD_NUMBER: builtins.int
+ next_page_token: builtins.str
+
+ @property
+ def history(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___FragmentHistoryEntry]:
+ ...
+
+ def __init__(self, *, history: collections.abc.Iterable[global___FragmentHistoryEntry] | None=..., next_page_token: builtins.str=...) -> None:
+ ...
+
+ def ClearField(self, field_name: typing.Literal['history', b'history', 'next_page_token', b'next_page_token']) -> None:
+ ...
+global___GetFragmentHistoryResponse = GetFragmentHistoryResponse
+
@typing.final
class ListRobotsRequest(google.protobuf.message.Message):
DESCRIPTOR: google.protobuf.descriptor.Descriptor
diff --git a/src/viam/gen/app/v1/robot_pb2.py b/src/viam/gen/app/v1/robot_pb2.py
index b12a28b52..da0f26224 100644
--- a/src/viam/gen/app/v1/robot_pb2.py
+++ b/src/viam/gen/app/v1/robot_pb2.py
@@ -8,7 +8,7 @@
from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2
from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
from ...tagger.v1 import tagger_pb2 as tagger_dot_v1_dot_tagger__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12app/v1/robot.proto\x12\x0bviam.app.v1\x1a\x16common/v1/common.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x16tagger/v1/tagger.proto"\x95\x06\n\x0bRobotConfig\x12.\n\x05cloud\x18\x01 \x01(\x0b2\x18.viam.app.v1.CloudConfigR\x05cloud\x123\n\x07remotes\x18\x02 \x03(\x0b2\x19.viam.app.v1.RemoteConfigR\x07remotes\x12<\n\ncomponents\x18\x03 \x03(\x0b2\x1c.viam.app.v1.ComponentConfigR\ncomponents\x128\n\tprocesses\x18\x04 \x03(\x0b2\x1a.viam.app.v1.ProcessConfigR\tprocesses\x126\n\x08services\x18\x05 \x03(\x0b2\x1a.viam.app.v1.ServiceConfigR\x08services\x129\n\x07network\x18\x06 \x01(\x0b2\x1a.viam.app.v1.NetworkConfigH\x00R\x07network\x88\x01\x01\x120\n\x04auth\x18\x07 \x01(\x0b2\x17.viam.app.v1.AuthConfigH\x01R\x04auth\x88\x01\x01\x12\x19\n\x05debug\x18\x08 \x01(\x08H\x02R\x05debug\x88\x01\x01\x123\n\x07modules\x18\t \x03(\x0b2\x19.viam.app.v1.ModuleConfigR\x07modules\x127\n\x15disable_partial_start\x18\n \x01(\x08H\x03R\x13disablePartialStart\x88\x01\x01\x126\n\x08packages\x18\x0b \x03(\x0b2\x1a.viam.app.v1.PackageConfigR\x08packages\x12\\\n\x19overwrite_fragment_status\x18\x0c \x03(\x0b2 .viam.app.v1.AppValidationStatusR\x17overwriteFragmentStatus\x12,\n\x12enable_web_profile\x18\r \x01(\x08R\x10enableWebProfileB\n\n\x08_networkB\x07\n\x05_authB\x08\n\x06_debugB\x18\n\x16_disable_partial_start"8\n\x0eLocationSecret\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x16\n\x06secret\x18\x02 \x01(\tR\x06secret"+\n\x13AppValidationStatus\x12\x14\n\x05error\x18\x01 \x01(\tR\x05error"\xbe\x03\n\x0bCloudConfig\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04fqdn\x18\x02 \x01(\tR\x04fqdn\x12\x1d\n\nlocal_fqdn\x18\x03 \x01(\tR\tlocalFqdn\x12\x1d\n\nmanaged_by\x18\x04 \x01(\tR\tmanagedBy\x12+\n\x11signaling_address\x18\x05 \x01(\tR\x10signalingAddress\x12-\n\x12signaling_insecure\x18\x06 \x01(\x08R\x11signalingInsecure\x12+\n\x0flocation_secret\x18\x07 \x01(\tB\x02\x18\x01R\x0elocationSecret\x12\x16\n\x06secret\x18\x08 \x01(\tR\x06secret\x12F\n\x10location_secrets\x18\t \x03(\x0b2\x1b.viam.app.v1.LocationSecretR\x0flocationSecrets\x12$\n\x0eprimary_org_id\x18\n \x01(\tR\x0cprimaryOrgId\x12\x1f\n\x0blocation_id\x18\x0b \x01(\tR\nlocationId\x12\x1d\n\nmachine_id\x18\x0c \x01(\tR\tmachineId"\xbb\x03\n\x0fComponentConfig\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x1c\n\tnamespace\x18\x02 \x01(\tR\tnamespace\x12\x12\n\x04type\x18\x03 \x01(\tR\x04type\x12\x14\n\x05model\x18\x04 \x01(\tR\x05model\x12(\n\x05frame\x18\x05 \x01(\x0b2\x12.viam.app.v1.FrameR\x05frame\x12\x1d\n\ndepends_on\x18\x06 \x03(\tR\tdependsOn\x12l\n\x0fservice_configs\x18\x07 \x03(\x0b2\'.viam.app.v1.ResourceLevelServiceConfigB\x1a\x9a\x84\x9e\x03\x15json:"service_config"R\x0eserviceConfigs\x127\n\nattributes\x18\x08 \x01(\x0b2\x17.google.protobuf.StructR\nattributes\x12\x10\n\x03api\x18\t \x01(\tR\x03api\x12J\n\x11log_configuration\x18\n \x01(\x0b2\x1d.viam.app.v1.LogConfigurationR\x10logConfiguration"i\n\x1aResourceLevelServiceConfig\x12\x12\n\x04type\x18\x01 \x01(\tR\x04type\x127\n\nattributes\x18\x02 \x01(\x0b2\x17.google.protobuf.StructR\nattributes"\xd4\x02\n\rProcessConfig\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x12\x12\n\x04args\x18\x03 \x03(\tR\x04args\x12\x10\n\x03cwd\x18\x04 \x01(\tR\x03cwd\x12\x19\n\x08one_shot\x18\x05 \x01(\x08R\x07oneShot\x12\x10\n\x03log\x18\x06 \x01(\x08R\x03log\x12\x1f\n\x0bstop_signal\x18\x07 \x01(\x05R\nstopSignal\x12<\n\x0cstop_timeout\x18\x08 \x01(\x0b2\x19.google.protobuf.DurationR\x0bstopTimeout\x125\n\x03env\x18\t \x03(\x0b2#.viam.app.v1.ProcessConfig.EnvEntryR\x03env\x1a6\n\x08EnvEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x028\x01"\x8f\x03\n\rServiceConfig\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x1c\n\tnamespace\x18\x02 \x01(\tR\tnamespace\x12\x12\n\x04type\x18\x03 \x01(\tR\x04type\x127\n\nattributes\x18\x04 \x01(\x0b2\x17.google.protobuf.StructR\nattributes\x12\x1d\n\ndepends_on\x18\x05 \x03(\tR\tdependsOn\x12\x14\n\x05model\x18\x06 \x01(\tR\x05model\x12\x10\n\x03api\x18\t \x01(\tR\x03api\x12l\n\x0fservice_configs\x18\n \x03(\x0b2\'.viam.app.v1.ResourceLevelServiceConfigB\x1a\x9a\x84\x9e\x03\x15json:"service_config"R\x0eserviceConfigs\x12J\n\x11log_configuration\x18\x0b \x01(\x0b2\x1d.viam.app.v1.LogConfigurationR\x10logConfiguration"\xc5\x01\n\rNetworkConfig\x12\x12\n\x04fqdn\x18\x01 \x01(\tR\x04fqdn\x12!\n\x0cbind_address\x18\x02 \x01(\tR\x0bbindAddress\x12"\n\rtls_cert_file\x18\x03 \x01(\tR\x0btlsCertFile\x12 \n\x0ctls_key_file\x18\x04 \x01(\tR\ntlsKeyFile\x127\n\x08sessions\x18\x05 \x01(\x0b2\x1b.viam.app.v1.SessionsConfigR\x08sessions"V\n\x0eSessionsConfig\x12D\n\x10heartbeat_window\x18\x01 \x01(\x0b2\x19.google.protobuf.DurationR\x0fheartbeatWindow"\xe5\x01\n\nAuthConfig\x12:\n\x08handlers\x18\x01 \x03(\x0b2\x1e.viam.app.v1.AuthHandlerConfigR\x08handlers\x12*\n\x11tls_auth_entities\x18\x02 \x03(\tR\x0ftlsAuthEntities\x12V\n\x14external_auth_config\x18\x03 \x01(\x0b2\x1f.viam.app.v1.ExternalAuthConfigH\x00R\x12externalAuthConfig\x88\x01\x01B\x17\n\x15_external_auth_config"7\n\x08JWKSFile\x12+\n\x04json\x18\x01 \x01(\x0b2\x17.google.protobuf.StructR\x04json"?\n\x12ExternalAuthConfig\x12)\n\x04jwks\x18\x01 \x01(\x0b2\x15.viam.app.v1.JWKSFileR\x04jwks"v\n\x11AuthHandlerConfig\x120\n\x04type\x18\x01 \x01(\x0e2\x1c.viam.app.v1.CredentialsTypeR\x04type\x12/\n\x06config\x18\x05 \x01(\x0b2\x17.google.protobuf.StructR\x06config"\xcd\x01\n\x05Frame\x12\x16\n\x06parent\x18\x01 \x01(\tR\x06parent\x12:\n\x0btranslation\x18\x02 \x01(\x0b2\x18.viam.app.v1.TranslationR\x0btranslation\x12:\n\x0borientation\x18\x03 \x01(\x0b2\x18.viam.app.v1.OrientationR\x0borientation\x124\n\x08geometry\x18\x04 \x01(\x0b2\x18.viam.common.v1.GeometryR\x08geometry"(\n\x10LogConfiguration\x12\x14\n\x05level\x18\x01 \x01(\tR\x05level"7\n\x0bTranslation\x12\x0c\n\x01x\x18\x01 \x01(\x01R\x01x\x12\x0c\n\x01y\x18\x02 \x01(\x01R\x01y\x12\x0c\n\x01z\x18\x03 \x01(\x01R\x01z"\xd0\x07\n\x0bOrientation\x12O\n\x0eno_orientation\x18\x01 \x01(\x0b2&.viam.app.v1.Orientation.NoOrientationH\x00R\rnoOrientation\x12Z\n\x0evector_radians\x18\x02 \x01(\x0b21.viam.app.v1.Orientation.OrientationVectorRadiansH\x00R\rvectorRadians\x12Z\n\x0evector_degrees\x18\x03 \x01(\x0b21.viam.app.v1.Orientation.OrientationVectorDegreesH\x00R\rvectorDegrees\x12I\n\x0ceuler_angles\x18\x04 \x01(\x0b2$.viam.app.v1.Orientation.EulerAnglesH\x00R\x0beulerAngles\x12F\n\x0baxis_angles\x18\x05 \x01(\x0b2#.viam.app.v1.Orientation.AxisAnglesH\x00R\naxisAngles\x12E\n\nquaternion\x18\x06 \x01(\x0b2#.viam.app.v1.Orientation.QuaternionH\x00R\nquaternion\x1a\x0f\n\rNoOrientation\x1aj\n\x18OrientationVectorRadians\x12$\n\x05theta\x18\x01 \x01(\x01B\x0e\x9a\x84\x9e\x03\tjson:"th"R\x05theta\x12\x0c\n\x01x\x18\x02 \x01(\x01R\x01x\x12\x0c\n\x01y\x18\x03 \x01(\x01R\x01y\x12\x0c\n\x01z\x18\x04 \x01(\x01R\x01z\x1aj\n\x18OrientationVectorDegrees\x12$\n\x05theta\x18\x01 \x01(\x01B\x0e\x9a\x84\x9e\x03\tjson:"th"R\x05theta\x12\x0c\n\x01x\x18\x02 \x01(\x01R\x01x\x12\x0c\n\x01y\x18\x03 \x01(\x01R\x01y\x12\x0c\n\x01z\x18\x04 \x01(\x01R\x01z\x1aI\n\x0bEulerAngles\x12\x12\n\x04roll\x18\x01 \x01(\x01R\x04roll\x12\x14\n\x05pitch\x18\x02 \x01(\x01R\x05pitch\x12\x10\n\x03yaw\x18\x03 \x01(\x01R\x03yaw\x1a\\\n\nAxisAngles\x12$\n\x05theta\x18\x01 \x01(\x01B\x0e\x9a\x84\x9e\x03\tjson:"th"R\x05theta\x12\x0c\n\x01x\x18\x02 \x01(\x01R\x01x\x12\x0c\n\x01y\x18\x03 \x01(\x01R\x01y\x12\x0c\n\x01z\x18\x04 \x01(\x01R\x01z\x1aD\n\nQuaternion\x12\x0c\n\x01w\x18\x01 \x01(\x01R\x01w\x12\x0c\n\x01x\x18\x02 \x01(\x01R\x01x\x12\x0c\n\x01y\x18\x03 \x01(\x01R\x01y\x12\x0c\n\x01z\x18\x04 \x01(\x01R\x01zB\x06\n\x04type"\xf5\x03\n\x0cRemoteConfig\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x18\n\x07address\x18\x02 \x01(\tR\x07address\x12(\n\x05frame\x18\x03 \x01(\x0b2\x12.viam.app.v1.FrameR\x05frame\x12+\n\x04auth\x18\x04 \x01(\x0b2\x17.viam.app.v1.RemoteAuthR\x04auth\x12\x1d\n\nmanaged_by\x18\x05 \x01(\tR\tmanagedBy\x12\x1a\n\x08insecure\x18\x06 \x01(\x08R\x08insecure\x12U\n\x19connection_check_interval\x18\x07 \x01(\x0b2\x19.google.protobuf.DurationR\x17connectionCheckInterval\x12H\n\x12reconnect_interval\x18\x08 \x01(\x0b2\x19.google.protobuf.DurationR\x11reconnectInterval\x12l\n\x0fservice_configs\x18\t \x03(\x0b2\'.viam.app.v1.ResourceLevelServiceConfigB\x1a\x9a\x84\x9e\x03\x15json:"service_config"R\x0eserviceConfigs\x12\x16\n\x06secret\x18\n \x01(\tR\x06secret"\xc6\x01\n\nRemoteAuth\x12E\n\x0bcredentials\x18\x01 \x01(\x0b2#.viam.app.v1.RemoteAuth.CredentialsR\x0bcredentials\x12\x16\n\x06entity\x18\x02 \x01(\tR\x06entity\x1aY\n\x0bCredentials\x120\n\x04type\x18\x01 \x01(\x0e2\x1c.viam.app.v1.CredentialsTypeR\x04type\x12\x18\n\x07payload\x18\x02 \x01(\tR\x07payload"\xac\x01\n\tAgentInfo\x12\x12\n\x04host\x18\x01 \x01(\tR\x04host\x12\x0e\n\x02os\x18\x02 \x01(\tR\x02os\x12\x10\n\x03ips\x18\x03 \x03(\tR\x03ips\x12\x18\n\x07version\x18\x04 \x01(\tR\x07version\x12!\n\x0cgit_revision\x18\x05 \x01(\tR\x0bgitRevision\x12\x1f\n\x08platform\x18\x06 \x01(\tH\x00R\x08platform\x88\x01\x01B\x0b\n\t_platform"j\n\rConfigRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12:\n\nagent_info\x18\x02 \x01(\x0b2\x16.viam.app.v1.AgentInfoH\x00R\tagentInfo\x88\x01\x01B\r\n\x0b_agent_info"B\n\x0eConfigResponse\x120\n\x06config\x18\x01 \x01(\x0b2\x18.viam.app.v1.RobotConfigR\x06config"$\n\x12CertificateRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"v\n\x13CertificateResponse\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\'\n\x0ftls_certificate\x18\x02 \x01(\tR\x0etlsCertificate\x12&\n\x0ftls_private_key\x18\x03 \x01(\tR\rtlsPrivateKey"J\n\nLogRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12,\n\x04logs\x18\x02 \x03(\x0b2\x18.viam.common.v1.LogEntryR\x04logs"\r\n\x0bLogResponse"%\n\x13NeedsRestartRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"\x9a\x01\n\x14NeedsRestartResponse\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12!\n\x0cmust_restart\x18\x02 \x01(\x08R\x0bmustRestart\x12O\n\x16restart_check_interval\x18\x03 \x01(\x0b2\x19.google.protobuf.DurationR\x14restartCheckInterval"\xac\x02\n\x0cModuleConfig\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x12\n\x04path\x18\x02 \x01(\tR\x04path\x12\x1b\n\tlog_level\x18\x03 \x01(\tR\x08logLevel\x12\x12\n\x04type\x18\x04 \x01(\tR\x04type\x12\x1b\n\tmodule_id\x18\x05 \x01(\tR\x08moduleId\x124\n\x03env\x18\x06 \x03(\x0b2".viam.app.v1.ModuleConfig.EnvEntryR\x03env\x128\n\x06status\x18\x07 \x01(\x0b2 .viam.app.v1.AppValidationStatusR\x06status\x1a6\n\x08EnvEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x028\x01"\xa5\x01\n\rPackageConfig\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x18\n\x07package\x18\x02 \x01(\tR\x07package\x12\x18\n\x07version\x18\x03 \x01(\tR\x07version\x12\x12\n\x04type\x18\x04 \x01(\tR\x04type\x128\n\x06status\x18\x05 \x01(\x0b2 .viam.app.v1.AppValidationStatusR\x06status*\xbf\x01\n\x0fCredentialsType\x12 \n\x1cCREDENTIALS_TYPE_UNSPECIFIED\x10\x00\x12\x1d\n\x19CREDENTIALS_TYPE_INTERNAL\x10\x01\x12\x1c\n\x18CREDENTIALS_TYPE_API_KEY\x10\x02\x12!\n\x1dCREDENTIALS_TYPE_ROBOT_SECRET\x10\x03\x12*\n&CREDENTIALS_TYPE_ROBOT_LOCATION_SECRET\x10\x042\xb2\x02\n\x0cRobotService\x12A\n\x06Config\x12\x1a.viam.app.v1.ConfigRequest\x1a\x1b.viam.app.v1.ConfigResponse\x12P\n\x0bCertificate\x12\x1f.viam.app.v1.CertificateRequest\x1a .viam.app.v1.CertificateResponse\x128\n\x03Log\x12\x17.viam.app.v1.LogRequest\x1a\x18.viam.app.v1.LogResponse\x12S\n\x0cNeedsRestart\x12 .viam.app.v1.NeedsRestartRequest\x1a!.viam.app.v1.NeedsRestartResponseB\x18Z\x16go.viam.com/api/app/v1b\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12app/v1/robot.proto\x12\x0bviam.app.v1\x1a\x16common/v1/common.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x16tagger/v1/tagger.proto"\xc6\x06\n\x0bRobotConfig\x12.\n\x05cloud\x18\x01 \x01(\x0b2\x18.viam.app.v1.CloudConfigR\x05cloud\x123\n\x07remotes\x18\x02 \x03(\x0b2\x19.viam.app.v1.RemoteConfigR\x07remotes\x12<\n\ncomponents\x18\x03 \x03(\x0b2\x1c.viam.app.v1.ComponentConfigR\ncomponents\x128\n\tprocesses\x18\x04 \x03(\x0b2\x1a.viam.app.v1.ProcessConfigR\tprocesses\x126\n\x08services\x18\x05 \x03(\x0b2\x1a.viam.app.v1.ServiceConfigR\x08services\x129\n\x07network\x18\x06 \x01(\x0b2\x1a.viam.app.v1.NetworkConfigH\x00R\x07network\x88\x01\x01\x120\n\x04auth\x18\x07 \x01(\x0b2\x17.viam.app.v1.AuthConfigH\x01R\x04auth\x88\x01\x01\x12\x19\n\x05debug\x18\x08 \x01(\x08H\x02R\x05debug\x88\x01\x01\x123\n\x07modules\x18\t \x03(\x0b2\x19.viam.app.v1.ModuleConfigR\x07modules\x127\n\x15disable_partial_start\x18\n \x01(\x08H\x03R\x13disablePartialStart\x88\x01\x01\x126\n\x08packages\x18\x0b \x03(\x0b2\x1a.viam.app.v1.PackageConfigR\x08packages\x12\\\n\x19overwrite_fragment_status\x18\x0c \x03(\x0b2 .viam.app.v1.AppValidationStatusR\x17overwriteFragmentStatus\x12,\n\x12enable_web_profile\x18\r \x01(\x08R\x10enableWebProfile\x12/\n\x03log\x18\x0e \x03(\x0b2\x1d.viam.app.v1.LogPatternConfigR\x03logB\n\n\x08_networkB\x07\n\x05_authB\x08\n\x06_debugB\x18\n\x16_disable_partial_start"B\n\x10LogPatternConfig\x12\x18\n\x07pattern\x18\x01 \x01(\tR\x07pattern\x12\x14\n\x05level\x18\x02 \x01(\tR\x05level"8\n\x0eLocationSecret\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x16\n\x06secret\x18\x02 \x01(\tR\x06secret"+\n\x13AppValidationStatus\x12\x14\n\x05error\x18\x01 \x01(\tR\x05error"\xbe\x03\n\x0bCloudConfig\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04fqdn\x18\x02 \x01(\tR\x04fqdn\x12\x1d\n\nlocal_fqdn\x18\x03 \x01(\tR\tlocalFqdn\x12\x1d\n\nmanaged_by\x18\x04 \x01(\tR\tmanagedBy\x12+\n\x11signaling_address\x18\x05 \x01(\tR\x10signalingAddress\x12-\n\x12signaling_insecure\x18\x06 \x01(\x08R\x11signalingInsecure\x12+\n\x0flocation_secret\x18\x07 \x01(\tB\x02\x18\x01R\x0elocationSecret\x12\x16\n\x06secret\x18\x08 \x01(\tR\x06secret\x12F\n\x10location_secrets\x18\t \x03(\x0b2\x1b.viam.app.v1.LocationSecretR\x0flocationSecrets\x12$\n\x0eprimary_org_id\x18\n \x01(\tR\x0cprimaryOrgId\x12\x1f\n\x0blocation_id\x18\x0b \x01(\tR\nlocationId\x12\x1d\n\nmachine_id\x18\x0c \x01(\tR\tmachineId"\xbb\x03\n\x0fComponentConfig\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x1c\n\tnamespace\x18\x02 \x01(\tR\tnamespace\x12\x12\n\x04type\x18\x03 \x01(\tR\x04type\x12\x14\n\x05model\x18\x04 \x01(\tR\x05model\x12(\n\x05frame\x18\x05 \x01(\x0b2\x12.viam.app.v1.FrameR\x05frame\x12\x1d\n\ndepends_on\x18\x06 \x03(\tR\tdependsOn\x12l\n\x0fservice_configs\x18\x07 \x03(\x0b2\'.viam.app.v1.ResourceLevelServiceConfigB\x1a\x9a\x84\x9e\x03\x15json:"service_config"R\x0eserviceConfigs\x127\n\nattributes\x18\x08 \x01(\x0b2\x17.google.protobuf.StructR\nattributes\x12\x10\n\x03api\x18\t \x01(\tR\x03api\x12J\n\x11log_configuration\x18\n \x01(\x0b2\x1d.viam.app.v1.LogConfigurationR\x10logConfiguration"i\n\x1aResourceLevelServiceConfig\x12\x12\n\x04type\x18\x01 \x01(\tR\x04type\x127\n\nattributes\x18\x02 \x01(\x0b2\x17.google.protobuf.StructR\nattributes"\xd4\x02\n\rProcessConfig\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n\x04name\x18\x02 \x01(\tR\x04name\x12\x12\n\x04args\x18\x03 \x03(\tR\x04args\x12\x10\n\x03cwd\x18\x04 \x01(\tR\x03cwd\x12\x19\n\x08one_shot\x18\x05 \x01(\x08R\x07oneShot\x12\x10\n\x03log\x18\x06 \x01(\x08R\x03log\x12\x1f\n\x0bstop_signal\x18\x07 \x01(\x05R\nstopSignal\x12<\n\x0cstop_timeout\x18\x08 \x01(\x0b2\x19.google.protobuf.DurationR\x0bstopTimeout\x125\n\x03env\x18\t \x03(\x0b2#.viam.app.v1.ProcessConfig.EnvEntryR\x03env\x1a6\n\x08EnvEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x028\x01"\x8f\x03\n\rServiceConfig\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x1c\n\tnamespace\x18\x02 \x01(\tR\tnamespace\x12\x12\n\x04type\x18\x03 \x01(\tR\x04type\x127\n\nattributes\x18\x04 \x01(\x0b2\x17.google.protobuf.StructR\nattributes\x12\x1d\n\ndepends_on\x18\x05 \x03(\tR\tdependsOn\x12\x14\n\x05model\x18\x06 \x01(\tR\x05model\x12\x10\n\x03api\x18\t \x01(\tR\x03api\x12l\n\x0fservice_configs\x18\n \x03(\x0b2\'.viam.app.v1.ResourceLevelServiceConfigB\x1a\x9a\x84\x9e\x03\x15json:"service_config"R\x0eserviceConfigs\x12J\n\x11log_configuration\x18\x0b \x01(\x0b2\x1d.viam.app.v1.LogConfigurationR\x10logConfiguration"\xc5\x01\n\rNetworkConfig\x12\x12\n\x04fqdn\x18\x01 \x01(\tR\x04fqdn\x12!\n\x0cbind_address\x18\x02 \x01(\tR\x0bbindAddress\x12"\n\rtls_cert_file\x18\x03 \x01(\tR\x0btlsCertFile\x12 \n\x0ctls_key_file\x18\x04 \x01(\tR\ntlsKeyFile\x127\n\x08sessions\x18\x05 \x01(\x0b2\x1b.viam.app.v1.SessionsConfigR\x08sessions"V\n\x0eSessionsConfig\x12D\n\x10heartbeat_window\x18\x01 \x01(\x0b2\x19.google.protobuf.DurationR\x0fheartbeatWindow"\xe5\x01\n\nAuthConfig\x12:\n\x08handlers\x18\x01 \x03(\x0b2\x1e.viam.app.v1.AuthHandlerConfigR\x08handlers\x12*\n\x11tls_auth_entities\x18\x02 \x03(\tR\x0ftlsAuthEntities\x12V\n\x14external_auth_config\x18\x03 \x01(\x0b2\x1f.viam.app.v1.ExternalAuthConfigH\x00R\x12externalAuthConfig\x88\x01\x01B\x17\n\x15_external_auth_config"7\n\x08JWKSFile\x12+\n\x04json\x18\x01 \x01(\x0b2\x17.google.protobuf.StructR\x04json"?\n\x12ExternalAuthConfig\x12)\n\x04jwks\x18\x01 \x01(\x0b2\x15.viam.app.v1.JWKSFileR\x04jwks"v\n\x11AuthHandlerConfig\x120\n\x04type\x18\x01 \x01(\x0e2\x1c.viam.app.v1.CredentialsTypeR\x04type\x12/\n\x06config\x18\x05 \x01(\x0b2\x17.google.protobuf.StructR\x06config"\xcd\x01\n\x05Frame\x12\x16\n\x06parent\x18\x01 \x01(\tR\x06parent\x12:\n\x0btranslation\x18\x02 \x01(\x0b2\x18.viam.app.v1.TranslationR\x0btranslation\x12:\n\x0borientation\x18\x03 \x01(\x0b2\x18.viam.app.v1.OrientationR\x0borientation\x124\n\x08geometry\x18\x04 \x01(\x0b2\x18.viam.common.v1.GeometryR\x08geometry"(\n\x10LogConfiguration\x12\x14\n\x05level\x18\x01 \x01(\tR\x05level"7\n\x0bTranslation\x12\x0c\n\x01x\x18\x01 \x01(\x01R\x01x\x12\x0c\n\x01y\x18\x02 \x01(\x01R\x01y\x12\x0c\n\x01z\x18\x03 \x01(\x01R\x01z"\xd0\x07\n\x0bOrientation\x12O\n\x0eno_orientation\x18\x01 \x01(\x0b2&.viam.app.v1.Orientation.NoOrientationH\x00R\rnoOrientation\x12Z\n\x0evector_radians\x18\x02 \x01(\x0b21.viam.app.v1.Orientation.OrientationVectorRadiansH\x00R\rvectorRadians\x12Z\n\x0evector_degrees\x18\x03 \x01(\x0b21.viam.app.v1.Orientation.OrientationVectorDegreesH\x00R\rvectorDegrees\x12I\n\x0ceuler_angles\x18\x04 \x01(\x0b2$.viam.app.v1.Orientation.EulerAnglesH\x00R\x0beulerAngles\x12F\n\x0baxis_angles\x18\x05 \x01(\x0b2#.viam.app.v1.Orientation.AxisAnglesH\x00R\naxisAngles\x12E\n\nquaternion\x18\x06 \x01(\x0b2#.viam.app.v1.Orientation.QuaternionH\x00R\nquaternion\x1a\x0f\n\rNoOrientation\x1aj\n\x18OrientationVectorRadians\x12$\n\x05theta\x18\x01 \x01(\x01B\x0e\x9a\x84\x9e\x03\tjson:"th"R\x05theta\x12\x0c\n\x01x\x18\x02 \x01(\x01R\x01x\x12\x0c\n\x01y\x18\x03 \x01(\x01R\x01y\x12\x0c\n\x01z\x18\x04 \x01(\x01R\x01z\x1aj\n\x18OrientationVectorDegrees\x12$\n\x05theta\x18\x01 \x01(\x01B\x0e\x9a\x84\x9e\x03\tjson:"th"R\x05theta\x12\x0c\n\x01x\x18\x02 \x01(\x01R\x01x\x12\x0c\n\x01y\x18\x03 \x01(\x01R\x01y\x12\x0c\n\x01z\x18\x04 \x01(\x01R\x01z\x1aI\n\x0bEulerAngles\x12\x12\n\x04roll\x18\x01 \x01(\x01R\x04roll\x12\x14\n\x05pitch\x18\x02 \x01(\x01R\x05pitch\x12\x10\n\x03yaw\x18\x03 \x01(\x01R\x03yaw\x1a\\\n\nAxisAngles\x12$\n\x05theta\x18\x01 \x01(\x01B\x0e\x9a\x84\x9e\x03\tjson:"th"R\x05theta\x12\x0c\n\x01x\x18\x02 \x01(\x01R\x01x\x12\x0c\n\x01y\x18\x03 \x01(\x01R\x01y\x12\x0c\n\x01z\x18\x04 \x01(\x01R\x01z\x1aD\n\nQuaternion\x12\x0c\n\x01w\x18\x01 \x01(\x01R\x01w\x12\x0c\n\x01x\x18\x02 \x01(\x01R\x01x\x12\x0c\n\x01y\x18\x03 \x01(\x01R\x01y\x12\x0c\n\x01z\x18\x04 \x01(\x01R\x01zB\x06\n\x04type"\xf5\x03\n\x0cRemoteConfig\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x18\n\x07address\x18\x02 \x01(\tR\x07address\x12(\n\x05frame\x18\x03 \x01(\x0b2\x12.viam.app.v1.FrameR\x05frame\x12+\n\x04auth\x18\x04 \x01(\x0b2\x17.viam.app.v1.RemoteAuthR\x04auth\x12\x1d\n\nmanaged_by\x18\x05 \x01(\tR\tmanagedBy\x12\x1a\n\x08insecure\x18\x06 \x01(\x08R\x08insecure\x12U\n\x19connection_check_interval\x18\x07 \x01(\x0b2\x19.google.protobuf.DurationR\x17connectionCheckInterval\x12H\n\x12reconnect_interval\x18\x08 \x01(\x0b2\x19.google.protobuf.DurationR\x11reconnectInterval\x12l\n\x0fservice_configs\x18\t \x03(\x0b2\'.viam.app.v1.ResourceLevelServiceConfigB\x1a\x9a\x84\x9e\x03\x15json:"service_config"R\x0eserviceConfigs\x12\x16\n\x06secret\x18\n \x01(\tR\x06secret"\xc6\x01\n\nRemoteAuth\x12E\n\x0bcredentials\x18\x01 \x01(\x0b2#.viam.app.v1.RemoteAuth.CredentialsR\x0bcredentials\x12\x16\n\x06entity\x18\x02 \x01(\tR\x06entity\x1aY\n\x0bCredentials\x120\n\x04type\x18\x01 \x01(\x0e2\x1c.viam.app.v1.CredentialsTypeR\x04type\x12\x18\n\x07payload\x18\x02 \x01(\tR\x07payload"\xac\x01\n\tAgentInfo\x12\x12\n\x04host\x18\x01 \x01(\tR\x04host\x12\x0e\n\x02os\x18\x02 \x01(\tR\x02os\x12\x10\n\x03ips\x18\x03 \x03(\tR\x03ips\x12\x18\n\x07version\x18\x04 \x01(\tR\x07version\x12!\n\x0cgit_revision\x18\x05 \x01(\tR\x0bgitRevision\x12\x1f\n\x08platform\x18\x06 \x01(\tH\x00R\x08platform\x88\x01\x01B\x0b\n\t_platform"j\n\rConfigRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12:\n\nagent_info\x18\x02 \x01(\x0b2\x16.viam.app.v1.AgentInfoH\x00R\tagentInfo\x88\x01\x01B\r\n\x0b_agent_info"B\n\x0eConfigResponse\x120\n\x06config\x18\x01 \x01(\x0b2\x18.viam.app.v1.RobotConfigR\x06config"$\n\x12CertificateRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"v\n\x13CertificateResponse\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\'\n\x0ftls_certificate\x18\x02 \x01(\tR\x0etlsCertificate\x12&\n\x0ftls_private_key\x18\x03 \x01(\tR\rtlsPrivateKey"J\n\nLogRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12,\n\x04logs\x18\x02 \x03(\x0b2\x18.viam.common.v1.LogEntryR\x04logs"\r\n\x0bLogResponse"%\n\x13NeedsRestartRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"\x9a\x01\n\x14NeedsRestartResponse\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12!\n\x0cmust_restart\x18\x02 \x01(\x08R\x0bmustRestart\x12O\n\x16restart_check_interval\x18\x03 \x01(\x0b2\x19.google.protobuf.DurationR\x14restartCheckInterval"\xac\x02\n\x0cModuleConfig\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x12\n\x04path\x18\x02 \x01(\tR\x04path\x12\x1b\n\tlog_level\x18\x03 \x01(\tR\x08logLevel\x12\x12\n\x04type\x18\x04 \x01(\tR\x04type\x12\x1b\n\tmodule_id\x18\x05 \x01(\tR\x08moduleId\x124\n\x03env\x18\x06 \x03(\x0b2".viam.app.v1.ModuleConfig.EnvEntryR\x03env\x128\n\x06status\x18\x07 \x01(\x0b2 .viam.app.v1.AppValidationStatusR\x06status\x1a6\n\x08EnvEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n\x05value\x18\x02 \x01(\tR\x05value:\x028\x01"\xa5\x01\n\rPackageConfig\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x18\n\x07package\x18\x02 \x01(\tR\x07package\x12\x18\n\x07version\x18\x03 \x01(\tR\x07version\x12\x12\n\x04type\x18\x04 \x01(\tR\x04type\x128\n\x06status\x18\x05 \x01(\x0b2 .viam.app.v1.AppValidationStatusR\x06status*\xbf\x01\n\x0fCredentialsType\x12 \n\x1cCREDENTIALS_TYPE_UNSPECIFIED\x10\x00\x12\x1d\n\x19CREDENTIALS_TYPE_INTERNAL\x10\x01\x12\x1c\n\x18CREDENTIALS_TYPE_API_KEY\x10\x02\x12!\n\x1dCREDENTIALS_TYPE_ROBOT_SECRET\x10\x03\x12*\n&CREDENTIALS_TYPE_ROBOT_LOCATION_SECRET\x10\x042\xb2\x02\n\x0cRobotService\x12A\n\x06Config\x12\x1a.viam.app.v1.ConfigRequest\x1a\x1b.viam.app.v1.ConfigResponse\x12P\n\x0bCertificate\x12\x1f.viam.app.v1.CertificateRequest\x1a .viam.app.v1.CertificateResponse\x128\n\x03Log\x12\x17.viam.app.v1.LogRequest\x1a\x18.viam.app.v1.LogResponse\x12S\n\x0cNeedsRestart\x12 .viam.app.v1.NeedsRestartRequest\x1a!.viam.app.v1.NeedsRestartResponseB\x18Z\x16go.viam.com/api/app/v1b\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'app.v1.robot_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
@@ -32,87 +32,89 @@
_REMOTECONFIG.fields_by_name['service_configs']._serialized_options = b'\x9a\x84\x9e\x03\x15json:"service_config"'
_MODULECONFIG_ENVENTRY._options = None
_MODULECONFIG_ENVENTRY._serialized_options = b'8\x01'
- _CREDENTIALSTYPE._serialized_start = 6808
- _CREDENTIALSTYPE._serialized_end = 6999
+ _CREDENTIALSTYPE._serialized_start = 6925
+ _CREDENTIALSTYPE._serialized_end = 7116
_ROBOTCONFIG._serialized_start = 146
- _ROBOTCONFIG._serialized_end = 935
- _LOCATIONSECRET._serialized_start = 937
- _LOCATIONSECRET._serialized_end = 993
- _APPVALIDATIONSTATUS._serialized_start = 995
- _APPVALIDATIONSTATUS._serialized_end = 1038
- _CLOUDCONFIG._serialized_start = 1041
- _CLOUDCONFIG._serialized_end = 1487
- _COMPONENTCONFIG._serialized_start = 1490
- _COMPONENTCONFIG._serialized_end = 1933
- _RESOURCELEVELSERVICECONFIG._serialized_start = 1935
- _RESOURCELEVELSERVICECONFIG._serialized_end = 2040
- _PROCESSCONFIG._serialized_start = 2043
- _PROCESSCONFIG._serialized_end = 2383
- _PROCESSCONFIG_ENVENTRY._serialized_start = 2329
- _PROCESSCONFIG_ENVENTRY._serialized_end = 2383
- _SERVICECONFIG._serialized_start = 2386
- _SERVICECONFIG._serialized_end = 2785
- _NETWORKCONFIG._serialized_start = 2788
- _NETWORKCONFIG._serialized_end = 2985
- _SESSIONSCONFIG._serialized_start = 2987
- _SESSIONSCONFIG._serialized_end = 3073
- _AUTHCONFIG._serialized_start = 3076
- _AUTHCONFIG._serialized_end = 3305
- _JWKSFILE._serialized_start = 3307
- _JWKSFILE._serialized_end = 3362
- _EXTERNALAUTHCONFIG._serialized_start = 3364
- _EXTERNALAUTHCONFIG._serialized_end = 3427
- _AUTHHANDLERCONFIG._serialized_start = 3429
- _AUTHHANDLERCONFIG._serialized_end = 3547
- _FRAME._serialized_start = 3550
- _FRAME._serialized_end = 3755
- _LOGCONFIGURATION._serialized_start = 3757
- _LOGCONFIGURATION._serialized_end = 3797
- _TRANSLATION._serialized_start = 3799
- _TRANSLATION._serialized_end = 3854
- _ORIENTATION._serialized_start = 3857
- _ORIENTATION._serialized_end = 4833
- _ORIENTATION_NOORIENTATION._serialized_start = 4355
- _ORIENTATION_NOORIENTATION._serialized_end = 4370
- _ORIENTATION_ORIENTATIONVECTORRADIANS._serialized_start = 4372
- _ORIENTATION_ORIENTATIONVECTORRADIANS._serialized_end = 4478
- _ORIENTATION_ORIENTATIONVECTORDEGREES._serialized_start = 4480
- _ORIENTATION_ORIENTATIONVECTORDEGREES._serialized_end = 4586
- _ORIENTATION_EULERANGLES._serialized_start = 4588
- _ORIENTATION_EULERANGLES._serialized_end = 4661
- _ORIENTATION_AXISANGLES._serialized_start = 4663
- _ORIENTATION_AXISANGLES._serialized_end = 4755
- _ORIENTATION_QUATERNION._serialized_start = 4757
- _ORIENTATION_QUATERNION._serialized_end = 4825
- _REMOTECONFIG._serialized_start = 4836
- _REMOTECONFIG._serialized_end = 5337
- _REMOTEAUTH._serialized_start = 5340
- _REMOTEAUTH._serialized_end = 5538
- _REMOTEAUTH_CREDENTIALS._serialized_start = 5449
- _REMOTEAUTH_CREDENTIALS._serialized_end = 5538
- _AGENTINFO._serialized_start = 5541
- _AGENTINFO._serialized_end = 5713
- _CONFIGREQUEST._serialized_start = 5715
- _CONFIGREQUEST._serialized_end = 5821
- _CONFIGRESPONSE._serialized_start = 5823
- _CONFIGRESPONSE._serialized_end = 5889
- _CERTIFICATEREQUEST._serialized_start = 5891
- _CERTIFICATEREQUEST._serialized_end = 5927
- _CERTIFICATERESPONSE._serialized_start = 5929
- _CERTIFICATERESPONSE._serialized_end = 6047
- _LOGREQUEST._serialized_start = 6049
- _LOGREQUEST._serialized_end = 6123
- _LOGRESPONSE._serialized_start = 6125
- _LOGRESPONSE._serialized_end = 6138
- _NEEDSRESTARTREQUEST._serialized_start = 6140
- _NEEDSRESTARTREQUEST._serialized_end = 6177
- _NEEDSRESTARTRESPONSE._serialized_start = 6180
- _NEEDSRESTARTRESPONSE._serialized_end = 6334
- _MODULECONFIG._serialized_start = 6337
- _MODULECONFIG._serialized_end = 6637
- _MODULECONFIG_ENVENTRY._serialized_start = 2329
- _MODULECONFIG_ENVENTRY._serialized_end = 2383
- _PACKAGECONFIG._serialized_start = 6640
- _PACKAGECONFIG._serialized_end = 6805
- _ROBOTSERVICE._serialized_start = 7002
- _ROBOTSERVICE._serialized_end = 7308
\ No newline at end of file
+ _ROBOTCONFIG._serialized_end = 984
+ _LOGPATTERNCONFIG._serialized_start = 986
+ _LOGPATTERNCONFIG._serialized_end = 1052
+ _LOCATIONSECRET._serialized_start = 1054
+ _LOCATIONSECRET._serialized_end = 1110
+ _APPVALIDATIONSTATUS._serialized_start = 1112
+ _APPVALIDATIONSTATUS._serialized_end = 1155
+ _CLOUDCONFIG._serialized_start = 1158
+ _CLOUDCONFIG._serialized_end = 1604
+ _COMPONENTCONFIG._serialized_start = 1607
+ _COMPONENTCONFIG._serialized_end = 2050
+ _RESOURCELEVELSERVICECONFIG._serialized_start = 2052
+ _RESOURCELEVELSERVICECONFIG._serialized_end = 2157
+ _PROCESSCONFIG._serialized_start = 2160
+ _PROCESSCONFIG._serialized_end = 2500
+ _PROCESSCONFIG_ENVENTRY._serialized_start = 2446
+ _PROCESSCONFIG_ENVENTRY._serialized_end = 2500
+ _SERVICECONFIG._serialized_start = 2503
+ _SERVICECONFIG._serialized_end = 2902
+ _NETWORKCONFIG._serialized_start = 2905
+ _NETWORKCONFIG._serialized_end = 3102
+ _SESSIONSCONFIG._serialized_start = 3104
+ _SESSIONSCONFIG._serialized_end = 3190
+ _AUTHCONFIG._serialized_start = 3193
+ _AUTHCONFIG._serialized_end = 3422
+ _JWKSFILE._serialized_start = 3424
+ _JWKSFILE._serialized_end = 3479
+ _EXTERNALAUTHCONFIG._serialized_start = 3481
+ _EXTERNALAUTHCONFIG._serialized_end = 3544
+ _AUTHHANDLERCONFIG._serialized_start = 3546
+ _AUTHHANDLERCONFIG._serialized_end = 3664
+ _FRAME._serialized_start = 3667
+ _FRAME._serialized_end = 3872
+ _LOGCONFIGURATION._serialized_start = 3874
+ _LOGCONFIGURATION._serialized_end = 3914
+ _TRANSLATION._serialized_start = 3916
+ _TRANSLATION._serialized_end = 3971
+ _ORIENTATION._serialized_start = 3974
+ _ORIENTATION._serialized_end = 4950
+ _ORIENTATION_NOORIENTATION._serialized_start = 4472
+ _ORIENTATION_NOORIENTATION._serialized_end = 4487
+ _ORIENTATION_ORIENTATIONVECTORRADIANS._serialized_start = 4489
+ _ORIENTATION_ORIENTATIONVECTORRADIANS._serialized_end = 4595
+ _ORIENTATION_ORIENTATIONVECTORDEGREES._serialized_start = 4597
+ _ORIENTATION_ORIENTATIONVECTORDEGREES._serialized_end = 4703
+ _ORIENTATION_EULERANGLES._serialized_start = 4705
+ _ORIENTATION_EULERANGLES._serialized_end = 4778
+ _ORIENTATION_AXISANGLES._serialized_start = 4780
+ _ORIENTATION_AXISANGLES._serialized_end = 4872
+ _ORIENTATION_QUATERNION._serialized_start = 4874
+ _ORIENTATION_QUATERNION._serialized_end = 4942
+ _REMOTECONFIG._serialized_start = 4953
+ _REMOTECONFIG._serialized_end = 5454
+ _REMOTEAUTH._serialized_start = 5457
+ _REMOTEAUTH._serialized_end = 5655
+ _REMOTEAUTH_CREDENTIALS._serialized_start = 5566
+ _REMOTEAUTH_CREDENTIALS._serialized_end = 5655
+ _AGENTINFO._serialized_start = 5658
+ _AGENTINFO._serialized_end = 5830
+ _CONFIGREQUEST._serialized_start = 5832
+ _CONFIGREQUEST._serialized_end = 5938
+ _CONFIGRESPONSE._serialized_start = 5940
+ _CONFIGRESPONSE._serialized_end = 6006
+ _CERTIFICATEREQUEST._serialized_start = 6008
+ _CERTIFICATEREQUEST._serialized_end = 6044
+ _CERTIFICATERESPONSE._serialized_start = 6046
+ _CERTIFICATERESPONSE._serialized_end = 6164
+ _LOGREQUEST._serialized_start = 6166
+ _LOGREQUEST._serialized_end = 6240
+ _LOGRESPONSE._serialized_start = 6242
+ _LOGRESPONSE._serialized_end = 6255
+ _NEEDSRESTARTREQUEST._serialized_start = 6257
+ _NEEDSRESTARTREQUEST._serialized_end = 6294
+ _NEEDSRESTARTRESPONSE._serialized_start = 6297
+ _NEEDSRESTARTRESPONSE._serialized_end = 6451
+ _MODULECONFIG._serialized_start = 6454
+ _MODULECONFIG._serialized_end = 6754
+ _MODULECONFIG_ENVENTRY._serialized_start = 2446
+ _MODULECONFIG_ENVENTRY._serialized_end = 2500
+ _PACKAGECONFIG._serialized_start = 6757
+ _PACKAGECONFIG._serialized_end = 6922
+ _ROBOTSERVICE._serialized_start = 7119
+ _ROBOTSERVICE._serialized_end = 7425
\ No newline at end of file
diff --git a/src/viam/gen/app/v1/robot_pb2.pyi b/src/viam/gen/app/v1/robot_pb2.pyi
index 7dea53ed3..c966e6c00 100644
--- a/src/viam/gen/app/v1/robot_pb2.pyi
+++ b/src/viam/gen/app/v1/robot_pb2.pyi
@@ -56,6 +56,7 @@ class RobotConfig(google.protobuf.message.Message):
PACKAGES_FIELD_NUMBER: builtins.int
OVERWRITE_FRAGMENT_STATUS_FIELD_NUMBER: builtins.int
ENABLE_WEB_PROFILE_FIELD_NUMBER: builtins.int
+ LOG_FIELD_NUMBER: builtins.int
debug: builtins.bool
'Turns on debug mode for robot, adding an echo server and more logging and tracing. Only works after restart'
disable_partial_start: builtins.bool
@@ -102,13 +103,17 @@ class RobotConfig(google.protobuf.message.Message):
def overwrite_fragment_status(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___AppValidationStatus]:
...
- def __init__(self, *, cloud: global___CloudConfig | None=..., remotes: collections.abc.Iterable[global___RemoteConfig] | None=..., components: collections.abc.Iterable[global___ComponentConfig] | None=..., processes: collections.abc.Iterable[global___ProcessConfig] | None=..., services: collections.abc.Iterable[global___ServiceConfig] | None=..., network: global___NetworkConfig | None=..., auth: global___AuthConfig | None=..., debug: builtins.bool | None=..., modules: collections.abc.Iterable[global___ModuleConfig] | None=..., disable_partial_start: builtins.bool | None=..., packages: collections.abc.Iterable[global___PackageConfig] | None=..., overwrite_fragment_status: collections.abc.Iterable[global___AppValidationStatus] | None=..., enable_web_profile: builtins.bool=...) -> None:
+ @property
+ def log(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___LogPatternConfig]:
+ ...
+
+ def __init__(self, *, cloud: global___CloudConfig | None=..., remotes: collections.abc.Iterable[global___RemoteConfig] | None=..., components: collections.abc.Iterable[global___ComponentConfig] | None=..., processes: collections.abc.Iterable[global___ProcessConfig] | None=..., services: collections.abc.Iterable[global___ServiceConfig] | None=..., network: global___NetworkConfig | None=..., auth: global___AuthConfig | None=..., debug: builtins.bool | None=..., modules: collections.abc.Iterable[global___ModuleConfig] | None=..., disable_partial_start: builtins.bool | None=..., packages: collections.abc.Iterable[global___PackageConfig] | None=..., overwrite_fragment_status: collections.abc.Iterable[global___AppValidationStatus] | None=..., enable_web_profile: builtins.bool=..., log: collections.abc.Iterable[global___LogPatternConfig] | None=...) -> None:
...
def HasField(self, field_name: typing.Literal['_auth', b'_auth', '_debug', b'_debug', '_disable_partial_start', b'_disable_partial_start', '_network', b'_network', 'auth', b'auth', 'cloud', b'cloud', 'debug', b'debug', 'disable_partial_start', b'disable_partial_start', 'network', b'network']) -> builtins.bool:
...
- def ClearField(self, field_name: typing.Literal['_auth', b'_auth', '_debug', b'_debug', '_disable_partial_start', b'_disable_partial_start', '_network', b'_network', 'auth', b'auth', 'cloud', b'cloud', 'components', b'components', 'debug', b'debug', 'disable_partial_start', b'disable_partial_start', 'enable_web_profile', b'enable_web_profile', 'modules', b'modules', 'network', b'network', 'overwrite_fragment_status', b'overwrite_fragment_status', 'packages', b'packages', 'processes', b'processes', 'remotes', b'remotes', 'services', b'services']) -> None:
+ def ClearField(self, field_name: typing.Literal['_auth', b'_auth', '_debug', b'_debug', '_disable_partial_start', b'_disable_partial_start', '_network', b'_network', 'auth', b'auth', 'cloud', b'cloud', 'components', b'components', 'debug', b'debug', 'disable_partial_start', b'disable_partial_start', 'enable_web_profile', b'enable_web_profile', 'log', b'log', 'modules', b'modules', 'network', b'network', 'overwrite_fragment_status', b'overwrite_fragment_status', 'packages', b'packages', 'processes', b'processes', 'remotes', b'remotes', 'services', b'services']) -> None:
...
@typing.overload
@@ -128,6 +133,24 @@ class RobotConfig(google.protobuf.message.Message):
...
global___RobotConfig = RobotConfig
+@typing.final
+class LogPatternConfig(google.protobuf.message.Message):
+ """LogPatternConfig allows you to specify a 2-tuple consisting
+ of a logger name and its corresponding log level.
+ """
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+ PATTERN_FIELD_NUMBER: builtins.int
+ LEVEL_FIELD_NUMBER: builtins.int
+ pattern: builtins.str
+ level: builtins.str
+
+ def __init__(self, *, pattern: builtins.str=..., level: builtins.str=...) -> None:
+ ...
+
+ def ClearField(self, field_name: typing.Literal['level', b'level', 'pattern', b'pattern']) -> None:
+ ...
+global___LogPatternConfig = LogPatternConfig
+
@typing.final
class LocationSecret(google.protobuf.message.Message):
"""Valid location secret that can be used for authentication to the robot."""
diff --git a/src/viam/gen/robot/v1/robot_grpc.py b/src/viam/gen/robot/v1/robot_grpc.py
index 049c5753e..3d9217c2c 100644
--- a/src/viam/gen/robot/v1/robot_grpc.py
+++ b/src/viam/gen/robot/v1/robot_grpc.py
@@ -90,8 +90,12 @@ async def RestartModule(self, stream: 'grpclib.server.Stream[robot.v1.robot_pb2.
async def Shutdown(self, stream: 'grpclib.server.Stream[robot.v1.robot_pb2.ShutdownRequest, robot.v1.robot_pb2.ShutdownResponse]') -> None:
pass
+ @abc.abstractmethod
+ async def GetMachineStatus(self, stream: 'grpclib.server.Stream[robot.v1.robot_pb2.GetMachineStatusRequest, robot.v1.robot_pb2.GetMachineStatusResponse]') -> None:
+ pass
+
def __mapping__(self) -> typing.Dict[str, grpclib.const.Handler]:
- return {'/viam.robot.v1.RobotService/GetOperations': grpclib.const.Handler(self.GetOperations, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.GetOperationsRequest, robot.v1.robot_pb2.GetOperationsResponse), '/viam.robot.v1.RobotService/GetSessions': grpclib.const.Handler(self.GetSessions, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.GetSessionsRequest, robot.v1.robot_pb2.GetSessionsResponse), '/viam.robot.v1.RobotService/ResourceNames': grpclib.const.Handler(self.ResourceNames, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.ResourceNamesRequest, robot.v1.robot_pb2.ResourceNamesResponse), '/viam.robot.v1.RobotService/ResourceRPCSubtypes': grpclib.const.Handler(self.ResourceRPCSubtypes, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.ResourceRPCSubtypesRequest, robot.v1.robot_pb2.ResourceRPCSubtypesResponse), '/viam.robot.v1.RobotService/CancelOperation': grpclib.const.Handler(self.CancelOperation, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.CancelOperationRequest, robot.v1.robot_pb2.CancelOperationResponse), '/viam.robot.v1.RobotService/BlockForOperation': grpclib.const.Handler(self.BlockForOperation, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.BlockForOperationRequest, robot.v1.robot_pb2.BlockForOperationResponse), '/viam.robot.v1.RobotService/DiscoverComponents': grpclib.const.Handler(self.DiscoverComponents, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.DiscoverComponentsRequest, robot.v1.robot_pb2.DiscoverComponentsResponse), '/viam.robot.v1.RobotService/FrameSystemConfig': grpclib.const.Handler(self.FrameSystemConfig, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.FrameSystemConfigRequest, robot.v1.robot_pb2.FrameSystemConfigResponse), '/viam.robot.v1.RobotService/TransformPose': grpclib.const.Handler(self.TransformPose, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.TransformPoseRequest, robot.v1.robot_pb2.TransformPoseResponse), '/viam.robot.v1.RobotService/TransformPCD': grpclib.const.Handler(self.TransformPCD, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.TransformPCDRequest, robot.v1.robot_pb2.TransformPCDResponse), '/viam.robot.v1.RobotService/GetStatus': grpclib.const.Handler(self.GetStatus, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.GetStatusRequest, robot.v1.robot_pb2.GetStatusResponse), '/viam.robot.v1.RobotService/StreamStatus': grpclib.const.Handler(self.StreamStatus, grpclib.const.Cardinality.UNARY_STREAM, robot.v1.robot_pb2.StreamStatusRequest, robot.v1.robot_pb2.StreamStatusResponse), '/viam.robot.v1.RobotService/StopAll': grpclib.const.Handler(self.StopAll, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.StopAllRequest, robot.v1.robot_pb2.StopAllResponse), '/viam.robot.v1.RobotService/StartSession': grpclib.const.Handler(self.StartSession, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.StartSessionRequest, robot.v1.robot_pb2.StartSessionResponse), '/viam.robot.v1.RobotService/SendSessionHeartbeat': grpclib.const.Handler(self.SendSessionHeartbeat, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.SendSessionHeartbeatRequest, robot.v1.robot_pb2.SendSessionHeartbeatResponse), '/viam.robot.v1.RobotService/Log': grpclib.const.Handler(self.Log, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.LogRequest, robot.v1.robot_pb2.LogResponse), '/viam.robot.v1.RobotService/GetCloudMetadata': grpclib.const.Handler(self.GetCloudMetadata, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.GetCloudMetadataRequest, robot.v1.robot_pb2.GetCloudMetadataResponse), '/viam.robot.v1.RobotService/RestartModule': grpclib.const.Handler(self.RestartModule, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.RestartModuleRequest, robot.v1.robot_pb2.RestartModuleResponse), '/viam.robot.v1.RobotService/Shutdown': grpclib.const.Handler(self.Shutdown, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.ShutdownRequest, robot.v1.robot_pb2.ShutdownResponse)}
+ return {'/viam.robot.v1.RobotService/GetOperations': grpclib.const.Handler(self.GetOperations, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.GetOperationsRequest, robot.v1.robot_pb2.GetOperationsResponse), '/viam.robot.v1.RobotService/GetSessions': grpclib.const.Handler(self.GetSessions, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.GetSessionsRequest, robot.v1.robot_pb2.GetSessionsResponse), '/viam.robot.v1.RobotService/ResourceNames': grpclib.const.Handler(self.ResourceNames, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.ResourceNamesRequest, robot.v1.robot_pb2.ResourceNamesResponse), '/viam.robot.v1.RobotService/ResourceRPCSubtypes': grpclib.const.Handler(self.ResourceRPCSubtypes, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.ResourceRPCSubtypesRequest, robot.v1.robot_pb2.ResourceRPCSubtypesResponse), '/viam.robot.v1.RobotService/CancelOperation': grpclib.const.Handler(self.CancelOperation, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.CancelOperationRequest, robot.v1.robot_pb2.CancelOperationResponse), '/viam.robot.v1.RobotService/BlockForOperation': grpclib.const.Handler(self.BlockForOperation, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.BlockForOperationRequest, robot.v1.robot_pb2.BlockForOperationResponse), '/viam.robot.v1.RobotService/DiscoverComponents': grpclib.const.Handler(self.DiscoverComponents, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.DiscoverComponentsRequest, robot.v1.robot_pb2.DiscoverComponentsResponse), '/viam.robot.v1.RobotService/FrameSystemConfig': grpclib.const.Handler(self.FrameSystemConfig, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.FrameSystemConfigRequest, robot.v1.robot_pb2.FrameSystemConfigResponse), '/viam.robot.v1.RobotService/TransformPose': grpclib.const.Handler(self.TransformPose, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.TransformPoseRequest, robot.v1.robot_pb2.TransformPoseResponse), '/viam.robot.v1.RobotService/TransformPCD': grpclib.const.Handler(self.TransformPCD, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.TransformPCDRequest, robot.v1.robot_pb2.TransformPCDResponse), '/viam.robot.v1.RobotService/GetStatus': grpclib.const.Handler(self.GetStatus, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.GetStatusRequest, robot.v1.robot_pb2.GetStatusResponse), '/viam.robot.v1.RobotService/StreamStatus': grpclib.const.Handler(self.StreamStatus, grpclib.const.Cardinality.UNARY_STREAM, robot.v1.robot_pb2.StreamStatusRequest, robot.v1.robot_pb2.StreamStatusResponse), '/viam.robot.v1.RobotService/StopAll': grpclib.const.Handler(self.StopAll, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.StopAllRequest, robot.v1.robot_pb2.StopAllResponse), '/viam.robot.v1.RobotService/StartSession': grpclib.const.Handler(self.StartSession, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.StartSessionRequest, robot.v1.robot_pb2.StartSessionResponse), '/viam.robot.v1.RobotService/SendSessionHeartbeat': grpclib.const.Handler(self.SendSessionHeartbeat, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.SendSessionHeartbeatRequest, robot.v1.robot_pb2.SendSessionHeartbeatResponse), '/viam.robot.v1.RobotService/Log': grpclib.const.Handler(self.Log, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.LogRequest, robot.v1.robot_pb2.LogResponse), '/viam.robot.v1.RobotService/GetCloudMetadata': grpclib.const.Handler(self.GetCloudMetadata, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.GetCloudMetadataRequest, robot.v1.robot_pb2.GetCloudMetadataResponse), '/viam.robot.v1.RobotService/RestartModule': grpclib.const.Handler(self.RestartModule, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.RestartModuleRequest, robot.v1.robot_pb2.RestartModuleResponse), '/viam.robot.v1.RobotService/Shutdown': grpclib.const.Handler(self.Shutdown, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.ShutdownRequest, robot.v1.robot_pb2.ShutdownResponse), '/viam.robot.v1.RobotService/GetMachineStatus': grpclib.const.Handler(self.GetMachineStatus, grpclib.const.Cardinality.UNARY_UNARY, robot.v1.robot_pb2.GetMachineStatusRequest, robot.v1.robot_pb2.GetMachineStatusResponse)}
class UnimplementedRobotServiceBase(RobotServiceBase):
@@ -152,6 +156,9 @@ async def RestartModule(self, stream: 'grpclib.server.Stream[robot.v1.robot_pb2.
async def Shutdown(self, stream: 'grpclib.server.Stream[robot.v1.robot_pb2.ShutdownRequest, robot.v1.robot_pb2.ShutdownResponse]') -> None:
raise grpclib.exceptions.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
+ async def GetMachineStatus(self, stream: 'grpclib.server.Stream[robot.v1.robot_pb2.GetMachineStatusRequest, robot.v1.robot_pb2.GetMachineStatusResponse]') -> None:
+ raise grpclib.exceptions.GRPCError(grpclib.const.Status.UNIMPLEMENTED)
+
class RobotServiceStub:
def __init__(self, channel: grpclib.client.Channel) -> None:
@@ -173,4 +180,5 @@ def __init__(self, channel: grpclib.client.Channel) -> None:
self.Log = grpclib.client.UnaryUnaryMethod(channel, '/viam.robot.v1.RobotService/Log', robot.v1.robot_pb2.LogRequest, robot.v1.robot_pb2.LogResponse)
self.GetCloudMetadata = grpclib.client.UnaryUnaryMethod(channel, '/viam.robot.v1.RobotService/GetCloudMetadata', robot.v1.robot_pb2.GetCloudMetadataRequest, robot.v1.robot_pb2.GetCloudMetadataResponse)
self.RestartModule = grpclib.client.UnaryUnaryMethod(channel, '/viam.robot.v1.RobotService/RestartModule', robot.v1.robot_pb2.RestartModuleRequest, robot.v1.robot_pb2.RestartModuleResponse)
- self.Shutdown = grpclib.client.UnaryUnaryMethod(channel, '/viam.robot.v1.RobotService/Shutdown', robot.v1.robot_pb2.ShutdownRequest, robot.v1.robot_pb2.ShutdownResponse)
\ No newline at end of file
+ self.Shutdown = grpclib.client.UnaryUnaryMethod(channel, '/viam.robot.v1.RobotService/Shutdown', robot.v1.robot_pb2.ShutdownRequest, robot.v1.robot_pb2.ShutdownResponse)
+ self.GetMachineStatus = grpclib.client.UnaryUnaryMethod(channel, '/viam.robot.v1.RobotService/GetMachineStatus', robot.v1.robot_pb2.GetMachineStatusRequest, robot.v1.robot_pb2.GetMachineStatusResponse)
\ No newline at end of file
diff --git a/src/viam/gen/robot/v1/robot_pb2.py b/src/viam/gen/robot/v1/robot_pb2.py
index baf897ea2..9c851cf39 100644
--- a/src/viam/gen/robot/v1/robot_pb2.py
+++ b/src/viam/gen/robot/v1/robot_pb2.py
@@ -9,7 +9,7 @@
from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2
from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14robot/v1/robot.proto\x12\rviam.robot.v1\x1a\x16common/v1/common.proto\x1a\x1cgoogle/api/annotations.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto"}\n\x11FrameSystemConfig\x12/\n\x05frame\x18\x01 \x01(\x0b2\x19.viam.common.v1.TransformR\x05frame\x127\n\nkinematics\x18\x02 \x01(\x0b2\x17.google.protobuf.StructR\nkinematics"n\n\x18FrameSystemConfigRequest\x12R\n\x17supplemental_transforms\x18\x01 \x03(\x0b2\x19.viam.common.v1.TransformR\x16supplementalTransforms"o\n\x19FrameSystemConfigResponse\x12R\n\x14frame_system_configs\x18\x01 \x03(\x0b2 .viam.robot.v1.FrameSystemConfigR\x12frameSystemConfigs"\xc1\x01\n\x14TransformPoseRequest\x123\n\x06source\x18\x01 \x01(\x0b2\x1b.viam.common.v1.PoseInFrameR\x06source\x12 \n\x0bdestination\x18\x02 \x01(\tR\x0bdestination\x12R\n\x17supplemental_transforms\x18\x03 \x03(\x0b2\x19.viam.common.v1.TransformR\x16supplementalTransforms"H\n\x15TransformPoseResponse\x12/\n\x04pose\x18\x01 \x01(\x0b2\x1b.viam.common.v1.PoseInFrameR\x04pose"w\n\x13TransformPCDRequest\x12&\n\x0fpoint_cloud_pcd\x18\x01 \x01(\x0cR\rpointCloudPcd\x12\x16\n\x06source\x18\x02 \x01(\tR\x06source\x12 \n\x0bdestination\x18\x03 \x01(\tR\x0bdestination">\n\x14TransformPCDResponse\x12&\n\x0fpoint_cloud_pcd\x18\x01 \x01(\x0cR\rpointCloudPcd"\x16\n\x14ResourceNamesRequest"S\n\x15ResourceNamesResponse\x12:\n\tresources\x18\x01 \x03(\x0b2\x1c.viam.common.v1.ResourceNameR\tresources"q\n\x12ResourceRPCSubtype\x126\n\x07subtype\x18\x01 \x01(\x0b2\x1c.viam.common.v1.ResourceNameR\x07subtype\x12#\n\rproto_service\x18\x02 \x01(\tR\x0cprotoService"\x1c\n\x1aResourceRPCSubtypesRequest"t\n\x1bResourceRPCSubtypesResponse\x12U\n\x15resource_rpc_subtypes\x18\x01 \x03(\x0b2!.viam.robot.v1.ResourceRPCSubtypeR\x13resourceRpcSubtypes"\xd3\x01\n\tOperation\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x16\n\x06method\x18\x02 \x01(\tR\x06method\x125\n\targuments\x18\x03 \x01(\x0b2\x17.google.protobuf.StructR\targuments\x124\n\x07started\x18\x04 \x01(\x0b2\x1a.google.protobuf.TimestampR\x07started\x12"\n\nsession_id\x18\x05 \x01(\tH\x00R\tsessionId\x88\x01\x01B\r\n\x0b_session_id"\x16\n\x14GetOperationsRequest"Q\n\x15GetOperationsResponse\x128\n\noperations\x18\x01 \x03(\x0b2\x18.viam.robot.v1.OperationR\noperations"(\n\x16CancelOperationRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"\x19\n\x17CancelOperationResponse"*\n\x18BlockForOperationRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"\x1b\n\x19BlockForOperationResponse"\xc6\x01\n\x12PeerConnectionInfo\x125\n\x04type\x18\x01 \x01(\x0e2!.viam.robot.v1.PeerConnectionTypeR\x04type\x12*\n\x0eremote_address\x18\x02 \x01(\tH\x00R\rremoteAddress\x88\x01\x01\x12(\n\rlocal_address\x18\x03 \x01(\tH\x01R\x0clocalAddress\x88\x01\x01B\x11\n\x0f_remote_addressB\x10\n\x0e_local_address"\x8c\x01\n\x07Session\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12X\n\x14peer_connection_info\x18\x02 \x01(\x0b2!.viam.robot.v1.PeerConnectionInfoH\x00R\x12peerConnectionInfo\x88\x01\x01B\x17\n\x15_peer_connection_info"\x14\n\x12GetSessionsRequest"I\n\x13GetSessionsResponse\x122\n\x08sessions\x18\x01 \x03(\x0b2\x16.viam.robot.v1.SessionR\x08sessions"@\n\x0eDiscoveryQuery\x12\x18\n\x07subtype\x18\x01 \x01(\tR\x07subtype\x12\x14\n\x05model\x18\x02 \x01(\tR\x05model"s\n\tDiscovery\x123\n\x05query\x18\x01 \x01(\x0b2\x1d.viam.robot.v1.DiscoveryQueryR\x05query\x121\n\x07results\x18\x02 \x01(\x0b2\x17.google.protobuf.StructR\x07results"T\n\x19DiscoverComponentsRequest\x127\n\x07queries\x18\x01 \x03(\x0b2\x1d.viam.robot.v1.DiscoveryQueryR\x07queries"T\n\x1aDiscoverComponentsResponse\x126\n\tdiscovery\x18\x01 \x03(\x0b2\x18.viam.robot.v1.DiscoveryR\tdiscovery"\xb4\x01\n\x06Status\x120\n\x04name\x18\x01 \x01(\x0b2\x1c.viam.common.v1.ResourceNameR\x04name\x12/\n\x06status\x18\x02 \x01(\x0b2\x17.google.protobuf.StructR\x06status\x12G\n\x11last_reconfigured\x18\x03 \x01(\x0b2\x1a.google.protobuf.TimestampR\x10lastReconfigured"W\n\x10GetStatusRequest\x12C\n\x0eresource_names\x18\x01 \x03(\x0b2\x1c.viam.common.v1.ResourceNameR\rresourceNames"B\n\x11GetStatusResponse\x12-\n\x06status\x18\x01 \x03(\x0b2\x15.viam.robot.v1.StatusR\x06status"\x8b\x01\n\x13StreamStatusRequest\x12C\n\x0eresource_names\x18\x01 \x03(\x0b2\x1c.viam.common.v1.ResourceNameR\rresourceNames\x12/\n\x05every\x18\x02 \x01(\x0b2\x19.google.protobuf.DurationR\x05every"E\n\x14StreamStatusResponse\x12-\n\x06status\x18\x01 \x03(\x0b2\x15.viam.robot.v1.StatusR\x06status"x\n\x13StopExtraParameters\x120\n\x04name\x18\x01 \x01(\x0b2\x1c.viam.common.v1.ResourceNameR\x04name\x12/\n\x06params\x18\x02 \x01(\x0b2\x17.google.protobuf.StructR\x06params"J\n\x0eStopAllRequest\x128\n\x05extra\x18c \x03(\x0b2".viam.robot.v1.StopExtraParametersR\x05extra"\x11\n\x0fStopAllResponse"-\n\x13StartSessionRequest\x12\x16\n\x06resume\x18\x01 \x01(\tR\x06resume"l\n\x14StartSessionResponse\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12D\n\x10heartbeat_window\x18\x02 \x01(\x0b2\x19.google.protobuf.DurationR\x0fheartbeatWindow"-\n\x1bSendSessionHeartbeatRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"\x1e\n\x1cSendSessionHeartbeatResponse":\n\nLogRequest\x12,\n\x04logs\x18\x01 \x03(\x0b2\x18.viam.common.v1.LogEntryR\x04logs"\r\n\x0bLogResponse"\x19\n\x17GetCloudMetadataRequest"\xd0\x01\n\x18GetCloudMetadataResponse\x12&\n\rrobot_part_id\x18\x01 \x01(\tB\x02\x18\x01R\x0brobotPartId\x12$\n\x0eprimary_org_id\x18\x02 \x01(\tR\x0cprimaryOrgId\x12\x1f\n\x0blocation_id\x18\x03 \x01(\tR\nlocationId\x12\x1d\n\nmachine_id\x18\x04 \x01(\tR\tmachineId\x12&\n\x0fmachine_part_id\x18\x05 \x01(\tR\rmachinePartId"f\n\x14RestartModuleRequest\x12\x1d\n\tmodule_id\x18\x01 \x01(\tH\x00R\x08moduleId\x12!\n\x0bmodule_name\x18\x02 \x01(\tH\x00R\nmoduleNameB\x0c\n\nid_or_name"\x17\n\x15RestartModuleResponse"\x11\n\x0fShutdownRequest"\x12\n\x10ShutdownResponse*z\n\x12PeerConnectionType\x12$\n PEER_CONNECTION_TYPE_UNSPECIFIED\x10\x00\x12\x1d\n\x19PEER_CONNECTION_TYPE_GRPC\x10\x01\x12\x1f\n\x1bPEER_CONNECTION_TYPE_WEBRTC\x10\x022\xcf\x13\n\x0cRobotService\x12\x80\x01\n\rGetOperations\x12#.viam.robot.v1.GetOperationsRequest\x1a$.viam.robot.v1.GetOperationsResponse"$\x82\xd3\xe4\x93\x02\x1e\x12\x1c/viam/api/v1/operations/list\x12x\n\x0bGetSessions\x12!.viam.robot.v1.GetSessionsRequest\x1a".viam.robot.v1.GetSessionsResponse""\x82\xd3\xe4\x93\x02\x1c\x12\x1a/viam/api/v1/sessions/list\x12\x7f\n\rResourceNames\x12#.viam.robot.v1.ResourceNamesRequest\x1a$.viam.robot.v1.ResourceNamesResponse"#\x82\xd3\xe4\x93\x02\x1d\x12\x1b/viam/api/v1/resources/list\x12\x9d\x01\n\x13ResourceRPCSubtypes\x12).viam.robot.v1.ResourceRPCSubtypesRequest\x1a*.viam.robot.v1.ResourceRPCSubtypesResponse"/\x82\xd3\xe4\x93\x02)\x12\'/viam/api/v1/resource_rpc_subtypes/list\x12\x88\x01\n\x0fCancelOperation\x12%.viam.robot.v1.CancelOperationRequest\x1a&.viam.robot.v1.CancelOperationResponse"&\x82\xd3\xe4\x93\x02 "\x1e/viam/api/v1/operations/cancel\x12\x8d\x01\n\x11BlockForOperation\x12\'.viam.robot.v1.BlockForOperationRequest\x1a(.viam.robot.v1.BlockForOperationResponse"%\x82\xd3\xe4\x93\x02\x1f"\x1d/viam/api/v1/operations/block\x12\x94\x01\n\x12DiscoverComponents\x12(.viam.robot.v1.DiscoverComponentsRequest\x1a).viam.robot.v1.DiscoverComponentsResponse")\x82\xd3\xe4\x93\x02#\x12!/viam/api/v1/discovery/components\x12\x90\x01\n\x11FrameSystemConfig\x12\'.viam.robot.v1.FrameSystemConfigRequest\x1a(.viam.robot.v1.FrameSystemConfigResponse"(\x82\xd3\xe4\x93\x02"\x12 /viam/api/v1/frame_system/config\x12\x8c\x01\n\rTransformPose\x12#.viam.robot.v1.TransformPoseRequest\x1a$.viam.robot.v1.TransformPoseResponse"0\x82\xd3\xe4\x93\x02*\x12(/viam/api/v1/frame_system/transform_pose\x12\x88\x01\n\x0cTransformPCD\x12".viam.robot.v1.TransformPCDRequest\x1a#.viam.robot.v1.TransformPCDResponse"/\x82\xd3\xe4\x93\x02)\x12\'/viam/api/v1/frame_system/transform_pcd\x12n\n\tGetStatus\x12\x1f.viam.robot.v1.GetStatusRequest\x1a .viam.robot.v1.GetStatusResponse"\x1e\x88\x02\x01\x82\xd3\xe4\x93\x02\x15\x12\x13/viam/api/v1/status\x12\x80\x01\n\x0cStreamStatus\x12".viam.robot.v1.StreamStatusRequest\x1a#.viam.robot.v1.StreamStatusResponse"%\x88\x02\x01\x82\xd3\xe4\x93\x02\x1c\x12\x1a/viam/api/v1/status/stream0\x01\x12g\n\x07StopAll\x12\x1d.viam.robot.v1.StopAllRequest\x1a\x1e.viam.robot.v1.StopAllResponse"\x1d\x82\xd3\xe4\x93\x02\x17\x12\x15/viam/api/v1/stop_all\x12v\n\x0cStartSession\x12".viam.robot.v1.StartSessionRequest\x1a#.viam.robot.v1.StartSessionResponse"\x1d\x82\xd3\xe4\x93\x02\x17"\x15/viam/api/v1/sessions\x12\x9d\x01\n\x14SendSessionHeartbeat\x12*.viam.robot.v1.SendSessionHeartbeatRequest\x1a+.viam.robot.v1.SendSessionHeartbeatResponse",\x82\xd3\xe4\x93\x02&"$/viam/api/v1/sessions/{id}/heartbeat\x12V\n\x03Log\x12\x19.viam.robot.v1.LogRequest\x1a\x1a.viam.robot.v1.LogResponse"\x18\x82\xd3\xe4\x93\x02\x12"\x10/viam/api/v1/log\x12\x88\x01\n\x10GetCloudMetadata\x12&.viam.robot.v1.GetCloudMetadataRequest\x1a\'.viam.robot.v1.GetCloudMetadataResponse"#\x82\xd3\xe4\x93\x02\x1d\x12\x1b/viam/api/v1/cloud_metadata\x12\x7f\n\rRestartModule\x12#.viam.robot.v1.RestartModuleRequest\x1a$.viam.robot.v1.RestartModuleResponse"#\x82\xd3\xe4\x93\x02\x1d"\x1b/viam/api/v1/restart_module\x12j\n\x08Shutdown\x12\x1e.viam.robot.v1.ShutdownRequest\x1a\x1f.viam.robot.v1.ShutdownResponse"\x1d\x82\xd3\xe4\x93\x02\x17"\x15/viam/api/v1/shutdownB-\n\x11com.viam.robot.v1Z\x18go.viam.com/api/robot/v1b\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x14robot/v1/robot.proto\x12\rviam.robot.v1\x1a\x16common/v1/common.proto\x1a\x1cgoogle/api/annotations.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto"}\n\x11FrameSystemConfig\x12/\n\x05frame\x18\x01 \x01(\x0b2\x19.viam.common.v1.TransformR\x05frame\x127\n\nkinematics\x18\x02 \x01(\x0b2\x17.google.protobuf.StructR\nkinematics"n\n\x18FrameSystemConfigRequest\x12R\n\x17supplemental_transforms\x18\x01 \x03(\x0b2\x19.viam.common.v1.TransformR\x16supplementalTransforms"o\n\x19FrameSystemConfigResponse\x12R\n\x14frame_system_configs\x18\x01 \x03(\x0b2 .viam.robot.v1.FrameSystemConfigR\x12frameSystemConfigs"\xc1\x01\n\x14TransformPoseRequest\x123\n\x06source\x18\x01 \x01(\x0b2\x1b.viam.common.v1.PoseInFrameR\x06source\x12 \n\x0bdestination\x18\x02 \x01(\tR\x0bdestination\x12R\n\x17supplemental_transforms\x18\x03 \x03(\x0b2\x19.viam.common.v1.TransformR\x16supplementalTransforms"H\n\x15TransformPoseResponse\x12/\n\x04pose\x18\x01 \x01(\x0b2\x1b.viam.common.v1.PoseInFrameR\x04pose"w\n\x13TransformPCDRequest\x12&\n\x0fpoint_cloud_pcd\x18\x01 \x01(\x0cR\rpointCloudPcd\x12\x16\n\x06source\x18\x02 \x01(\tR\x06source\x12 \n\x0bdestination\x18\x03 \x01(\tR\x0bdestination">\n\x14TransformPCDResponse\x12&\n\x0fpoint_cloud_pcd\x18\x01 \x01(\x0cR\rpointCloudPcd"\x16\n\x14ResourceNamesRequest"S\n\x15ResourceNamesResponse\x12:\n\tresources\x18\x01 \x03(\x0b2\x1c.viam.common.v1.ResourceNameR\tresources"q\n\x12ResourceRPCSubtype\x126\n\x07subtype\x18\x01 \x01(\x0b2\x1c.viam.common.v1.ResourceNameR\x07subtype\x12#\n\rproto_service\x18\x02 \x01(\tR\x0cprotoService"\x1c\n\x1aResourceRPCSubtypesRequest"t\n\x1bResourceRPCSubtypesResponse\x12U\n\x15resource_rpc_subtypes\x18\x01 \x03(\x0b2!.viam.robot.v1.ResourceRPCSubtypeR\x13resourceRpcSubtypes"\xd3\x01\n\tOperation\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x16\n\x06method\x18\x02 \x01(\tR\x06method\x125\n\targuments\x18\x03 \x01(\x0b2\x17.google.protobuf.StructR\targuments\x124\n\x07started\x18\x04 \x01(\x0b2\x1a.google.protobuf.TimestampR\x07started\x12"\n\nsession_id\x18\x05 \x01(\tH\x00R\tsessionId\x88\x01\x01B\r\n\x0b_session_id"\x16\n\x14GetOperationsRequest"Q\n\x15GetOperationsResponse\x128\n\noperations\x18\x01 \x03(\x0b2\x18.viam.robot.v1.OperationR\noperations"(\n\x16CancelOperationRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"\x19\n\x17CancelOperationResponse"*\n\x18BlockForOperationRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"\x1b\n\x19BlockForOperationResponse"\xc6\x01\n\x12PeerConnectionInfo\x125\n\x04type\x18\x01 \x01(\x0e2!.viam.robot.v1.PeerConnectionTypeR\x04type\x12*\n\x0eremote_address\x18\x02 \x01(\tH\x00R\rremoteAddress\x88\x01\x01\x12(\n\rlocal_address\x18\x03 \x01(\tH\x01R\x0clocalAddress\x88\x01\x01B\x11\n\x0f_remote_addressB\x10\n\x0e_local_address"\x8c\x01\n\x07Session\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12X\n\x14peer_connection_info\x18\x02 \x01(\x0b2!.viam.robot.v1.PeerConnectionInfoH\x00R\x12peerConnectionInfo\x88\x01\x01B\x17\n\x15_peer_connection_info"\x14\n\x12GetSessionsRequest"I\n\x13GetSessionsResponse\x122\n\x08sessions\x18\x01 \x03(\x0b2\x16.viam.robot.v1.SessionR\x08sessions"@\n\x0eDiscoveryQuery\x12\x18\n\x07subtype\x18\x01 \x01(\tR\x07subtype\x12\x14\n\x05model\x18\x02 \x01(\tR\x05model"s\n\tDiscovery\x123\n\x05query\x18\x01 \x01(\x0b2\x1d.viam.robot.v1.DiscoveryQueryR\x05query\x121\n\x07results\x18\x02 \x01(\x0b2\x17.google.protobuf.StructR\x07results"T\n\x19DiscoverComponentsRequest\x127\n\x07queries\x18\x01 \x03(\x0b2\x1d.viam.robot.v1.DiscoveryQueryR\x07queries"T\n\x1aDiscoverComponentsResponse\x126\n\tdiscovery\x18\x01 \x03(\x0b2\x18.viam.robot.v1.DiscoveryR\tdiscovery"\xb4\x01\n\x06Status\x120\n\x04name\x18\x01 \x01(\x0b2\x1c.viam.common.v1.ResourceNameR\x04name\x12/\n\x06status\x18\x02 \x01(\x0b2\x17.google.protobuf.StructR\x06status\x12G\n\x11last_reconfigured\x18\x03 \x01(\x0b2\x1a.google.protobuf.TimestampR\x10lastReconfigured"W\n\x10GetStatusRequest\x12C\n\x0eresource_names\x18\x01 \x03(\x0b2\x1c.viam.common.v1.ResourceNameR\rresourceNames"B\n\x11GetStatusResponse\x12-\n\x06status\x18\x01 \x03(\x0b2\x15.viam.robot.v1.StatusR\x06status"\x8b\x01\n\x13StreamStatusRequest\x12C\n\x0eresource_names\x18\x01 \x03(\x0b2\x1c.viam.common.v1.ResourceNameR\rresourceNames\x12/\n\x05every\x18\x02 \x01(\x0b2\x19.google.protobuf.DurationR\x05every"E\n\x14StreamStatusResponse\x12-\n\x06status\x18\x01 \x03(\x0b2\x15.viam.robot.v1.StatusR\x06status"x\n\x13StopExtraParameters\x120\n\x04name\x18\x01 \x01(\x0b2\x1c.viam.common.v1.ResourceNameR\x04name\x12/\n\x06params\x18\x02 \x01(\x0b2\x17.google.protobuf.StructR\x06params"J\n\x0eStopAllRequest\x128\n\x05extra\x18c \x03(\x0b2".viam.robot.v1.StopExtraParametersR\x05extra"\x11\n\x0fStopAllResponse"-\n\x13StartSessionRequest\x12\x16\n\x06resume\x18\x01 \x01(\tR\x06resume"l\n\x14StartSessionResponse\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12D\n\x10heartbeat_window\x18\x02 \x01(\x0b2\x19.google.protobuf.DurationR\x0fheartbeatWindow"-\n\x1bSendSessionHeartbeatRequest\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id"\x1e\n\x1cSendSessionHeartbeatResponse":\n\nLogRequest\x12,\n\x04logs\x18\x01 \x03(\x0b2\x18.viam.common.v1.LogEntryR\x04logs"\r\n\x0bLogResponse"\x19\n\x17GetCloudMetadataRequest"\xd0\x01\n\x18GetCloudMetadataResponse\x12&\n\rrobot_part_id\x18\x01 \x01(\tB\x02\x18\x01R\x0brobotPartId\x12$\n\x0eprimary_org_id\x18\x02 \x01(\tR\x0cprimaryOrgId\x12\x1f\n\x0blocation_id\x18\x03 \x01(\tR\nlocationId\x12\x1d\n\nmachine_id\x18\x04 \x01(\tR\tmachineId\x12&\n\x0fmachine_part_id\x18\x05 \x01(\tR\rmachinePartId"f\n\x14RestartModuleRequest\x12\x1d\n\tmodule_id\x18\x01 \x01(\tH\x00R\x08moduleId\x12!\n\x0bmodule_name\x18\x02 \x01(\tH\x00R\nmoduleNameB\x0c\n\nid_or_name"\x17\n\x15RestartModuleResponse"\x11\n\x0fShutdownRequest"\x12\n\x10ShutdownResponse"\x19\n\x17GetMachineStatusRequest"W\n\x18GetMachineStatusResponse\x12;\n\tresources\x18\x01 \x03(\x0b2\x1d.viam.robot.v1.ResourceStatusR\tresources"\xb0\x02\n\x0eResourceStatus\x120\n\x04name\x18\x01 \x01(\x0b2\x1c.viam.common.v1.ResourceNameR\x04name\x129\n\x05state\x18\x02 \x01(\x0e2#.viam.robot.v1.ResourceStatus.StateR\x05state\x12=\n\x0clast_updated\x18\x03 \x01(\x0b2\x1a.google.protobuf.TimestampR\x0blastUpdated"r\n\x05State\x12\x15\n\x11STATE_UNSPECIFIED\x10\x00\x12\x16\n\x12STATE_UNCONFIGURED\x10\x01\x12\x15\n\x11STATE_CONFIGURING\x10\x02\x12\x0f\n\x0bSTATE_READY\x10\x03\x12\x12\n\x0eSTATE_REMOVING\x10\x04*z\n\x12PeerConnectionType\x12$\n PEER_CONNECTION_TYPE_UNSPECIFIED\x10\x00\x12\x1d\n\x19PEER_CONNECTION_TYPE_GRPC\x10\x01\x12\x1f\n\x1bPEER_CONNECTION_TYPE_WEBRTC\x10\x022\xda\x14\n\x0cRobotService\x12\x80\x01\n\rGetOperations\x12#.viam.robot.v1.GetOperationsRequest\x1a$.viam.robot.v1.GetOperationsResponse"$\x82\xd3\xe4\x93\x02\x1e\x12\x1c/viam/api/v1/operations/list\x12x\n\x0bGetSessions\x12!.viam.robot.v1.GetSessionsRequest\x1a".viam.robot.v1.GetSessionsResponse""\x82\xd3\xe4\x93\x02\x1c\x12\x1a/viam/api/v1/sessions/list\x12\x7f\n\rResourceNames\x12#.viam.robot.v1.ResourceNamesRequest\x1a$.viam.robot.v1.ResourceNamesResponse"#\x82\xd3\xe4\x93\x02\x1d\x12\x1b/viam/api/v1/resources/list\x12\x9d\x01\n\x13ResourceRPCSubtypes\x12).viam.robot.v1.ResourceRPCSubtypesRequest\x1a*.viam.robot.v1.ResourceRPCSubtypesResponse"/\x82\xd3\xe4\x93\x02)\x12\'/viam/api/v1/resource_rpc_subtypes/list\x12\x88\x01\n\x0fCancelOperation\x12%.viam.robot.v1.CancelOperationRequest\x1a&.viam.robot.v1.CancelOperationResponse"&\x82\xd3\xe4\x93\x02 "\x1e/viam/api/v1/operations/cancel\x12\x8d\x01\n\x11BlockForOperation\x12\'.viam.robot.v1.BlockForOperationRequest\x1a(.viam.robot.v1.BlockForOperationResponse"%\x82\xd3\xe4\x93\x02\x1f"\x1d/viam/api/v1/operations/block\x12\x94\x01\n\x12DiscoverComponents\x12(.viam.robot.v1.DiscoverComponentsRequest\x1a).viam.robot.v1.DiscoverComponentsResponse")\x82\xd3\xe4\x93\x02#\x12!/viam/api/v1/discovery/components\x12\x90\x01\n\x11FrameSystemConfig\x12\'.viam.robot.v1.FrameSystemConfigRequest\x1a(.viam.robot.v1.FrameSystemConfigResponse"(\x82\xd3\xe4\x93\x02"\x12 /viam/api/v1/frame_system/config\x12\x8c\x01\n\rTransformPose\x12#.viam.robot.v1.TransformPoseRequest\x1a$.viam.robot.v1.TransformPoseResponse"0\x82\xd3\xe4\x93\x02*\x12(/viam/api/v1/frame_system/transform_pose\x12\x88\x01\n\x0cTransformPCD\x12".viam.robot.v1.TransformPCDRequest\x1a#.viam.robot.v1.TransformPCDResponse"/\x82\xd3\xe4\x93\x02)\x12\'/viam/api/v1/frame_system/transform_pcd\x12n\n\tGetStatus\x12\x1f.viam.robot.v1.GetStatusRequest\x1a .viam.robot.v1.GetStatusResponse"\x1e\x88\x02\x01\x82\xd3\xe4\x93\x02\x15\x12\x13/viam/api/v1/status\x12\x80\x01\n\x0cStreamStatus\x12".viam.robot.v1.StreamStatusRequest\x1a#.viam.robot.v1.StreamStatusResponse"%\x88\x02\x01\x82\xd3\xe4\x93\x02\x1c\x12\x1a/viam/api/v1/status/stream0\x01\x12g\n\x07StopAll\x12\x1d.viam.robot.v1.StopAllRequest\x1a\x1e.viam.robot.v1.StopAllResponse"\x1d\x82\xd3\xe4\x93\x02\x17\x12\x15/viam/api/v1/stop_all\x12v\n\x0cStartSession\x12".viam.robot.v1.StartSessionRequest\x1a#.viam.robot.v1.StartSessionResponse"\x1d\x82\xd3\xe4\x93\x02\x17"\x15/viam/api/v1/sessions\x12\x9d\x01\n\x14SendSessionHeartbeat\x12*.viam.robot.v1.SendSessionHeartbeatRequest\x1a+.viam.robot.v1.SendSessionHeartbeatResponse",\x82\xd3\xe4\x93\x02&"$/viam/api/v1/sessions/{id}/heartbeat\x12V\n\x03Log\x12\x19.viam.robot.v1.LogRequest\x1a\x1a.viam.robot.v1.LogResponse"\x18\x82\xd3\xe4\x93\x02\x12"\x10/viam/api/v1/log\x12\x88\x01\n\x10GetCloudMetadata\x12&.viam.robot.v1.GetCloudMetadataRequest\x1a\'.viam.robot.v1.GetCloudMetadataResponse"#\x82\xd3\xe4\x93\x02\x1d\x12\x1b/viam/api/v1/cloud_metadata\x12\x7f\n\rRestartModule\x12#.viam.robot.v1.RestartModuleRequest\x1a$.viam.robot.v1.RestartModuleResponse"#\x82\xd3\xe4\x93\x02\x1d"\x1b/viam/api/v1/restart_module\x12j\n\x08Shutdown\x12\x1e.viam.robot.v1.ShutdownRequest\x1a\x1f.viam.robot.v1.ShutdownResponse"\x1d\x82\xd3\xe4\x93\x02\x17"\x15/viam/api/v1/shutdown\x12\x88\x01\n\x10GetMachineStatus\x12&.viam.robot.v1.GetMachineStatusRequest\x1a\'.viam.robot.v1.GetMachineStatusResponse"#\x82\xd3\xe4\x93\x02\x1d\x12\x1b/viam/api/v1/machine_statusB-\n\x11com.viam.robot.v1Z\x18go.viam.com/api/robot/v1b\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'robot.v1.robot_pb2', globals())
if _descriptor._USE_C_DESCRIPTORS == False:
@@ -55,8 +55,10 @@
_ROBOTSERVICE.methods_by_name['RestartModule']._serialized_options = b'\x82\xd3\xe4\x93\x02\x1d"\x1b/viam/api/v1/restart_module'
_ROBOTSERVICE.methods_by_name['Shutdown']._options = None
_ROBOTSERVICE.methods_by_name['Shutdown']._serialized_options = b'\x82\xd3\xe4\x93\x02\x17"\x15/viam/api/v1/shutdown'
- _PEERCONNECTIONTYPE._serialized_start = 4113
- _PEERCONNECTIONTYPE._serialized_end = 4235
+ _ROBOTSERVICE.methods_by_name['GetMachineStatus']._options = None
+ _ROBOTSERVICE.methods_by_name['GetMachineStatus']._serialized_options = b'\x82\xd3\xe4\x93\x02\x1d\x12\x1b/viam/api/v1/machine_status'
+ _PEERCONNECTIONTYPE._serialized_start = 4536
+ _PEERCONNECTIONTYPE._serialized_end = 4658
_FRAMESYSTEMCONFIG._serialized_start = 188
_FRAMESYSTEMCONFIG._serialized_end = 313
_FRAMESYSTEMCONFIGREQUEST._serialized_start = 315
@@ -151,5 +153,13 @@
_SHUTDOWNREQUEST._serialized_end = 4091
_SHUTDOWNRESPONSE._serialized_start = 4093
_SHUTDOWNRESPONSE._serialized_end = 4111
- _ROBOTSERVICE._serialized_start = 4238
- _ROBOTSERVICE._serialized_end = 6749
\ No newline at end of file
+ _GETMACHINESTATUSREQUEST._serialized_start = 4113
+ _GETMACHINESTATUSREQUEST._serialized_end = 4138
+ _GETMACHINESTATUSRESPONSE._serialized_start = 4140
+ _GETMACHINESTATUSRESPONSE._serialized_end = 4227
+ _RESOURCESTATUS._serialized_start = 4230
+ _RESOURCESTATUS._serialized_end = 4534
+ _RESOURCESTATUS_STATE._serialized_start = 4420
+ _RESOURCESTATUS_STATE._serialized_end = 4534
+ _ROBOTSERVICE._serialized_start = 4661
+ _ROBOTSERVICE._serialized_end = 7311
\ No newline at end of file
diff --git a/src/viam/gen/robot/v1/robot_pb2.pyi b/src/viam/gen/robot/v1/robot_pb2.pyi
index 7cc58a266..df3d8e994 100644
--- a/src/viam/gen/robot/v1/robot_pb2.pyi
+++ b/src/viam/gen/robot/v1/robot_pb2.pyi
@@ -798,4 +798,83 @@ class ShutdownResponse(google.protobuf.message.Message):
def __init__(self) -> None:
...
-global___ShutdownResponse = ShutdownResponse
\ No newline at end of file
+global___ShutdownResponse = ShutdownResponse
+
+@typing.final
+class GetMachineStatusRequest(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ def __init__(self) -> None:
+ ...
+global___GetMachineStatusRequest = GetMachineStatusRequest
+
+@typing.final
+class GetMachineStatusResponse(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+ RESOURCES_FIELD_NUMBER: builtins.int
+
+ @property
+ def resources(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___ResourceStatus]:
+ ...
+
+ def __init__(self, *, resources: collections.abc.Iterable[global___ResourceStatus] | None=...) -> None:
+ ...
+
+ def ClearField(self, field_name: typing.Literal['resources', b'resources']) -> None:
+ ...
+global___GetMachineStatusResponse = GetMachineStatusResponse
+
+@typing.final
+class ResourceStatus(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ class _State:
+ ValueType = typing.NewType('ValueType', builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _StateEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ResourceStatus._State.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ STATE_UNSPECIFIED: ResourceStatus._State.ValueType
+ STATE_UNCONFIGURED: ResourceStatus._State.ValueType
+ 'a newly created resource.'
+ STATE_CONFIGURING: ResourceStatus._State.ValueType
+ 'a resource that is being configured.'
+ STATE_READY: ResourceStatus._State.ValueType
+ 'a resource that has been successfully configured once and is not being\n re-configured or removed.\n '
+ STATE_REMOVING: ResourceStatus._State.ValueType
+ 'a resource that is being removed from the robot.'
+
+ class State(_State, metaclass=_StateEnumTypeWrapper):
+ ...
+ STATE_UNSPECIFIED: ResourceStatus.State.ValueType
+ STATE_UNCONFIGURED: ResourceStatus.State.ValueType
+ 'a newly created resource.'
+ STATE_CONFIGURING: ResourceStatus.State.ValueType
+ 'a resource that is being configured.'
+ STATE_READY: ResourceStatus.State.ValueType
+ 'a resource that has been successfully configured once and is not being\n re-configured or removed.\n '
+ STATE_REMOVING: ResourceStatus.State.ValueType
+ 'a resource that is being removed from the robot.'
+ NAME_FIELD_NUMBER: builtins.int
+ STATE_FIELD_NUMBER: builtins.int
+ LAST_UPDATED_FIELD_NUMBER: builtins.int
+ state: global___ResourceStatus.State.ValueType
+ 'current state.'
+
+ @property
+ def name(self) -> common.v1.common_pb2.ResourceName:
+ """resource name."""
+
+ @property
+ def last_updated(self) -> google.protobuf.timestamp_pb2.Timestamp:
+ """state transition timestamp."""
+
+ def __init__(self, *, name: common.v1.common_pb2.ResourceName | None=..., state: global___ResourceStatus.State.ValueType=..., last_updated: google.protobuf.timestamp_pb2.Timestamp | None=...) -> None:
+ ...
+
+ def HasField(self, field_name: typing.Literal['last_updated', b'last_updated', 'name', b'name']) -> builtins.bool:
+ ...
+
+ def ClearField(self, field_name: typing.Literal['last_updated', b'last_updated', 'name', b'name', 'state', b'state']) -> None:
+ ...
+global___ResourceStatus = ResourceStatus
\ No newline at end of file
diff --git a/src/viam/proto/app/__init__.py b/src/viam/proto/app/__init__.py
index 67d5012b8..c6f7227e1 100644
--- a/src/viam/proto/app/__init__.py
+++ b/src/viam/proto/app/__init__.py
@@ -60,7 +60,10 @@
DeleteRobotRequest,
DeleteRobotResponse,
Fragment,
+ FragmentHistoryEntry,
FragmentVisibility,
+ GetFragmentHistoryRequest,
+ GetFragmentHistoryResponse,
GetFragmentRequest,
GetFragmentResponse,
GetLocationRequest,
@@ -244,7 +247,10 @@
"DeleteRobotRequest",
"DeleteRobotResponse",
"Fragment",
+ "FragmentHistoryEntry",
"FragmentVisibility",
+ "GetFragmentHistoryRequest",
+ "GetFragmentHistoryResponse",
"GetFragmentRequest",
"GetFragmentResponse",
"GetLocationRequest",
diff --git a/src/viam/proto/app/robot.py b/src/viam/proto/app/robot.py
index cbe4edf60..03bcd1010 100644
--- a/src/viam/proto/app/robot.py
+++ b/src/viam/proto/app/robot.py
@@ -20,6 +20,7 @@
JWKSFile,
LocationSecret,
LogConfiguration,
+ LogPatternConfig,
LogRequest,
LogResponse,
ModuleConfig,
@@ -58,6 +59,7 @@
"JWKSFile",
"LocationSecret",
"LogConfiguration",
+ "LogPatternConfig",
"LogRequest",
"LogResponse",
"ModuleConfig",
diff --git a/src/viam/proto/robot/__init__.py b/src/viam/proto/robot/__init__.py
index a327cb8bf..270f44a3e 100644
--- a/src/viam/proto/robot/__init__.py
+++ b/src/viam/proto/robot/__init__.py
@@ -17,6 +17,8 @@
FrameSystemConfigResponse,
GetCloudMetadataRequest,
GetCloudMetadataResponse,
+ GetMachineStatusRequest,
+ GetMachineStatusResponse,
GetOperationsRequest,
GetOperationsResponse,
GetSessionsRequest,
@@ -33,6 +35,7 @@
ResourceRPCSubtype,
ResourceRPCSubtypesRequest,
ResourceRPCSubtypesResponse,
+ ResourceStatus,
RestartModuleRequest,
RestartModuleResponse,
SendSessionHeartbeatRequest,
@@ -71,6 +74,8 @@
"FrameSystemConfigResponse",
"GetCloudMetadataRequest",
"GetCloudMetadataResponse",
+ "GetMachineStatusRequest",
+ "GetMachineStatusResponse",
"GetOperationsRequest",
"GetOperationsResponse",
"GetSessionsRequest",
@@ -87,6 +92,7 @@
"ResourceRPCSubtype",
"ResourceRPCSubtypesRequest",
"ResourceRPCSubtypesResponse",
+ "ResourceStatus",
"RestartModuleRequest",
"RestartModuleResponse",
"SendSessionHeartbeatRequest",
diff --git a/src/viam/services/motion/__init__.py b/src/viam/services/motion/__init__.py
index 1412d0b3d..bbc1ef938 100644
--- a/src/viam/services/motion/__init__.py
+++ b/src/viam/services/motion/__init__.py
@@ -1,8 +1,17 @@
-from viam.proto.service.motion import MotionConfiguration
+from viam.proto.service.motion import Constraints, MotionConfiguration
+from viam.resource.registry import Registry, ResourceRegistration
from .client import MotionClient
+from .motion import Motion
+from .service import MotionRPCService
-__all__ = [
- "MotionClient",
- "MotionConfiguration",
-]
+__all__ = ["MotionClient", "MotionConfiguration", "Constraints"]
+
+
+Registry.register_subtype(
+ ResourceRegistration(
+ Motion,
+ MotionRPCService,
+ lambda name, channel: MotionClient(name, channel),
+ )
+)
diff --git a/src/viam/services/motion/client.py b/src/viam/services/motion/client.py
index 558ed012f..907aa0973 100644
--- a/src/viam/services/motion/client.py
+++ b/src/viam/services/motion/client.py
@@ -1,4 +1,4 @@
-from typing import Any, Final, Iterable, List, Mapping, Optional, Sequence
+from typing import Any, Mapping, Optional, Sequence
from grpclib.client import Channel
@@ -30,32 +30,27 @@
MoveOnMapResponse,
MoveRequest,
MoveResponse,
+ PlanStatusWithID,
StopPlanRequest,
StopPlanResponse,
)
from viam.resource.rpc_client_base import ReconfigurableResourceRPCClientBase
-from viam.resource.types import RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_SERVICE, Subtype
-from viam.services.service_client_base import ServiceClientBase
from viam.utils import ValueTypes, dict_to_struct, struct_to_dict
+from .motion import Motion
-class MotionClient(ServiceClientBase, ReconfigurableResourceRPCClientBase):
- """Motion is a Viam service that coordinates motion planning across all of the components in a given robot.
- The motion planning service calculates a valid path that avoids self collision by default. If additional constraints are supplied in the
- ``world_state`` message, the motion planning service will also account for those.
-
- For more information, see `Motion service `_.
+class MotionClient(Motion, ReconfigurableResourceRPCClientBase):
+ """
+ gRPC client for the Motion service.
"""
- SUBTYPE: Final = Subtype( # pyright: ignore [reportIncompatibleVariableOverride]
- RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_SERVICE, "motion"
- )
client: MotionServiceStub
def __init__(self, name: str, channel: Channel):
- super().__init__(name, channel)
+ self.channel = channel
self.client = MotionServiceStub(channel)
+ super().__init__(name)
async def move(
self,
@@ -67,47 +62,6 @@ async def move(
extra: Optional[Mapping[str, Any]] = None,
timeout: Optional[float] = None,
) -> bool:
- """Plan and execute a movement to move the component specified to its goal destination.
-
- Note: Frames designated with respect to components can also be used as the ``component_name`` when calling for a move. This
- technique allows for planning and moving the frame itself to the ``destination``. To do so, simply create a resource name with
- originating ReferenceFrame's name. Then pass in the resource name into ``component_name``. Ex::
-
- resource_name = Arm.get_resource_name("externalFrame")
- success = await MotionServiceClient.move(resource_name, ...)
-
- ::
-
- motion = MotionClient.from_robot(robot=robot, name="builtin")
-
- # Assumes a gripper configured with name "my_gripper" on the machine
- gripper_name = Gripper.get_resource_name("my_gripper")
- my_frame = "my_gripper_offset"
-
- goal_pose = Pose(x=0, y=0, z=300, o_x=0, o_y=0, o_z=1, theta=0)
-
- # Move the gripper
- moved = await motion.move(component_name=gripper_name,
- destination=PoseInFrame(reference_frame="myFrame",
- pose=goal_pose),
- world_state=worldState,
- constraints={},
- extra={})
-
- Args:
- component_name (viam.proto.common.ResourceName): Name of a component on a given robot.
- destination (viam.proto.common.PoseInFrame): The destination to move to, expressed as a ``Pose`` and the frame in which it was
- observed.
- world_state (viam.proto.common.WorldState): When supplied, the motion service will create a plan that obeys any constraints
- expressed in the WorldState message.
- constraints (viam.proto.service.motion.Constraints): When supplied, the motion service will create a plan that obeys any
- specified constraints.
-
- Returns:
- bool: Whether the move was successful.
-
- For more information, see `Motion service `_.
- """
if extra is None:
extra = {}
request = MoveRequest(
@@ -134,65 +88,6 @@ async def move_on_globe(
extra: Optional[Mapping[str, ValueTypes]] = None,
timeout: Optional[float] = None,
) -> str:
- """Move a component to a specific latitude and longitude, using a ``MovementSensor`` to check the location.
-
- ``move_on_globe()`` is non blocking, meaning the motion service will move the component to the destination
- GPS point after ``move_on_globe()`` returns.
-
- Each successful ``move_on_globe()`` call returns a unique ExecutionID which you can use to identify all plans
- generated during the ``move_on_globe()`` call.
-
- You can monitor the progress of the ``move_on_globe()`` call by querying ``get_plan()`` and ``list_plan_statuses()``.
-
- ::
-
- motion = MotionClient.from_robot(robot=robot, name="builtin")
-
- # Get the ResourceNames of the base and movement sensor
- my_base_resource_name = Base.get_resource_name("my_base")
- mvmnt_sensor_resource_name = MovementSensor.get_resource_name(
- "my_movement_sensor")
- # Define a destination GeoPoint at the GPS coordinates [0, 0]
- my_destination = movement_sensor.GeoPoint(latitude=0, longitude=0)
-
- # Move the base component to the designated geographic location, as reported by the movement sensor
- execution_id = await motion.move_on_globe(
- component_name=my_base_resource_name,
- destination=my_destination,
- movement_sensor_name=mvmnt_sensor_resource_name)
-
- Args:
- component_name (ResourceName): The ResourceName of the base to move.
- destination (GeoPoint): The location of the component’s destination, represented in geographic notation as a
- GeoPoint (lat, lng).
- movement_sensor_name (ResourceName): The ResourceName of the movement sensor that you want to use to check
- the machine’s location.
- obstacles (Optional[Sequence[GeoGeometry]]): Obstacles to consider when planning the motion of the component,
- with each represented as a GeoGeometry. Default: None
- heading (Optional[float]): The compass heading, in degrees, that the machine’s movement sensor should report
- at the destination point. Range: [0-360) 0: North, 90: East, 180: South, 270: West. Default: None
- configuration (Optional[MotionConfiguration]): The configuration you want to set across this machine for this
- motion service. This parameter and each of its fields are optional.
-
- - obstacle_detectors (Iterable[ObstacleDetector]): The names of each vision service and camera resource pair
- you want to use for transient obstacle avoidance.
-
- - position_polling_frequency_hz (float): The frequency in Hz to poll the position of the machine.
- - obstacle_polling_frequency_hz (float): The frequency in Hz to poll the vision service for new obstacles.
- - plan_deviation_m (float): The distance in meters that the machine can deviate from the motion plan.
- - linear_m_per_sec (float): Linear velocity this machine should target when moving.
- - angular_degs_per_sec (float): Angular velocity this machine should target when turning.
- bounding_regions (Optional[Sequence[GeoGeometry]]): Set of obstacles which the robot must remain within while navigating
- extra (Optional[Dict[str, Any]]): Extra options to pass to the underlying RPC call.
- timeout (Optional[float]): An option to set how long to wait (in seconds) before calling a time-out and closing
- the underlying RPC call.
-
-
- Returns:
- str: ExecutionID of the ``move_on_globe()`` call, which can be used to track execution progress.
-
- For more information, see `Motion service `_.
- """
if extra is None:
extra = {}
request = MoveOnGlobeRequest(
@@ -215,64 +110,11 @@ async def move_on_map(
destination: Pose,
slam_service_name: ResourceName,
configuration: Optional[MotionConfiguration] = None,
- obstacles: Optional[Iterable[Geometry]] = None,
+ obstacles: Optional[Sequence[Geometry]] = None,
*,
extra: Optional[Mapping[str, ValueTypes]] = None,
timeout: Optional[float] = None,
) -> str:
- """
- Move a component to a specific pose, using a ``SlamService`` for the SLAM map, using a ``SLAM Service`` to check the location.
-
- ``move_on_map()`` is non blocking, meaning the motion service will move the component to the destination
- Pose point after ``move_on_map()`` returns.
-
- Each successful ``move_on_map()`` call returns a unique ExecutionID which you can use to identify all plans
- generated during the ``move_on_map()`` call.
-
- You can monitor the progress of the ``move_on_map()`` call by querying ``get_plan()`` and ``list_plan_statuses()``.
-
- ::
-
- motion = MotionClient.from_robot(robot=robot, name="builtin")
-
- # Get the ResourceNames of the base component and SLAM service
- my_base_resource_name = Base.get_resource_name("my_base")
- my_slam_service_name = SLAMClient.get_resource_name("my_slam_service")
-
- # Define a destination pose with respect to the origin of the map from the SLAM service "my_slam_service"
- my_pose = Pose(y=10)
-
- # Move the base component to the destination pose of Y=10, a location of
- # (0, 10, 0) in respect to the origin of the map
- execution_id = await motion.move_on_map(component_name=my_base_resource_name,
- destination=my_pose,
- slam_service_name=my_slam_service_name)
-
- Args:
- component_name (ResourceName): The ResourceName of the base to move.
- destination (Pose): The destination, which can be any Pose with respect to the SLAM map’s origin.
- slam_service_name (ResourceName): The ResourceName of the SLAM service from which the SLAM map is requested.
- configuration (Optional[MotionConfiguration]): The configuration you want to set across this machine for this motion service.
- This parameter and each of its fields are optional.
-
- - obstacle_detectors (Iterable[ObstacleDetector]): The names of each vision service and camera resource pair you want to use
- for transient obstacle avoidance.
-
- - position_polling_frequency_hz (float): The frequency in hz to poll the position of the machine.
- - obstacle_polling_frequency_hz (float): The frequency in hz to poll the vision service for new obstacles.
- - plan_deviation_m (float): The distance in meters that the machine can deviate from the motion plan.
- - linear_m_per_sec (float): Linear velocity this machine should target when moving.
- - angular_degs_per_sec (float): Angular velocity this machine should target when turning.
- obstacles (Optional[Iterable[Geometry]]): Obstacles to be considered for motion planning.
- extra (Optional[Dict[str, Any]]): Extra options to pass to the underlying RPC call.
- timeout (Optional[float]): An option to set how long to wait (in seconds) before calling a time-out and closing the underlying
- RPC call.
-
- Returns:
- str: ExecutionID of the ``move_on_map()`` call, which can be used to track execution progress.
-
- For more information, see `Motion service `_.
- """
if extra is None:
extra = {}
request = MoveOnMapRequest(
@@ -294,21 +136,6 @@ async def stop_plan(
extra: Optional[Mapping[str, ValueTypes]] = None,
timeout: Optional[float] = None,
):
- """Stop a component being moved by an in progress ``move_on_globe()`` or ``move_on_map()`` call.
-
- ::
-
- # Assuming a `move_on_globe()` started the execution
- # Stop the base component which was instructed to move by `move_on_globe()`
- # or `move_on_map()`
- my_base_resource_name = Base.get_resource_name("my_base")
- await motion.stop_plan(component_name=mvmnt_sensor)
-
- Args:
- component_name (ResourceName): The component to stop
-
- For more information, see `Motion service `_.
- """
if extra is None:
extra = {}
@@ -329,40 +156,6 @@ async def get_plan(
extra: Optional[Mapping[str, ValueTypes]] = None,
timeout: Optional[float] = None,
) -> GetPlanResponse:
- """By default: returns the plan history of the most recent ``move_on_globe()`` or ``move_on_map()`` call to move a component.
-
- The plan history for executions before the most recent can be requested by providing an ExecutionID in the request.
-
- Returns a result if both of the following conditions are met:
-
- - the execution (call to ``move_on_globe()`` or ``move_on_map()``) is still executing **or** changed state within the last 24 hours
- - the robot has not reinitialized
-
- Plans never change.
-
- Replans always create new plans.
-
- Replans share the ExecutionID of the previously executing plan.
-
- All repeated fields are in time ascending order.
-
- ::
-
- motion = MotionClient.from_robot(robot=robot, name="builtin")
- my_base_resource_name = Base.get_resource_name("my_base")
- # Get the plan(s) of the base component which was instructed to move by `MoveOnGlobe()` or `MoveOnMap()`
- resp = await motion.get_plan(component_name=my_base_resource_name)
-
- Args:
- component_name (ResourceName): The component to stop
- last_plan_only (Optional[bool]): If supplied, the response will only return the last plan for the component / execution.
- execution_id (Optional[str]): If supplied, the response will only return plans with the provided execution_id.
-
- Returns:
- ``GetPlanResponse`` (GetPlanResponse): The current PlanWithStatus & replan history which matches the request
-
- For more information, see `Motion service `_.
- """
if extra is None:
extra = {}
@@ -382,30 +175,7 @@ async def list_plan_statuses(
*,
extra: Optional[Mapping[str, ValueTypes]] = None,
timeout: Optional[float] = None,
- ) -> ListPlanStatusesResponse:
- """Returns the statuses of plans created by `move_on_globe()` or ``move_on_map()`` calls that meet at least one of the following
- conditions since the motion service initialized:
-
- - the plan's status is in progress
- - the plan's status changed state within the last 24 hours
-
- All repeated fields are in chronological order.
-
- ::
-
- motion = MotionClient.from_robot(robot=robot, name="builtin")
- # List the plan statuses of the motion service within the TTL
- resp = await motion.list_plan_statuses()
-
- Args:
- only_active_plans (Optional[bool]): If supplied, the response will filter out any plans that are not executing.
-
- Returns:
- ``ListPlanStatusesResponse`` (ListPlanStatusesResponse): List of last known statuses with the
- associated IDs of all plans within the TTL ordered by timestamp in ascending order.
-
- For more information, see `Motion service `_.
- """
+ ) -> Sequence[PlanStatusWithID]:
if extra is None:
extra = {}
@@ -415,50 +185,17 @@ async def list_plan_statuses(
extra=dict_to_struct(extra),
)
response: ListPlanStatusesResponse = await self.client.ListPlanStatuses(request, timeout=timeout)
- return response
+ return response.plan_statuses_with_ids
async def get_pose(
self,
component_name: ResourceName,
destination_frame: str,
- supplemental_transforms: Optional[List[Transform]] = None,
+ supplemental_transforms: Optional[Sequence[Transform]] = None,
*,
extra: Optional[Mapping[str, Any]] = None,
timeout: Optional[float] = None,
) -> PoseInFrame:
- """
- Get the Pose and observer frame for any given component on a robot.
-
- ::
-
- # Note that the example uses the ``Arm`` class, but any component class that inherits from ``ComponentBase`` will work
- # (``Base``, ``Gripper``, etc).
-
- # Create a `component_name`:
- component_name = Arm.get_resource_name("arm")
-
- from viam.components.gripper import Gripper
- from viam.services.motion import MotionClient
-
- # Assume that the connect function is written and will return a valid machine.
- robot = await connect()
-
- motion = MotionClient.from_robot(robot=robot, name="builtin")
- gripperName = Gripper.get_resource_name("my_gripper")
- gripperPoseInWorld = await motion.get_pose(component_name=gripperName,
- destination_frame="world")
-
- Args:
- component_name (viam.proto.common.ResourceName): Name of a component on a robot.
- destination_frame (str): Name of the desired reference frame.
- supplemental_transforms (Optional[List[viam.proto.common.Transform]]): Transforms used to augment the robot's frame while
- calculating pose.
-
- Returns:
- ``Pose`` (PoseInFrame): Pose of the given component and the frame in which it was observed.
-
- For more information, see `Motion service `_.
- """
if extra is None:
extra = {}
request = GetPoseRequest(
@@ -472,28 +209,6 @@ async def get_pose(
return response.pose
async def do_command(self, command: Mapping[str, ValueTypes], *, timeout: Optional[float] = None, **__) -> Mapping[str, ValueTypes]:
- """Send/receive arbitrary commands
-
- ::
-
- # Access the motion service
- motion = MotionClient.from_robot(robot=robot, name="builtin")
-
- my_command = {
- "command": "dosomething",
- "someparameter": 52
- }
-
- await motion.do_command(my_command)
-
- Args:
- command (Dict[str, ValueTypes]): The command to execute.
-
- Returns:
- Dict[str, ValueTypes]: Result of the executed command.
-
- For more information, see `Motion service `_.
- """
request = DoCommandRequest(name=self.name, command=dict_to_struct(command))
response: DoCommandResponse = await self.client.DoCommand(request, timeout=timeout)
return struct_to_dict(response.result)
diff --git a/src/viam/services/motion/motion.py b/src/viam/services/motion/motion.py
new file mode 100644
index 000000000..9b4cdfd4d
--- /dev/null
+++ b/src/viam/services/motion/motion.py
@@ -0,0 +1,376 @@
+import abc
+import sys
+from typing import Any, Final, Mapping, Optional, Sequence
+
+if sys.version_info >= (3, 10):
+ from typing import TypeAlias
+else:
+ from typing_extensions import TypeAlias
+
+from viam.proto.common import GeoGeometry, Geometry, GeoPoint, Pose, PoseInFrame, ResourceName, Transform, WorldState
+from viam.proto.service.motion import Constraints, GetPlanResponse, MotionConfiguration, PlanStatusWithID
+from viam.resource.types import RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_SERVICE, Subtype
+from viam.utils import ValueTypes
+
+from ..service_base import ServiceBase
+
+
+class Motion(ServiceBase):
+ """Motion is a Viam service that coordinates motion planning across all of the components in a given robot.
+
+ The motion planning service calculates a valid path that avoids self collision by default. If additional constraints are supplied in the
+ ``world_state`` message, the motion planning service will also account for those.
+
+ For more information, see `Motion service `_.
+ """
+
+ Plan: "TypeAlias" = GetPlanResponse
+
+ SUBTYPE: Final = Subtype( # pyright: ignore [reportIncompatibleVariableOverride]
+ RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_SERVICE, "motion"
+ )
+
+ @abc.abstractmethod
+ async def move(
+ self,
+ component_name: ResourceName,
+ destination: PoseInFrame,
+ world_state: Optional[WorldState] = None,
+ constraints: Optional[Constraints] = None,
+ *,
+ extra: Optional[Mapping[str, Any]] = None,
+ timeout: Optional[float] = None,
+ ) -> bool:
+ """Plan and execute a movement to move the component specified to its goal destination.
+
+ Note: Frames designated with respect to components can also be used as the ``component_name`` when calling for a move. This
+ technique allows for planning and moving the frame itself to the ``destination``. To do so, simply create a resource name with
+ originating ReferenceFrame's name. Then pass in the resource name into ``component_name``. Ex::
+
+ resource_name = Arm.get_resource_name("externalFrame")
+ success = await MotionServiceClient.move(resource_name, ...)
+
+ ::
+
+ motion = MotionClient.from_robot(robot=robot, name="builtin")
+
+ # Assumes a gripper configured with name "my_gripper" on the machine
+ gripper_name = Gripper.get_resource_name("my_gripper")
+ my_frame = "my_gripper_offset"
+
+ goal_pose = Pose(x=0, y=0, z=300, o_x=0, o_y=0, o_z=1, theta=0)
+
+ # Move the gripper
+ moved = await motion.move(component_name=gripper_name,
+ destination=PoseInFrame(reference_frame="myFrame",
+ pose=goal_pose),
+ world_state=worldState,
+ constraints={},
+ extra={})
+
+ Args:
+ component_name (viam.proto.common.ResourceName): Name of a component on a given robot.
+ destination (viam.proto.common.PoseInFrame): The destination to move to, expressed as a ``Pose`` and the frame in which it was
+ observed.
+ world_state (viam.proto.common.WorldState): When supplied, the motion service will create a plan that obeys any constraints
+ expressed in the WorldState message.
+ constraints (viam.proto.service.motion.Constraints): When supplied, the motion service will create a plan that obeys any
+ specified constraints.
+
+ Returns:
+ bool: Whether the move was successful.
+
+ For more information, see `Motion service `_.
+ """
+ ...
+
+ @abc.abstractmethod
+ async def move_on_globe(
+ self,
+ component_name: ResourceName,
+ destination: GeoPoint,
+ movement_sensor_name: ResourceName,
+ obstacles: Optional[Sequence[GeoGeometry]] = None,
+ heading: Optional[float] = None,
+ configuration: Optional[MotionConfiguration] = None,
+ *,
+ bounding_regions: Optional[Sequence[GeoGeometry]] = None,
+ extra: Optional[Mapping[str, ValueTypes]] = None,
+ timeout: Optional[float] = None,
+ ) -> str:
+ """Move a component to a specific latitude and longitude, using a ``MovementSensor`` to check the location.
+
+ ``move_on_globe()`` is non blocking, meaning the motion service will move the component to the destination
+ GPS point after ``move_on_globe()`` returns.
+
+ Each successful ``move_on_globe()`` call returns a unique ExecutionID which you can use to identify all plans
+ generated during the ``move_on_globe()`` call.
+
+ You can monitor the progress of the ``move_on_globe()`` call by querying ``get_plan()`` and ``list_plan_statuses()``.
+
+ ::
+
+ motion = MotionClient.from_robot(robot=robot, name="builtin")
+
+ # Get the ResourceNames of the base and movement sensor
+ my_base_resource_name = Base.get_resource_name("my_base")
+ mvmnt_sensor_resource_name = MovementSensor.get_resource_name(
+ "my_movement_sensor")
+ # Define a destination GeoPoint at the GPS coordinates [0, 0]
+ my_destination = movement_sensor.GeoPoint(latitude=0, longitude=0)
+
+ # Move the base component to the designated geographic location, as reported by the movement sensor
+ execution_id = await motion.move_on_globe(
+ component_name=my_base_resource_name,
+ destination=my_destination,
+ movement_sensor_name=mvmnt_sensor_resource_name)
+
+ Args:
+ component_name (ResourceName): The ResourceName of the base to move.
+ destination (GeoPoint): The location of the component's destination, represented in geographic notation as a
+ GeoPoint (lat, lng).
+ movement_sensor_name (ResourceName): The ResourceName of the movement sensor that you want to use to check
+ the machine's location.
+ obstacles (Optional[Sequence[GeoGeometry]]): Obstacles to consider when planning the motion of the component,
+ with each represented as a GeoGeometry. Default: None
+ heading (Optional[float]): The compass heading, in degrees, that the machine's movement sensor should report
+ at the destination point. Range: [0-360) 0: North, 90: East, 180: South, 270: West. Default: None
+ configuration (Optional[MotionConfiguration]): The configuration you want to set across this machine for this
+ motion service. This parameter and each of its fields are optional.
+
+ - obstacle_detectors (Sequence[ObstacleDetector]): The names of each vision service and camera resource pair
+ you want to use for transient obstacle avoidance.
+
+ - position_polling_frequency_hz (float): The frequency in Hz to poll the position of the machine.
+ - obstacle_polling_frequency_hz (float): The frequency in Hz to poll the vision service for new obstacles.
+ - plan_deviation_m (float): The distance in meters that the machine can deviate from the motion plan.
+ - linear_m_per_sec (float): Linear velocity this machine should target when moving.
+ - angular_degs_per_sec (float): Angular velocity this machine should target when turning.
+ bounding_regions (Optional[Sequence[GeoGeometry]]): Set of obstacles which the robot must remain within while navigating
+ extra (Optional[Dict[str, Any]]): Extra options to pass to the underlying RPC call.
+ timeout (Optional[float]): An option to set how long to wait (in seconds) before calling a time-out and closing
+ the underlying RPC call.
+
+
+ Returns:
+ str: ExecutionID of the ``move_on_globe()`` call, which can be used to track execution progress.
+
+ For more information, see `Motion service `_.
+ """
+ ...
+
+ @abc.abstractmethod
+ async def move_on_map(
+ self,
+ component_name: ResourceName,
+ destination: Pose,
+ slam_service_name: ResourceName,
+ configuration: Optional[MotionConfiguration] = None,
+ obstacles: Optional[Sequence[Geometry]] = None,
+ *,
+ extra: Optional[Mapping[str, ValueTypes]] = None,
+ timeout: Optional[float] = None,
+ ) -> str:
+ """
+ Move a component to a specific pose, using a ``SlamService`` for the SLAM map, using a ``SLAM Service`` to check the location.
+
+ ``move_on_map()`` is non blocking, meaning the motion service will move the component to the destination
+ Pose point after ``move_on_map()`` returns.
+
+ Each successful ``move_on_map()`` call returns a unique ExecutionID which you can use to identify all plans
+ generated during the ``move_on_map()`` call.
+
+ You can monitor the progress of the ``move_on_map()`` call by querying ``get_plan()`` and ``list_plan_statuses()``.
+
+ ::
+
+ motion = MotionClient.from_robot(robot=robot, name="builtin")
+
+ # Get the ResourceNames of the base component and SLAM service
+ my_base_resource_name = Base.get_resource_name("my_base")
+ my_slam_service_name = SLAMClient.get_resource_name("my_slam_service")
+
+ # Define a destination pose with respect to the origin of the map from the SLAM service "my_slam_service"
+ my_pose = Pose(y=10)
+
+ # Move the base component to the destination pose of Y=10, a location of
+ # (0, 10, 0) in respect to the origin of the map
+ execution_id = await motion.move_on_map(component_name=my_base_resource_name,
+ destination=my_pose,
+ slam_service_name=my_slam_service_name)
+
+ Args:
+ component_name (ResourceName): The ResourceName of the base to move.
+ destination (Pose): The destination, which can be any Pose with respect to the SLAM map's origin.
+ slam_service_name (ResourceName): The ResourceName of the SLAM service from which the SLAM map is requested.
+ configuration (Optional[MotionConfiguration]): The configuration you want to set across this machine for this motion service.
+ This parameter and each of its fields are optional.
+
+ - obstacle_detectors (Sequence[ObstacleDetector]): The names of each vision service and camera resource pair you want to use
+ for transient obstacle avoidance.
+
+ - position_polling_frequency_hz (float): The frequency in hz to poll the position of the machine.
+ - obstacle_polling_frequency_hz (float): The frequency in hz to poll the vision service for new obstacles.
+ - plan_deviation_m (float): The distance in meters that the machine can deviate from the motion plan.
+ - linear_m_per_sec (float): Linear velocity this machine should target when moving.
+ - angular_degs_per_sec (float): Angular velocity this machine should target when turning.
+ obstacles (Optional[Sequence[Geometry]]): Obstacles to be considered for motion planning.
+ extra (Optional[Dict[str, Any]]): Extra options to pass to the underlying RPC call.
+ timeout (Optional[float]): An option to set how long to wait (in seconds) before calling a time-out and closing the underlying
+ RPC call.
+
+ Returns:
+ str: ExecutionID of the ``move_on_map()`` call, which can be used to track execution progress.
+
+ For more information, see `Motion service `_.
+ """
+ ...
+
+ @abc.abstractmethod
+ async def stop_plan(
+ self,
+ component_name: ResourceName,
+ *,
+ extra: Optional[Mapping[str, ValueTypes]] = None,
+ timeout: Optional[float] = None,
+ ):
+ """Stop a component being moved by an in progress ``move_on_globe()`` or ``move_on_map()`` call.
+
+ ::
+
+ # Assuming a `move_on_globe()` started the execution
+ # Stop the base component which was instructed to move by `move_on_globe()`
+ # or `move_on_map()`
+ my_base_resource_name = Base.get_resource_name("my_base")
+ await motion.stop_plan(component_name=mvmnt_sensor)
+
+ Args:
+ component_name (ResourceName): The component to stop
+
+ For more information, see `Motion service `_.
+ """
+ ...
+
+ @abc.abstractmethod
+ async def get_plan(
+ self,
+ component_name: ResourceName,
+ last_plan_only: bool = False,
+ execution_id: Optional[str] = None,
+ *,
+ extra: Optional[Mapping[str, ValueTypes]] = None,
+ timeout: Optional[float] = None,
+ ) -> Plan:
+ """By default: returns the plan history of the most recent ``move_on_globe()`` or ``move_on_map()`` call to move a component.
+
+ The plan history for executions before the most recent can be requested by providing an ExecutionID in the request.
+
+ Returns a result if both of the following conditions are met:
+
+ - the execution (call to ``move_on_globe()`` or ``move_on_map()``) is still executing **or** changed state within the last 24 hours
+ - the robot has not reinitialized
+
+ Plans never change.
+
+ Replans always create new plans.
+
+ Replans share the ExecutionID of the previously executing plan.
+
+ All repeated fields are in time ascending order.
+
+ ::
+
+ motion = MotionClient.from_robot(robot=robot, name="builtin")
+ my_base_resource_name = Base.get_resource_name("my_base")
+ # Get the plan(s) of the base component which was instructed to move by `MoveOnGlobe()` or `MoveOnMap()`
+ resp = await motion.get_plan(component_name=my_base_resource_name)
+
+ Args:
+ component_name (ResourceName): The component to stop
+ last_plan_only (Optional[bool]): If supplied, the response will only return the last plan for the component / execution.
+ execution_id (Optional[str]): If supplied, the response will only return plans with the provided execution_id.
+
+ Returns:
+ ``GetPlanResponse`` (GetPlanResponse): The current PlanWithStatus & replan history which matches the request
+
+ For more information, see `Motion service `_.
+ """
+ ...
+
+ @abc.abstractmethod
+ async def list_plan_statuses(
+ self,
+ only_active_plans: bool = False,
+ *,
+ extra: Optional[Mapping[str, ValueTypes]] = None,
+ timeout: Optional[float] = None,
+ ) -> Sequence[PlanStatusWithID]:
+ """Returns the statuses of plans created by `move_on_globe()` or ``move_on_map()`` calls that meet at least one of the following
+ conditions since the motion service initialized:
+
+ - the plan's status is in progress
+ - the plan's status changed state within the last 24 hours
+
+ All repeated fields are in chronological order.
+
+ ::
+
+ motion = MotionClient.from_robot(robot=robot, name="builtin")
+ # List the plan statuses of the motion service within the TTL
+ resp = await motion.list_plan_statuses()
+
+ Args:
+ only_active_plans (Optional[bool]): If supplied, the response will filter out any plans that are not executing.
+
+ Returns:
+ ``ListPlanStatusesResponse`` (ListPlanStatusesResponse): List of last known statuses with the
+ associated IDs of all plans within the TTL ordered by timestamp in ascending order.
+
+ For more information, see `Motion service `_.
+ """
+ ...
+
+ @abc.abstractmethod
+ async def get_pose(
+ self,
+ component_name: ResourceName,
+ destination_frame: str,
+ supplemental_transforms: Optional[Sequence[Transform]] = None,
+ *,
+ extra: Optional[Mapping[str, Any]] = None,
+ timeout: Optional[float] = None,
+ ) -> PoseInFrame:
+ """
+ Get the Pose and observer frame for any given component on a robot.
+
+ ::
+
+ # Note that the example uses the ``Arm`` class, but any component class that inherits from ``ComponentBase`` will work
+ # (``Base``, ``Gripper``, etc).
+
+ # Create a `component_name`:
+ component_name = Arm.get_resource_name("arm")
+
+ from viam.components.gripper import Gripper
+ from viam.services.motion import MotionClient
+
+ # Assume that the connect function is written and will return a valid machine.
+ robot = await connect()
+
+ motion = MotionClient.from_robot(robot=robot, name="builtin")
+ gripperName = Gripper.get_resource_name("my_gripper")
+ gripperPoseInWorld = await motion.get_pose(component_name=gripperName,
+ destination_frame="world")
+
+ Args:
+ component_name (viam.proto.common.ResourceName): Name of a component on a robot.
+ destination_frame (str): Name of the desired reference frame.
+ supplemental_transforms (Optional[List[viam.proto.common.Transform]]): Transforms used to augment the robot's frame while
+ calculating pose.
+
+ Returns:
+ ``Pose`` (PoseInFrame): Pose of the given component and the frame in which it was observed.
+
+ For more information, see `Motion service `_.
+ """
+ ...
diff --git a/src/viam/services/motion/service.py b/src/viam/services/motion/service.py
new file mode 100644
index 000000000..bcc71d19c
--- /dev/null
+++ b/src/viam/services/motion/service.py
@@ -0,0 +1,132 @@
+from grpclib.server import Stream
+
+from viam.proto.common import DoCommandRequest, DoCommandResponse
+from viam.proto.service.motion import (
+ GetPlanRequest,
+ GetPlanResponse,
+ GetPoseRequest,
+ GetPoseResponse,
+ ListPlanStatusesRequest,
+ ListPlanStatusesResponse,
+ MoveOnGlobeRequest,
+ MoveOnGlobeResponse,
+ MoveOnMapRequest,
+ MoveOnMapResponse,
+ MoveRequest,
+ MoveResponse,
+ StopPlanRequest,
+ StopPlanResponse,
+ UnimplementedMotionServiceBase,
+)
+from viam.resource.rpc_service_base import ResourceRPCServiceBase
+from viam.utils import dict_to_struct, struct_to_dict
+
+from .motion import Motion
+
+
+class MotionRPCService(UnimplementedMotionServiceBase, ResourceRPCServiceBase[Motion]):
+ RESOURCE_TYPE = Motion
+
+ async def Move(self, stream: Stream[MoveRequest, MoveResponse]) -> None:
+ request = await stream.recv_message()
+ assert request is not None
+ service = self.get_resource(request.name)
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
+ result = await service.move(
+ request.component_name,
+ request.destination,
+ request.world_state,
+ request.constraints,
+ extra=struct_to_dict(request.extra),
+ timeout=timeout,
+ )
+ response = MoveResponse(success=result)
+ await stream.send_message(response)
+
+ async def MoveOnMap(self, stream: Stream[MoveOnMapRequest, MoveOnMapResponse]) -> None:
+ request = await stream.recv_message()
+ assert request is not None
+ service = self.get_resource(request.name)
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
+ result = await service.move_on_map(
+ request.component_name,
+ request.destination,
+ request.slam_service_name,
+ request.motion_configuration,
+ request.obstacles,
+ extra=struct_to_dict(request.extra),
+ timeout=timeout,
+ )
+ response = MoveOnMapResponse(execution_id=result)
+ await stream.send_message(response)
+
+ async def MoveOnGlobe(self, stream: Stream[MoveOnGlobeRequest, MoveOnGlobeResponse]) -> None:
+ request = await stream.recv_message()
+ assert request is not None
+ service = self.get_resource(request.name)
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
+ result = await service.move_on_globe(
+ request.component_name,
+ request.destination,
+ request.movement_sensor_name,
+ request.obstacles,
+ request.heading,
+ request.motion_configuration,
+ bounding_regions=request.bounding_regions,
+ extra=struct_to_dict(request.extra),
+ timeout=timeout,
+ )
+ response = MoveOnGlobeResponse(execution_id=result)
+ await stream.send_message(response)
+
+ async def GetPose(self, stream: Stream[GetPoseRequest, GetPoseResponse]) -> None:
+ request = await stream.recv_message()
+ assert request is not None
+ service = self.get_resource(request.name)
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
+ result = await service.get_pose(
+ request.component_name,
+ request.destination_frame,
+ request.supplemental_transforms,
+ extra=struct_to_dict(request.extra),
+ timeout=timeout,
+ )
+ response = GetPoseResponse(pose=result)
+ await stream.send_message(response)
+
+ async def StopPlan(self, stream: Stream[StopPlanRequest, StopPlanResponse]) -> None:
+ request = await stream.recv_message()
+ assert request is not None
+ service = self.get_resource(request.name)
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
+ await service.stop_plan(request.component_name, extra=struct_to_dict(request.extra), timeout=timeout)
+ response = StopPlanResponse()
+ await stream.send_message(response)
+
+ async def ListPlanStatuses(self, stream: Stream[ListPlanStatusesRequest, ListPlanStatusesResponse]) -> None:
+ request = await stream.recv_message()
+ assert request is not None
+ service = self.get_resource(request.name)
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
+ result = await service.list_plan_statuses(request.only_active_plans, extra=struct_to_dict(request.extra), timeout=timeout)
+ response = ListPlanStatusesResponse(plan_statuses_with_ids=result)
+ await stream.send_message(response)
+
+ async def GetPlan(self, stream: Stream[GetPlanRequest, GetPlanResponse]) -> None:
+ request = await stream.recv_message()
+ assert request is not None
+ service = self.get_resource(request.name)
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
+ result = await service.get_plan(
+ request.component_name, request.last_plan_only, request.execution_id, extra=struct_to_dict(request.extra), timeout=timeout
+ )
+ await stream.send_message(result)
+
+ async def DoCommand(self, stream: Stream[DoCommandRequest, DoCommandResponse]) -> None:
+ request = await stream.recv_message()
+ assert request is not None
+ service = self.get_resource(request.name)
+ timeout = stream.deadline.time_remaining() if stream.deadline else None
+ result = await service.do_command(struct_to_dict(request.command), timeout=timeout, metadata=stream.metadata)
+ response = DoCommandResponse(result=dict_to_struct(result))
+ await stream.send_message(response)
diff --git a/src/viam/services/navigation/navigation.py b/src/viam/services/navigation/navigation.py
index 8b9499904..0b57833c5 100644
--- a/src/viam/services/navigation/navigation.py
+++ b/src/viam/services/navigation/navigation.py
@@ -26,7 +26,7 @@ class Navigation(ServiceBase):
async def get_paths(self, *, timeout: Optional[float]) -> List[Path]:
"""
Get each path, the series of geo points the robot plans to travel through
- to get to a destination waypoint, in the machine’s motion planning.
+ to get to a destination waypoint, in the machine's motion planning.
::
@@ -75,7 +75,7 @@ async def get_location(self, *, timeout: Optional[float]) -> GeoPoint:
@abc.abstractmethod
async def get_obstacles(self, *, timeout: Optional[float]) -> List[GeoGeometry]:
"""
- Get an array or list of the obstacles currently in the service’s data storage.
+ Get an array or list of the obstacles currently in the service's data storage.
These are objects designated for the robot to avoid when navigating.
These include all transient obstacles which are discovered by the vision services configured for the navigation service,
in addition to the obstacles that are configured as a part of the service.
@@ -92,7 +92,7 @@ async def get_obstacles(self, *, timeout: Optional[float]) -> List[GeoGeometry]:
before calling a time-out and closing the underlying RPC call.
Returns:
- List[navigation.GeoGeometry]: A list comprised of each GeoGeometry in the service’s data storage.
+ List[navigation.GeoGeometry]: A list comprised of each GeoGeometry in the service's data storage.
These are objects designated for the robot to avoid when navigating.
For more information, see `Navigation service `_.
@@ -102,7 +102,7 @@ async def get_obstacles(self, *, timeout: Optional[float]) -> List[GeoGeometry]:
@abc.abstractmethod
async def get_waypoints(self, *, timeout: Optional[float]) -> List[Waypoint]:
"""
- Get an array of waypoints currently in the service’s data storage.
+ Get an array of waypoints currently in the service's data storage.
These are locations designated within a path for the robot to navigate to.
::
@@ -117,7 +117,7 @@ async def get_waypoints(self, *, timeout: Optional[float]) -> List[Waypoint]:
before calling a time-out and closing the underlying RPC call.
Returns:
- List[navigation.Waypoint]: An array comprised of each Waypoint in the service’s data storage.
+ List[navigation.Waypoint]: An array comprised of each Waypoint in the service's data storage.
These are locations designated within a path for the robot to navigate to.
For more information, see `Navigation service `_.
@@ -127,7 +127,7 @@ async def get_waypoints(self, *, timeout: Optional[float]) -> List[Waypoint]:
@abc.abstractmethod
async def add_waypoint(self, point: GeoPoint, *, timeout: Optional[float]):
"""
- Add a waypoint to the service’s data storage.
+ Add a waypoint to the service's data storage.
::
@@ -153,7 +153,7 @@ async def add_waypoint(self, point: GeoPoint, *, timeout: Optional[float]):
@abc.abstractmethod
async def remove_waypoint(self, id: str, *, timeout: Optional[float]):
"""
- Remove a waypoint from the service’s data storage. If the robot is currently navigating to this waypoint,
+ Remove a waypoint from the service's data storage. If the robot is currently navigating to this waypoint,
the motion will be canceled, and the robot will proceed to the next waypoint.
::
@@ -164,7 +164,7 @@ async def remove_waypoint(self, id: str, *, timeout: Optional[float]):
await my_nav.remove_waypoint(waypoint_id)
Args:
- id (str): The MongoDB ObjectID of the Waypoint to remove from the service’s data storage.
+ id (str): The MongoDB ObjectID of the Waypoint to remove from the service's data storage.
timeout (Optional[float]): An option to set how long to wait (in seconds)
before calling a time-out and closing the underlying RPC call.
diff --git a/src/viam/services/service_base.py b/src/viam/services/service_base.py
index f1bbd7afe..d70c20acf 100644
--- a/src/viam/services/service_base.py
+++ b/src/viam/services/service_base.py
@@ -55,7 +55,7 @@ async def do_command(self, command: Mapping[str, ValueTypes], *, timeout: Option
::
- motion = MotionClient.from_robot(robot, "builtin")
+ service = SERVICE.from_robot(robot, "builtin") # replace SERVICE with the appropriate class
my_command = {
"cmnd": "dosomething",
@@ -63,7 +63,7 @@ async def do_command(self, command: Mapping[str, ValueTypes], *, timeout: Option
}
# Can be used with any resource, using the motion service as an example
- await motion.do_command(command=my_command)
+ await service.do_command(command=my_command)
Args:
command (Dict[str, ValueTypes]): The command to execute
diff --git a/src/viam/services/vision/service.py b/src/viam/services/vision/service.py
index 60d01d655..3dd61dc6f 100644
--- a/src/viam/services/vision/service.py
+++ b/src/viam/services/vision/service.py
@@ -58,7 +58,7 @@ async def CaptureAllFromCamera(self, stream: Stream[CaptureAllFromCameraRequest,
detections=result.detections,
classifications=result.classifications,
objects=result.objects,
- extra=dict_to_struct(result.extra),
+ extra=dict_to_struct(result.extra if result.extra else {}),
)
await stream.send_message(response)
diff --git a/src/viam/services/vision/vision.py b/src/viam/services/vision/vision.py
index c8f30bf4b..27e83d03a 100644
--- a/src/viam/services/vision/vision.py
+++ b/src/viam/services/vision/vision.py
@@ -1,19 +1,20 @@
import abc
import sys
-from typing import Any, Final, List, Mapping, Optional, Union
+from typing import Final, List, Mapping, Optional
from viam.media.video import ViamImage
from viam.proto.common import PointCloudObject
from viam.proto.service.vision import Classification, Detection, GetPropertiesResponse
from viam.resource.types import RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_SERVICE, Subtype
+from viam.utils import ValueTypes
+
+from ..service_base import ServiceBase
if sys.version_info >= (3, 10):
from typing import TypeAlias
else:
from typing_extensions import TypeAlias
-from ..service_base import ServiceBase
-
class CaptureAllResult:
"""
@@ -25,7 +26,14 @@ class CaptureAllResult:
"the classifier/detector was requested, but there were no results".
"""
- def __init__(self, image=None, classifications=None, detections=None, objects=None, extra={}):
+ def __init__(
+ self,
+ image: Optional[ViamImage] = None,
+ classifications: Optional[List[Classification]] = None,
+ detections: Optional[List[Detection]] = None,
+ objects: Optional[List[PointCloudObject]] = None,
+ extra: Optional[Mapping[str, ValueTypes]] = None,
+ ):
"""
Args:
image (ViamImage|None): The image from the GetImage request of the camera, if it was requested.
@@ -37,11 +45,11 @@ def __init__(self, image=None, classifications=None, detections=None, objects=No
Returns:
None
"""
- self.image: Union[ViamImage, None] = image
- self.detections: Union[List[Detection], None] = detections
- self.classifications: Union[List[Classification], None] = classifications
- self.objects: Union[List[PointCloudObject], None] = objects
- self.extra: dict = extra
+ self.image = image
+ self.classifications = classifications
+ self.detections = detections
+ self.objects = objects
+ self.extra = extra
class Vision(ServiceBase):
@@ -77,7 +85,7 @@ async def capture_all_from_camera(
return_detections: bool = False,
return_object_point_clouds: bool = False,
*,
- extra: Optional[Mapping[str, Any]] = None,
+ extra: Optional[Mapping[str, ValueTypes]] = None,
timeout: Optional[float] = None,
) -> CaptureAllResult:
"""Get the next image, detections, classifications, and objects all together,
@@ -118,7 +126,7 @@ async def get_detections_from_camera(
self,
camera_name: str,
*,
- extra: Optional[Mapping[str, Any]] = None,
+ extra: Optional[Mapping[str, ValueTypes]] = None,
timeout: Optional[float] = None,
) -> List[Detection]:
"""Get a list of detections in the next image given a camera and a detector
@@ -153,7 +161,7 @@ async def get_detections(
self,
image: ViamImage,
*,
- extra: Optional[Mapping[str, Any]] = None,
+ extra: Optional[Mapping[str, ValueTypes]] = None,
timeout: Optional[float] = None,
) -> List[Detection]:
"""Get a list of detections in the given image using the specified detector
@@ -193,7 +201,7 @@ async def get_classifications_from_camera(
camera_name: str,
count: int,
*,
- extra: Optional[Mapping[str, Any]] = None,
+ extra: Optional[Mapping[str, ValueTypes]] = None,
timeout: Optional[float] = None,
) -> List[Classification]:
"""Get a list of classifications in the next image given a camera and a classifier
@@ -226,7 +234,7 @@ async def get_classifications(
image: ViamImage,
count: int,
*,
- extra: Optional[Mapping[str, Any]] = None,
+ extra: Optional[Mapping[str, ValueTypes]] = None,
timeout: Optional[float] = None,
) -> List[Classification]:
"""Get a list of classifications in the given image using the specified classifier
@@ -261,7 +269,7 @@ async def get_object_point_clouds(
self,
camera_name: str,
*,
- extra: Optional[Mapping[str, Any]] = None,
+ extra: Optional[Mapping[str, ValueTypes]] = None,
timeout: Optional[float] = None,
) -> List[PointCloudObject]:
"""
@@ -301,7 +309,7 @@ async def get_object_point_clouds(
async def get_properties(
self,
*,
- extra: Optional[Mapping[str, Any]] = None,
+ extra: Optional[Mapping[str, ValueTypes]] = None,
timeout: Optional[float] = None,
) -> Properties:
"""
diff --git a/tests/test_motion_service.py b/tests/test_motion_service.py
index 969f3ee3c..decf7e891 100644
--- a/tests/test_motion_service.py
+++ b/tests/test_motion_service.py
@@ -1,14 +1,15 @@
+from typing import Any, Mapping, Optional, Sequence
+from unittest.mock import patch
+
import pytest
from google.protobuf.timestamp_pb2 import Timestamp
from grpclib.testing import ChannelFor
from viam.components.arm import Arm
from viam.components.base import Base
-from viam.components.gantry import Gantry
from viam.gen.service.motion.v1.motion_pb2 import (
PLAN_STATE_FAILED,
PLAN_STATE_IN_PROGRESS,
- PLAN_STATE_STOPPED,
PLAN_STATE_SUCCEEDED,
ComponentState,
GetPlanResponse,
@@ -19,301 +20,322 @@
PlanStep,
PlanWithStatus,
)
-from viam.proto.common import GeoGeometry, GeoPoint, Pose, PoseInFrame, ResourceName
-from viam.proto.service.motion import Constraints, LinearConstraint, MotionConfiguration, ObstacleDetector
+from viam.proto.common import GeoGeometry, Geometry, GeoPoint, Pose, PoseInFrame, ResourceName, Transform, WorldState
+from viam.proto.service.motion import Constraints, LinearConstraint, MotionConfiguration
+from viam.resource.manager import ResourceManager
from viam.services.motion import MotionClient
+from viam.services.motion.motion import Motion
+from viam.services.motion.service import MotionRPCService
+from viam.utils import ValueTypes
from . import loose_approx
-from .mocks.services import MockMotion
-MOVE_CONSTRAINTS = Constraints(linear_constraint=[LinearConstraint(), LinearConstraint(line_tolerance_mm=2)])
-MOVE_RESPONSES = {"arm": False, "gantry": True}
-GET_POSE_RESPONSES = {
- "arm": PoseInFrame(reference_frame="arm", pose=Pose(x=1, y=2, z=3, o_x=2, o_y=3, o_z=4, theta=20)),
- "gantry": PoseInFrame(reference_frame="gantry", pose=Pose(x=2, y=3, z=4, o_x=3, o_y=4, o_z=5, theta=21)),
-}
+MOTION_SERVICE_NAME = "motion1"
-GET_PLAN_RESPONSE = GetPlanResponse(
- current_plan_with_status=PlanWithStatus(
- plan=Plan(
- id="plan_id2",
- component_name=Base.get_resource_name("get_plan_base"),
- execution_id="execution_id",
- steps=[
- PlanStep(step={"get_plan_base": ComponentState(pose=Pose(x=2, y=3, z=4, o_x=3, o_y=4, o_z=5, theta=21))}),
- PlanStep(step={"get_plan_base": ComponentState(pose=Pose(x=6, y=7, z=8, o_x=9, o_y=10, o_z=11, theta=23))}),
- ],
- ),
- status=PlanStatus(state=PLAN_STATE_SUCCEEDED, timestamp=Timestamp(seconds=4)),
- status_history=[PlanStatus(state=PLAN_STATE_IN_PROGRESS, timestamp=Timestamp(seconds=3))],
- ),
- replan_history=[
- PlanWithStatus(
- plan=Plan(
- id="plan_id1",
- component_name=Base.get_resource_name("get_plan_base"),
- execution_id="execution_id",
- steps=[
- PlanStep(step={"get_plan_base": ComponentState(pose=Pose(x=1, y=1, z=1, o_x=1, o_y=1, o_z=1, theta=20))}),
- PlanStep(step={"get_plan_base": ComponentState(pose=Pose(x=2, y=3, z=4, o_x=3, o_y=4, o_z=5, theta=21))}),
- PlanStep(step={"get_plan_base": ComponentState(pose=Pose(x=6, y=7, z=8, o_x=9, o_y=10, o_z=11, theta=23))}),
- ],
- ),
- status=PlanStatus(state=PLAN_STATE_FAILED, reason="failure reason", timestamp=Timestamp(seconds=2)),
- status_history=[PlanStatus(state=PLAN_STATE_IN_PROGRESS, timestamp=Timestamp(seconds=1))],
- )
- ],
-)
-LIST_PLAN_STATUSES_RESPONSE = ListPlanStatusesResponse(
- plan_statuses_with_ids=[
- PlanStatusWithID(
- plan_id="plan 5",
- component_name=Base.get_resource_name("list_plan_statuses_base"),
- execution_id="execution_id 3",
- status=PlanStatus(state=PLAN_STATE_IN_PROGRESS, timestamp=Timestamp(seconds=10)),
- ),
- PlanStatusWithID(
- plan_id="plan 4",
- component_name=Base.get_resource_name("list_plan_statuses_base"),
- execution_id="execution_id 2",
- status=PlanStatus(state=PLAN_STATE_SUCCEEDED, timestamp=Timestamp(seconds=9)),
- ),
- PlanStatusWithID(
- plan_id="plan 3",
- component_name=Base.get_resource_name("list_plan_statuses_base"),
- execution_id="execution_id 2",
- status=PlanStatus(state=PLAN_STATE_FAILED, reason="other failure reason", timestamp=Timestamp(seconds=8)),
- ),
- PlanStatusWithID(
- plan_id="plan 2",
- component_name=Base.get_resource_name("list_plan_statuses_base"),
- execution_id="execution_id 2",
- status=PlanStatus(state=PLAN_STATE_FAILED, reason="failure reason", timestamp=Timestamp(seconds=7)),
- ),
- PlanStatusWithID(
- plan_id="plan 1",
- component_name=Base.get_resource_name("list_plan_statuses_base"),
- execution_id="execution_id 1",
- status=PlanStatus(state=PLAN_STATE_STOPPED, timestamp=Timestamp(seconds=6)),
- ),
- ]
-)
+@pytest.fixture(scope="function")
+def motion():
+ class MockMotion(Motion):
+ async def move(
+ self,
+ component_name: ResourceName,
+ destination: PoseInFrame,
+ world_state: Optional[WorldState] = None,
+ constraints: Optional[Constraints] = None,
+ *,
+ extra: Optional[Mapping[str, Any]] = None,
+ timeout: Optional[float] = None
+ ) -> bool:
+ raise NotImplementedError
-MOTION_CONFIGURATION = MotionConfiguration(
- obstacle_detectors=[
- ObstacleDetector(
- vision_service=ResourceName(namespace="rdk", type="service", subtype="vision", name="viz1"),
- camera=ResourceName(namespace="rdk", type="component", subtype="camera", name="cam1"),
- )
- ],
- position_polling_frequency_hz=144,
- obstacle_polling_frequency_hz=182,
- plan_deviation_m=41,
- linear_m_per_sec=44,
- angular_degs_per_sec=10,
-)
+ async def move_on_globe(
+ self,
+ component_name: ResourceName,
+ destination: GeoPoint,
+ movement_sensor_name: ResourceName,
+ obstacles: Optional[Sequence[GeoGeometry]] = None,
+ heading: Optional[float] = None,
+ configuration: Optional[MotionConfiguration] = None,
+ *,
+ bounding_regions: Optional[Sequence[GeoGeometry]] = None,
+ extra: Optional[Mapping[str, ValueTypes]] = None,
+ timeout: Optional[float] = None
+ ) -> str:
+ raise NotImplementedError
-MOTION_SERVICE_NAME = "motion1"
+ async def move_on_map(
+ self,
+ component_name: ResourceName,
+ destination: Pose,
+ slam_service_name: ResourceName,
+ configuration: Optional[MotionConfiguration] = None,
+ obstacles: Optional[Sequence[Geometry]] = None,
+ *,
+ extra: Optional[Mapping[str, ValueTypes]] = None,
+ timeout: Optional[float] = None
+ ) -> str:
+ raise NotImplementedError
+
+ async def stop_plan(
+ self, component_name: ResourceName, *, extra: Optional[Mapping[str, ValueTypes]] = None, timeout: Optional[float] = None
+ ):
+ raise NotImplementedError
+
+ async def get_plan(
+ self,
+ component_name: ResourceName,
+ last_plan_only: bool = False,
+ execution_id: Optional[str] = None,
+ *,
+ extra: Optional[Mapping[str, ValueTypes]] = None,
+ timeout: Optional[float] = None
+ ) -> GetPlanResponse:
+ raise NotImplementedError
+
+ async def list_plan_statuses(
+ self, only_active_plans: bool = False, *, extra: Optional[Mapping[str, ValueTypes]] = None, timeout: Optional[float] = None
+ ) -> ListPlanStatusesResponse:
+ raise NotImplementedError
+
+ async def get_pose(
+ self,
+ component_name: ResourceName,
+ destination_frame: str,
+ supplemental_transforms: Optional[Sequence[Transform]] = None,
+ *,
+ extra: Optional[Mapping[str, Any]] = None,
+ timeout: Optional[float] = None
+ ) -> PoseInFrame:
+ raise NotImplementedError
+
+ return MockMotion(MOTION_SERVICE_NAME)
@pytest.fixture(scope="function")
-def service() -> MockMotion:
- return MockMotion(
- move_responses=MOVE_RESPONSES,
- get_pose_responses=GET_POSE_RESPONSES,
- get_plan_response=GET_PLAN_RESPONSE,
- list_plan_statuses_response=LIST_PLAN_STATUSES_RESPONSE,
- )
+def service(motion: Motion) -> MotionRPCService:
+ return MotionRPCService(ResourceManager([motion]))
-class TestClient:
+class TestMotionService:
@pytest.mark.asyncio
- async def test_plan_and_move(self, service: MockMotion):
- async with ChannelFor([service]) as channel:
- client = MotionClient(MOTION_SERVICE_NAME, channel)
- assert service.timeout is None
- assert service.constraints is None
- timeout = 1.4
- success = await client.move(
- Arm.get_resource_name("arm"), PoseInFrame(), constraints=MOVE_CONSTRAINTS, extra={"foo": "bar"}, timeout=timeout
- )
- assert success == MOVE_RESPONSES["arm"]
- assert service.extra == {"foo": "bar"}
- assert service.timeout == loose_approx(timeout)
- assert service.constraints is not None
- assert service.constraints.linear_constraint == [LinearConstraint(), LinearConstraint(line_tolerance_mm=2)]
- success = await client.move(Gantry.get_resource_name("gantry"), PoseInFrame())
- assert success == MOVE_RESPONSES["gantry"]
- assert service.extra == {}
- assert service.timeout is None
+ async def test_move(self, motion: Motion, service: MotionRPCService):
+ with patch.object(motion, "move") as patched_method:
+ patched_method.return_value = True
+ async with ChannelFor([service]) as channel:
+ client = MotionClient(MOTION_SERVICE_NAME, channel)
+ resource_name = Arm.get_resource_name("arm")
+ destination = PoseInFrame(reference_frame="refframe")
+ world_state = WorldState(transforms=[Transform(reference_frame="ws_tfrm_rf")])
+ constraints = Constraints(linear_constraint=[LinearConstraint(), LinearConstraint(line_tolerance_mm=2)])
+ extra = {"foo": "bar"}
+ timeout = 2
+ success = await client.move(
+ resource_name,
+ destination,
+ world_state,
+ constraints,
+ extra=extra,
+ timeout=timeout,
+ )
+ assert success is True
+ patched_method.assert_called_once()
+ assert patched_method.call_args.args[0] == resource_name
+ assert patched_method.call_args.args[1] == destination
+ assert patched_method.call_args.args[2] == world_state
+ assert patched_method.call_args.args[3] == constraints
+ assert patched_method.call_args.kwargs["extra"] == extra
+ assert patched_method.call_args.kwargs["timeout"] == loose_approx(timeout)
@pytest.mark.asyncio
- async def test_get_pose(self, service: MockMotion):
- async with ChannelFor([service]) as channel:
- client = MotionClient(MOTION_SERVICE_NAME, channel)
- pose = await client.get_pose(Arm.get_resource_name("arm"), "x", extra={"foo": "bar"})
- assert pose == GET_POSE_RESPONSES["arm"]
- assert service.extra == {"foo": "bar"}
- pose = await client.get_pose(Gantry.get_resource_name("gantry"), "y")
- assert pose == GET_POSE_RESPONSES["gantry"]
- assert service.extra == {}
+ async def test_get_pose(self, motion: Motion, service: MotionRPCService):
+ with patch.object(motion, "get_pose") as patched_method:
+ response = PoseInFrame(reference_frame="arm", pose=Pose(x=1, y=2, z=3, o_x=2, o_y=3, o_z=4, theta=20))
+ patched_method.return_value = response
+ async with ChannelFor([service]) as channel:
+ client = MotionClient(MOTION_SERVICE_NAME, channel)
+ rn = Arm.get_resource_name("arm")
+ destination_frame = "x"
+ transforms = [Transform(reference_frame="y")]
+ extra = {"foo": "bar"}
+ timeout = 4
+ pose = await client.get_pose(rn, destination_frame, transforms, extra=extra, timeout=timeout)
+ assert pose == response
+ patched_method.assert_called_once()
+ assert patched_method.call_args.args[0] == rn
+ assert patched_method.call_args.args[1] == destination_frame
+ assert patched_method.call_args.args[2] == transforms
+ assert patched_method.call_args.kwargs["extra"] == extra
+ assert patched_method.call_args.kwargs["timeout"] == loose_approx(timeout)
@pytest.mark.asyncio
- async def test_move_on_map(self, service: MockMotion):
- component_rn = Base.get_resource_name("move_on_globe_base")
- slam_rn = ResourceName(namespace="rdk", type="service", subtype="slam", name="move_on_map_slam")
- async with ChannelFor([service]) as channel:
- client = MotionClient(MOTION_SERVICE_NAME, channel)
- execution_id = await client.move_on_map(
- component_rn,
- Pose(),
- slam_service_name=slam_rn,
- configuration=MOTION_CONFIGURATION,
- )
- assert service.component_name == component_rn
- assert service.slam_service == slam_rn
- assert service.execution_id == execution_id
- assert service.extra == {}
- assert service.timeout is None
- timeout = 50
- extra = {"max_iter": 1}
- execution_id = await client.move_on_map(
- component_rn,
- Pose(),
- slam_service_name=slam_rn,
- configuration=MOTION_CONFIGURATION,
- extra=extra,
- timeout=timeout,
- )
- assert service.component_name == component_rn
- assert service.slam_service == slam_rn
- assert service.execution_id == execution_id
- assert service.extra == extra
- assert service.timeout == loose_approx(timeout)
+ async def test_move_on_map(self, motion: Motion, service: MotionRPCService):
+ with patch.object(motion, "move_on_map") as patched_method:
+ resopnse = "Move On Map Response"
+ patched_method.return_value = resopnse
+ async with ChannelFor([service]) as channel:
+ client = MotionClient(MOTION_SERVICE_NAME, channel)
+ component_rn = Base.get_resource_name("move_on_globe_base")
+ destination = Pose(x=1, y=2, z=3, theta=4)
+ slam_rn = ResourceName(namespace="rdk", type="service", subtype="slam", name="move_on_map_slam")
+ configuration = MotionConfiguration(position_polling_frequency_hz=4.44)
+ obstacles = [Geometry(center=Pose(x=9, y=8, z=7, theta=6))]
+ extra = {"foo": "bar"}
+ timeout = 4
+ execution_id = await client.move_on_map(
+ component_rn,
+ destination,
+ slam_service_name=slam_rn,
+ configuration=configuration,
+ obstacles=obstacles,
+ extra=extra,
+ timeout=timeout,
+ )
+ assert execution_id == resopnse
+ patched_method.assert_called_once()
+ assert patched_method.call_args.args[0] == component_rn
+ assert patched_method.call_args.args[1] == destination
+ assert patched_method.call_args.args[2] == slam_rn
+ assert patched_method.call_args.args[3] == configuration
+ assert patched_method.call_args.args[4] == obstacles
+ assert patched_method.call_args.kwargs["extra"] == extra
+ assert patched_method.call_args.kwargs["timeout"] == loose_approx(timeout)
@pytest.mark.asyncio
- async def test_move_on_globe(self, service: MockMotion):
- component_rn = Base.get_resource_name("move_on_globe_base")
- movement_rn = ResourceName(namespace="rdk", type="component", subtype="movement_sensor", name="move_on_globe_ms")
- destination = GeoPoint(latitude=123, longitude=456)
- obstacles = [GeoGeometry(location=GeoPoint(latitude=111, longitude=222))]
- bounding_regions = [GeoGeometry(location=GeoPoint(latitude=3, longitude=4))]
- async with ChannelFor([service]) as channel:
- client = MotionClient(MOTION_SERVICE_NAME, channel)
- execution_id = await client.move_on_globe(
- component_rn,
- destination,
- movement_rn,
- obstacles,
- heading=182,
- configuration=MOTION_CONFIGURATION,
- )
- assert service.component_name == component_rn
- assert service.movement_sensor == movement_rn
- assert service.destination == destination
- assert service.obstacles == obstacles
- assert service.heading == 182
- assert service.configuration == MOTION_CONFIGURATION
- assert service.execution_id == execution_id
- assert service.extra == {}
- assert service.timeout is None
- timeout = 50
- extra = {"max_iter": 1}
- execution_id = await client.move_on_globe(
- component_rn,
- destination,
- movement_rn,
- obstacles,
- heading=182,
- configuration=MOTION_CONFIGURATION,
- extra=extra,
- bounding_regions=bounding_regions,
- timeout=timeout,
- )
- assert service.component_name == component_rn
- assert service.movement_sensor == movement_rn
- assert service.destination == destination
- assert service.obstacles == obstacles
- assert service.heading == 182
- assert service.configuration == MOTION_CONFIGURATION
- assert service.bounding_regions == bounding_regions
- assert service.execution_id == execution_id
- assert service.extra == extra
- assert service.timeout == loose_approx(timeout)
+ async def test_move_on_globe(self, motion: Motion, service: MotionRPCService):
+ with patch.object(motion, "move_on_globe") as patched_method:
+ response = "Move On Globe Response"
+ patched_method.return_value = response
+ async with ChannelFor([service]) as channel:
+ client = MotionClient(MOTION_SERVICE_NAME, channel)
+ component_rn = Base.get_resource_name("move_on_globe_base")
+ destination = GeoPoint(latitude=123, longitude=456)
+ movement_rn = ResourceName(namespace="rdk", type="component", subtype="movement_sensor", name="move_on_globe_ms")
+ obstacles = [GeoGeometry(location=GeoPoint(latitude=44, longitude=786))]
+ heading = 5.55
+ configuration = MotionConfiguration(position_polling_frequency_hz=4.44)
+ bounding_regions = [GeoGeometry(location=GeoPoint(latitude=182, longitude=41))]
+ extra = {"foo": "bar"}
+ timeout = 3
+ execution_id = await client.move_on_globe(
+ component_rn,
+ destination,
+ movement_rn,
+ obstacles,
+ heading,
+ configuration,
+ bounding_regions=bounding_regions,
+ extra=extra,
+ timeout=timeout,
+ )
+ assert execution_id == response
+ patched_method.assert_called_once()
+ assert patched_method.call_args.args[0] == component_rn
+ assert patched_method.call_args.args[1] == destination
+ assert patched_method.call_args.args[2] == movement_rn
+ assert patched_method.call_args.args[3] == obstacles
+ assert patched_method.call_args.args[4] == heading
+ assert patched_method.call_args.args[5] == configuration
+ assert patched_method.call_args.kwargs["bounding_regions"] == bounding_regions
+ assert patched_method.call_args.kwargs["extra"] == extra
+ assert patched_method.call_args.kwargs["timeout"] == loose_approx(timeout)
@pytest.mark.asyncio
- async def test_stop_plan(self, service: MockMotion):
- component_rn = Base.get_resource_name("stop_plan_base")
- async with ChannelFor([service]) as channel:
- client = MotionClient(MOTION_SERVICE_NAME, channel)
- await client.stop_plan(component_rn)
- assert service.component_name == component_rn
- assert service.extra == {}
- assert service.timeout is None
- timeout = 50
- extra = {"max_iter": 1}
- await client.stop_plan(component_rn, extra=extra, timeout=timeout)
- assert service.component_name == component_rn
- assert service.extra == extra
- assert service.timeout == loose_approx(timeout)
+ async def test_stop_plan(self, motion: Motion, service: MotionRPCService):
+ with patch.object(motion, "stop_plan") as patched_method:
+ async with ChannelFor([service]) as channel:
+ client = MotionClient(MOTION_SERVICE_NAME, channel)
+ component_rn = Base.get_resource_name("stop_plan_base")
+ extra = {"foo": "bar"}
+ timeout = 4
+ await client.stop_plan(component_rn, extra=extra, timeout=timeout)
+ patched_method.assert_called_once()
+ assert patched_method.call_args.args[0] == component_rn
+ assert patched_method.call_args.kwargs["extra"] == extra
+ assert patched_method.call_args.kwargs["timeout"] == loose_approx(timeout)
@pytest.mark.asyncio
- async def test_get_plan(self, service: MockMotion):
- component_rn = Base.get_resource_name("get_plan_base")
- async with ChannelFor([service]) as channel:
- client = MotionClient(MOTION_SERVICE_NAME, channel)
- response = await client.get_plan(component_rn)
- assert service.component_name == component_rn
- assert not service.last_plan_only
- assert service.execution_id == ""
- assert service.extra == {}
- assert service.timeout is None
- assert response == GET_PLAN_RESPONSE
- last_plan_only = True
- execution_id = "execution_id"
- timeout = 50
- extra = {"some": "extra"}
- response = await client.get_plan(
- component_rn,
- last_plan_only=last_plan_only,
- execution_id=execution_id,
- extra=extra,
- timeout=timeout,
+ async def test_get_plan(self, motion: Motion, service: MotionRPCService):
+ with patch.object(motion, "get_plan") as patched_method:
+ response = GetPlanResponse(
+ current_plan_with_status=PlanWithStatus(
+ plan=Plan(
+ id="plan_id2",
+ component_name=Base.get_resource_name("get_plan_base"),
+ execution_id="execution_id",
+ steps=[
+ PlanStep(step={"get_plan_base": ComponentState(pose=Pose(x=2, y=3, z=4, o_x=3, o_y=4, o_z=5, theta=21))}),
+ PlanStep(step={"get_plan_base": ComponentState(pose=Pose(x=6, y=7, z=8, o_x=9, o_y=10, o_z=11, theta=23))}),
+ ],
+ ),
+ status=PlanStatus(state=PLAN_STATE_SUCCEEDED, timestamp=Timestamp(seconds=4)),
+ status_history=[PlanStatus(state=PLAN_STATE_IN_PROGRESS, timestamp=Timestamp(seconds=3))],
+ ),
+ replan_history=[
+ PlanWithStatus(
+ plan=Plan(
+ id="plan_id1",
+ component_name=Base.get_resource_name("get_plan_base"),
+ execution_id="execution_id",
+ steps=[
+ PlanStep(step={"get_plan_base": ComponentState(pose=Pose(x=1, y=1, z=1, o_x=1, o_y=1, o_z=1, theta=20))}),
+ PlanStep(step={"get_plan_base": ComponentState(pose=Pose(x=2, y=3, z=4, o_x=3, o_y=4, o_z=5, theta=21))}),
+ PlanStep(step={"get_plan_base": ComponentState(pose=Pose(x=6, y=7, z=8, o_x=9, o_y=10, o_z=11, theta=23))}),
+ ],
+ ),
+ status=PlanStatus(state=PLAN_STATE_FAILED, reason="failure reason", timestamp=Timestamp(seconds=2)),
+ status_history=[PlanStatus(state=PLAN_STATE_IN_PROGRESS, timestamp=Timestamp(seconds=1))],
+ )
+ ],
)
- assert service.component_name == component_rn
- assert service.last_plan_only == last_plan_only
- assert service.execution_id == execution_id
- assert service.extra == extra
- assert service.timeout == loose_approx(timeout)
- assert response == GET_PLAN_RESPONSE
+ patched_method.return_value = response
+ async with ChannelFor([service]) as channel:
+ client = MotionClient(MOTION_SERVICE_NAME, channel)
+ component_rn = Base.get_resource_name("get_plan_base")
+ last_plan_only = True
+ execution_id = "ex_id"
+ extra = {"foo": "bar"}
+ timeout = 4
+
+ plan = await client.get_plan(component_rn, last_plan_only, execution_id, extra=extra, timeout=timeout)
+ assert plan == response
+ patched_method.assert_called_once()
+ assert patched_method.call_args.args[0] == component_rn
+ assert patched_method.call_args.args[1] == last_plan_only
+ assert patched_method.call_args.args[2] == execution_id
+ assert patched_method.call_args.kwargs["extra"] == extra
+ assert patched_method.call_args.kwargs["timeout"] == loose_approx(timeout)
@pytest.mark.asyncio
- async def test_list_plan_statuses(self, service: MockMotion):
- async with ChannelFor([service]) as channel:
- client = MotionClient(MOTION_SERVICE_NAME, channel)
- response = await client.list_plan_statuses()
- assert not service.only_active_plans
- assert service.extra == {}
- assert service.timeout is None
- assert response == LIST_PLAN_STATUSES_RESPONSE
- only_active_plans = True
- timeout = 50
- extra = {"some": "extra"}
- response = await client.list_plan_statuses(
- only_active_plans=only_active_plans,
- extra=extra,
- timeout=timeout,
- )
- assert service.only_active_plans == only_active_plans
- assert service.extra == extra
- assert service.timeout == loose_approx(timeout)
- assert response == LIST_PLAN_STATUSES_RESPONSE
+ async def test_list_plan_statuses(self, motion: Motion, service: MotionRPCService):
+ with patch.object(motion, "list_plan_statuses") as patched_method:
+ response = [PlanStatusWithID(plan_id="lpsr_pswid")]
+ patched_method.return_value = response
+ async with ChannelFor([service]) as channel:
+ client = MotionClient(MOTION_SERVICE_NAME, channel)
+
+ only_active_plans = True
+ extra = {"foo": "bar"}
+ timeout = 5
+
+ plan_statuses = await client.list_plan_statuses(only_active_plans, extra=extra, timeout=timeout)
+
+ assert plan_statuses == response
+ patched_method.assert_called_once()
+ assert patched_method.call_args.args[0] == only_active_plans
+ assert patched_method.call_args.kwargs["extra"] == extra
+ assert patched_method.call_args.kwargs["timeout"] == loose_approx(timeout)
@pytest.mark.asyncio
- async def test_do(self, service: MockMotion):
- async with ChannelFor([service]) as channel:
- client = MotionClient(MOTION_SERVICE_NAME, channel)
- command = {"command": "args"}
- response = await client.do_command(command)
- assert response == command
+ async def test_do(self, motion: Motion, service: MotionRPCService):
+ with patch.object(motion, "do_command") as patched_method:
+ response = {"do": "command"}
+ patched_method.return_value = response
+ async with ChannelFor([service]) as channel:
+ client = MotionClient(MOTION_SERVICE_NAME, channel)
+ command = {"command": "args"}
+ timeout = 5
+ dc_response = await client.do_command(command, timeout=timeout)
+ assert dc_response == response
+ patched_method.assert_called_once()
+ assert patched_method.call_args.args[0] == command
+ assert patched_method.call_args.kwargs["timeout"] == loose_approx(timeout)
diff --git a/tests/test_robot.py b/tests/test_robot.py
index bb345b2e6..5dcc2a220 100644
--- a/tests/test_robot.py
+++ b/tests/test_robot.py
@@ -54,7 +54,7 @@
from viam.resource.types import RESOURCE_NAMESPACE_RDK, RESOURCE_TYPE_COMPONENT, RESOURCE_TYPE_SERVICE
from viam.robot.client import RobotClient
from viam.robot.service import RobotService
-from viam.services.motion.client import MotionClient
+from viam.services.mlmodel.client import MLModelClient
from viam.utils import dict_to_struct, message_to_struct, struct_to_message
from .mocks.components import MockArm, MockCamera, MockMotor, MockMovementSensor, MockSensor
@@ -177,7 +177,7 @@ def service() -> RobotService:
position_supported=True,
compass_heading_supported=False,
),
- accuracy={"foo": 0.1, "bar": 2, "baz": 3.14},
+ accuracy=MovementSensor.Accuracy(accuracy={"foo": 0.1, "bar": 2, "baz": 3.14}),
readings={"a": 1, "b": 2, "c": 3},
),
MockMLModel("mlmodel1"),
@@ -403,10 +403,9 @@ async def test_get_status(self, service: RobotService):
async def test_get_service(self, service: RobotService):
async with ChannelFor([service]) as channel:
client = await RobotClient.with_channel(channel, RobotClient.Options())
- client._resource_names.append(ResourceName(namespace=RESOURCE_NAMESPACE_RDK, type="service", subtype="motion", name="motion1"))
with pytest.raises(ResourceNotFoundError):
- MotionClient.from_robot(client)
- MotionClient.from_robot(client, "motion1")
+ MLModelClient.from_robot(client, "mlmodel")
+ MLModelClient.from_robot(client, "mlmodel1")
await client.close()
@pytest.mark.asyncio
@@ -501,7 +500,7 @@ async def test_stop_all(self, service: RobotService):
assert await motor.is_moving() is True
extra = {"foo": "bar", "baz": [1, 2, 3]}
- await client.stop_all({arm.get_resource_name(arm.name): extra})
+ await client.stop_all({arm.get_resource_name(arm.name): extra}) # type: ignore
assert await arm.is_moving() is False
assert arm.extra == extra
diff --git a/tests/test_vision_service.py b/tests/test_vision_service.py
index 643355ec9..c780f7264 100644
--- a/tests/test_vision_service.py
+++ b/tests/test_vision_service.py
@@ -154,6 +154,7 @@ async def test_capture_all_from_camera(self, vision: MockVision):
return_detections=True,
extra=extra,
)
+ assert response.image is not None
assert response.image.data == VISION_IMAGE.data
assert response.image.mime_type == VISION_IMAGE.mime_type
assert response.detections == DETECTIONS
@@ -333,6 +334,7 @@ async def test_capture_all_from_camera(self, vision: MockVision, service: Vision
return_object_point_clouds=True,
extra=extra,
)
+ assert response.image is not None
assert response.image.data == VISION_IMAGE.data
assert response.image.mime_type == VISION_IMAGE.mime_type
assert response.detections is None