@rainbow-robotics/muscat-plugin-kit 1.10.1-dev.1 → 1.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +282 -282
- package/cli/README.md +274 -274
- package/cli/bin/create-muscat-plugin.mjs +8 -8
- package/cli/bin/muscat-pk.mjs +155 -155
- package/cli/bundle-templates.mjs +31 -31
- package/cli/docker/Dockerfile.cpp +28 -28
- package/cli/docker/Dockerfile.dev +30 -30
- package/cli/docker/Dockerfile.python +21 -21
- package/cli/m5-e2e.mjs +69 -69
- package/cli/prepack.mjs +10 -10
- package/cli/src/ai-rules.mjs +70 -70
- package/cli/src/build.mjs +447 -447
- package/cli/src/check-package.mjs +13 -13
- package/cli/src/completion.mjs +166 -166
- package/cli/src/cpp.mjs +78 -78
- package/cli/src/cppIde.mjs +75 -75
- package/cli/src/dev.mjs +165 -165
- package/cli/src/devBack.mjs +734 -727
- package/cli/src/devUi.mjs +247 -243
- package/cli/src/esbuild.mjs +56 -56
- package/cli/src/host_agent.py +223 -223
- package/cli/src/manifest.mjs +287 -287
- package/cli/src/mcp.mjs +1071 -1071
- package/cli/src/muscatLocal.mjs +209 -209
- package/cli/src/new.mjs +343 -343
- package/cli/src/pluginDevServer.mjs +111 -111
- package/cli/src/ports.mjs +193 -193
- package/cli/src/python.mjs +112 -112
- package/cli/src/ros2.mjs +109 -109
- package/cli/src/sdk.mjs +117 -117
- package/cli/src/storybook.mjs +168 -168
- package/cli/src/type.mjs +141 -141
- package/cli/src/uninstall.mjs +81 -81
- package/cli/src/update.mjs +295 -295
- package/cli/src/util.mjs +441 -441
- package/cli/src/zenohDev.mjs +83 -81
- package/cli/storybook-dist/_design-tokens.css +4957 -4957
- package/cli/storybook-dist/_stories-src/NxAvatar.stories.tsx +27 -27
- package/cli/storybook-dist/_stories-src/NxPagination.stories.tsx +28 -28
- package/cli/storybook-dist/_stories-src/RBAccordion/RBAccordion.stories.tsx +46 -46
- package/cli/storybook-dist/_stories-src/RBAccordion/RBAccordionGroup.stories.tsx +73 -73
- package/cli/storybook-dist/_stories-src/RBBadge/RBBadge.stories.tsx +93 -93
- package/cli/storybook-dist/_stories-src/RBBattery/RBBattery.stories.tsx +74 -74
- package/cli/storybook-dist/_stories-src/RBButton/RBCheckIconButton.stories.tsx +28 -28
- package/cli/storybook-dist/_stories-src/RBButton/RBCheckLabelButton.stories.tsx +84 -84
- package/cli/storybook-dist/_stories-src/RBButton/RBIconButton.stories.tsx +57 -57
- package/cli/storybook-dist/_stories-src/RBButton/RBInlineLabelButton.stories.tsx +41 -41
- package/cli/storybook-dist/_stories-src/RBButton/RBLabelButton.stories.tsx +60 -60
- package/cli/storybook-dist/_stories-src/RBDatePicker/RBDateInput.stories.tsx +44 -44
- package/cli/storybook-dist/_stories-src/RBDatePicker/RBRangeDateInput.stories.tsx +56 -56
- package/cli/storybook-dist/_stories-src/RBDialog/RBAlert.stories.tsx +51 -51
- package/cli/storybook-dist/_stories-src/RBDialog/RBConfirm.stories.tsx +55 -55
- package/cli/storybook-dist/_stories-src/RBDialog/RBPrompt.stories.tsx +52 -52
- package/cli/storybook-dist/_stories-src/RBDivider/RBDivider.stories.tsx +93 -93
- package/cli/storybook-dist/_stories-src/RBEmptyView/RBEmptyView.stories.tsx +49 -49
- package/cli/storybook-dist/_stories-src/RBIcons/RBColorIcons.stories.tsx +108 -108
- package/cli/storybook-dist/_stories-src/RBIcons/RBIcons.stories.tsx +106 -106
- package/cli/storybook-dist/_stories-src/RBInput/RBCheckBox.stories.tsx +89 -89
- package/cli/storybook-dist/_stories-src/RBInput/RBMultiRangeInput.stories.tsx +64 -64
- package/cli/storybook-dist/_stories-src/RBInput/RBRadioBox.stories.tsx +65 -65
- package/cli/storybook-dist/_stories-src/RBInput/RBRadioButton.stories.tsx +68 -68
- package/cli/storybook-dist/_stories-src/RBInput/RBSelectBox.stories.tsx +216 -216
- package/cli/storybook-dist/_stories-src/RBInput/RBSideNumberInput.stories.tsx +90 -90
- package/cli/storybook-dist/_stories-src/RBInput/RBText/RBTextArea.stories.tsx +45 -45
- package/cli/storybook-dist/_stories-src/RBInput/RBText/RBTextInput.stories.tsx +50 -50
- package/cli/storybook-dist/_stories-src/RBInput/RBTextField.stories.tsx +102 -102
- package/cli/storybook-dist/_stories-src/RBJoyStick/RBJoyStick.stories.tsx +31 -31
- package/cli/storybook-dist/_stories-src/RBLight/RBLight.stories.tsx +36 -36
- package/cli/storybook-dist/_stories-src/RBPagination/RBPagination.stories.tsx +49 -49
- package/cli/storybook-dist/_stories-src/RBShadcn/RBCard/RBCard.stories.tsx +89 -89
- package/cli/storybook-dist/_stories-src/RBShadcn/RBCommand/RBCommand.stories.tsx +116 -116
- package/cli/storybook-dist/_stories-src/RBShadcn/RBDialog/RBDialog.stories.tsx +74 -74
- package/cli/storybook-dist/_stories-src/RBShadcn/RBDrawer/RBDrawer.stories.tsx +99 -99
- package/cli/storybook-dist/_stories-src/RBShadcn/RBDropdownMenu/RBDropdownMenu.stories.tsx +123 -123
- package/cli/storybook-dist/_stories-src/RBShadcn/RBMenubar/RBMenubar.stories.tsx +135 -135
- package/cli/storybook-dist/_stories-src/RBShadcn/RBPopover/RBPopover.stories.tsx +69 -69
- package/cli/storybook-dist/_stories-src/RBShadcn/RBResizable/RBResizable.stories.tsx +49 -49
- package/cli/storybook-dist/_stories-src/RBShadcn/RBSheet/RBSheet.stories.tsx +91 -91
- package/cli/storybook-dist/_stories-src/RBShadcn/RBSlider/RBSlider.stories.tsx +38 -38
- package/cli/storybook-dist/_stories-src/RBShadcn/RBSwitch/RBSwitch.stories.tsx +112 -112
- package/cli/storybook-dist/_stories-src/RBShadcn/RBTabs/RBTabs.stories.tsx +75 -75
- package/cli/storybook-dist/_stories-src/RBShadcn/RBToggle/RBToggle.stories.tsx +51 -51
- package/cli/storybook-dist/_stories-src/RBShadcn/RBToggleGroup/RBToggleGroup.stories.tsx +84 -84
- package/cli/storybook-dist/_stories-src/RBTab/RBChipTab.stories.tsx +102 -102
- package/cli/storybook-dist/_stories-src/RBTab/RBChipsBoxTab.stories.tsx +78 -78
- package/cli/storybook-dist/_stories-src/RBTab/RBTab.stories.tsx +57 -57
- package/cli/storybook-dist/_stories-src/RBTable/RBTable.stories.tsx +177 -177
- package/cli/storybook-dist/_stories-src/RBTable/RBTableRow.stories.tsx +64 -64
- package/cli/storybook-dist/_stories-src/RBToast/RBToast.stories.tsx +117 -117
- package/cli/storybook-dist/_stories-src/RBTooltip/RBTooltip.stories.tsx +50 -50
- package/cli/storybook-dist/_stories-src/loading/RBSpinner.stories.tsx +30 -30
- package/cli/storybook-dist/_stories-src/nx-button/NxButton.stories.tsx +54 -54
- package/cli/storybook-dist/_stories-src/nx-button/NxPointerHoldButton.stories.tsx +57 -57
- package/cli/storybook-dist/_stories-src/nx-icons/NxIcons.stories.tsx +48 -48
- package/cli/storybook-dist/_stories-src/nx-inputs/NxNumberInput.stories.tsx +103 -103
- package/cli/storybook-dist/_stories-src/nx-inputs/NxRangeInput.stories.tsx +27 -27
- package/cli/storybook-dist/_stories-src/nx-inputs/NxSelectBox.stories.tsx +67 -67
- package/cli/storybook-dist/_stories-src/nx-inputs/NxSlideRange.stories.tsx +45 -45
- package/cli/storybook-dist/_stories-src/nx-inputs/NxSwitch.stories.tsx +27 -27
- package/cli/storybook-dist/_stories-src/nx-inputs/NxTextArea.stories.tsx +48 -48
- package/cli/storybook-dist/_stories-src/nx-inputs/NxTextInput.stories.tsx +46 -46
- package/cli/storybook-dist/assets/{Color-YHDXOIA2-D6JqZzDJ.js → Color-YHDXOIA2-B4IER17l.js} +1 -1
- package/cli/storybook-dist/assets/{Docs-ESb7JAHg.js → Docs-C8GCHFtK.js} +3 -3
- package/cli/storybook-dist/assets/{Docs-6gD2kUo1.js → Docs-CgdEMPQP.js} +2 -2
- package/cli/storybook-dist/assets/{Docs-B9wd8Ok7.js → Docs-Ck3WHvk6.js} +3 -3
- package/cli/storybook-dist/assets/{Docs-CgFbWWXM.js → Docs-D9NHsoeZ.js} +2 -2
- package/cli/storybook-dist/assets/{Docs-DBQup8Bu.js → Docs-DNYQC7nl.js} +3 -3
- package/cli/storybook-dist/assets/{Docs-CMjovnSY.js → Docs-DUfeiM4I.js} +4 -4
- package/cli/storybook-dist/assets/{DocsRenderer-CFRXHY34-BOUI1AHi.js → DocsRenderer-CFRXHY34-C0WhyDoR.js} +1 -1
- package/cli/storybook-dist/assets/{NxAvatar.stories-DsYFMUh3.js → NxAvatar.stories-CwnK8AUF.js} +1 -1
- package/cli/storybook-dist/assets/{NxButton.stories-CHfNcqsc.js → NxButton.stories-ueYdosfQ.js} +8 -8
- package/cli/storybook-dist/assets/{NxNumberInput.stories-BFw_4vFE.js → NxNumberInput.stories-M5ZCLbrK.js} +1 -1
- package/cli/storybook-dist/assets/{NxPagination.stories-DVfxyw4M.js → NxPagination.stories-bxxUnHEL.js} +1 -1
- package/cli/storybook-dist/assets/{NxPointerHoldButton.stories-BzyxUWoZ.js → NxPointerHoldButton.stories-BHxB2kr5.js} +1 -1
- package/cli/storybook-dist/assets/{NxRangeInput.stories-DmRdzBc1.js → NxRangeInput.stories-BKfr-fp4.js} +6 -6
- package/cli/storybook-dist/assets/{NxSelectBox.stories-B1KkNUOf.js → NxSelectBox.stories-CG8FuTBq.js} +1 -1
- package/cli/storybook-dist/assets/{NxSlideRange.stories-CyOdvfQ6.js → NxSlideRange.stories-BRTFtMTL.js} +1 -1
- package/cli/storybook-dist/assets/{NxSwitch.stories-DrDBw0qp.js → NxSwitch.stories-Bwuyzn-R.js} +1 -1
- package/cli/storybook-dist/assets/{NxTextArea.stories-DTB2aqNS.js → NxTextArea.stories-COq2sGqu.js} +1 -1
- package/cli/storybook-dist/assets/{NxTextInput.stories-DU0rucmM.js → NxTextInput.stories-CjsBLz05.js} +1 -1
- package/cli/storybook-dist/assets/{RBAccordion.stories-DTfOtXtp.js → RBAccordion.stories-BARwuZ0Q.js} +3 -3
- package/cli/storybook-dist/assets/{RBAccordionGroup.stories-9y9BjrUe.js → RBAccordionGroup.stories-COrPxETW.js} +10 -10
- package/cli/storybook-dist/assets/{RBAlert.stories-DLTAv9fT.js → RBAlert.stories-BQrkjZPt.js} +3 -3
- package/cli/storybook-dist/assets/{RBBadge.stories-BNMACewA.js → RBBadge.stories-BTsLL-lK.js} +1 -1
- package/cli/storybook-dist/assets/{RBBattery.stories-B3kXMAt5.js → RBBattery.stories-DAeQdJbc.js} +1 -1
- package/cli/storybook-dist/assets/{RBCard.stories-Y-s8R2n7.js → RBCard.stories-HyhOE80R.js} +39 -39
- package/cli/storybook-dist/assets/{RBCheckBox.stories-DBuT9tL4.js → RBCheckBox.stories-KFk0WqX_.js} +1 -1
- package/cli/storybook-dist/assets/{RBCheckIconButton.stories-CWu1TL56.js → RBCheckIconButton.stories-CXbbktF5.js} +1 -1
- package/cli/storybook-dist/assets/{RBCheckLabelButton.stories-sCu2MGCX.js → RBCheckLabelButton.stories-DWfYz_9Z.js} +17 -17
- package/cli/storybook-dist/assets/{RBChipTab.stories-BX9qLJkR.js → RBChipTab.stories-JPEgVFAS.js} +5 -5
- package/cli/storybook-dist/assets/{RBChipsBoxTab.stories-35u1aJ-P.js → RBChipsBoxTab.stories-CTPuWXrQ.js} +1 -1
- package/cli/storybook-dist/assets/{RBColorIcons.stories-DAOZ5Ies.js → RBColorIcons.stories-DiFRZ5jk.js} +1 -1
- package/cli/storybook-dist/assets/RBCommand.stories-Pf1HAVIR.js +73 -0
- package/cli/storybook-dist/assets/{RBConfirm.stories-iMXcUh7Z.js → RBConfirm.stories-D1cEPUXk.js} +3 -3
- package/cli/storybook-dist/assets/{RBDateInput.stories-hK5rXECf.js → RBDateInput.stories-RPYpCjig.js} +1 -1
- package/cli/storybook-dist/assets/RBDialog.stories-DJH-0XSR.js +38 -0
- package/cli/storybook-dist/assets/{RBDivider.stories-BAK-iZ1Z.js → RBDivider.stories-uEj1vOgK.js} +1 -1
- package/cli/storybook-dist/assets/{RBDrawer.stories-B2nqf2Nh.js → RBDrawer.stories-BiMzElb2.js} +12 -12
- package/cli/storybook-dist/assets/RBDropdownMenu.stories-Da_TBkla.js +86 -0
- package/cli/storybook-dist/assets/{RBEmptyView.stories-nCenrgBh.js → RBEmptyView.stories-BHeKGfPS.js} +1 -1
- package/cli/storybook-dist/assets/{RBIconButton.stories-DRH7O3sp.js → RBIconButton.stories-NEsRFoYp.js} +1 -1
- package/cli/storybook-dist/assets/{RBIcons.stories-D3PyJXG8.js → RBIcons.stories-CcZ-TTLS.js} +1 -1
- package/cli/storybook-dist/assets/{RBInlineLabelButton.stories-modQbt10.js → RBInlineLabelButton.stories-B0wpdQyR.js} +1 -1
- package/cli/storybook-dist/assets/{RBJoyStick.stories-BY14qVgR.js → RBJoyStick.stories-DEgBou3K.js} +1 -1
- package/cli/storybook-dist/assets/{RBLabelButton.stories-DzF7vGwm.js → RBLabelButton.stories-DT8drIsF.js} +1 -1
- package/cli/storybook-dist/assets/{RBLight.stories-lF4FRmVh.js → RBLight.stories-Dh-aoeyG.js} +1 -1
- package/cli/storybook-dist/assets/{RBMenubar.stories-XhrI7bsV.js → RBMenubar.stories-D-H7UqVh.js} +1 -1
- package/cli/storybook-dist/assets/{RBMultiRangeInput.stories-DprllQDl.js → RBMultiRangeInput.stories-hlclv6jI.js} +1 -1
- package/cli/storybook-dist/assets/{RBPagination.stories-2v2gBJfC.js → RBPagination.stories-DWCeoZ_S.js} +1 -1
- package/cli/storybook-dist/assets/{RBPopover.stories-C8iLIZpv.js → RBPopover.stories-C514M09_.js} +1 -1
- package/cli/storybook-dist/assets/{RBPrompt.stories-Th_HrWHI.js → RBPrompt.stories-BSItvfiT.js} +1 -1
- package/cli/storybook-dist/assets/{RBRadioBox.stories-CoHuLaN3.js → RBRadioBox.stories-BBb4YbFU.js} +1 -1
- package/cli/storybook-dist/assets/{RBRadioButton.stories-DULxE_ff.js → RBRadioButton.stories-CXyOGJCv.js} +1 -1
- package/cli/storybook-dist/assets/{RBRangeDateInput.stories-D8A9KBSS.js → RBRangeDateInput.stories-qvhubu0e.js} +1 -1
- package/cli/storybook-dist/assets/{RBResizable.stories-C41QfrQ3.js → RBResizable.stories-CZKeyGjH.js} +14 -14
- package/cli/storybook-dist/assets/{RBSelectBox.stories-C1gNmwzw.js → RBSelectBox.stories-CRKP3ybf.js} +1 -1
- package/cli/storybook-dist/assets/RBSheet.stories-sCM3ZJUa.js +39 -0
- package/cli/storybook-dist/assets/{RBSideNumberInput.stories-9LlgQ8nh.js → RBSideNumberInput.stories-Bb7gw8RF.js} +3 -3
- package/cli/storybook-dist/assets/{RBSlider.stories-oUgo5K9d.js → RBSlider.stories-23OAQU5z.js} +3 -3
- package/cli/storybook-dist/assets/{RBSpinner.stories-DDpohbY2.js → RBSpinner.stories-2xcQdcmt.js} +1 -1
- package/cli/storybook-dist/assets/{RBSwitch.stories-gW-GN7QO.js → RBSwitch.stories-BACUaJm_.js} +7 -7
- package/cli/storybook-dist/assets/{RBTab.stories-CN-PV3HH.js → RBTab.stories-CDHE3sVs.js} +1 -1
- package/cli/storybook-dist/assets/{RBTable.stories-BAZLpxtM.js → RBTable.stories-C0Cfhfl7.js} +29 -29
- package/cli/storybook-dist/assets/{RBTableRow.stories-CwjVrszB.js → RBTableRow.stories-BF8kIkpp.js} +1 -1
- package/cli/storybook-dist/assets/{RBTabs.stories-JuEo2sUL.js → RBTabs.stories-BdJWRq1o.js} +7 -7
- package/cli/storybook-dist/assets/{RBTextArea.stories-D0_Pv4qZ.js → RBTextArea.stories-CGy2xeYH.js} +3 -3
- package/cli/storybook-dist/assets/{RBTextField.stories-CCsOvZqV.js → RBTextField.stories-IfUOzxCM.js} +15 -15
- package/cli/storybook-dist/assets/{RBTextInput.stories-Cccn3VNm.js → RBTextInput.stories-VjXNFo4R.js} +3 -3
- package/cli/storybook-dist/assets/{RBToast.stories-I5617t0K.js → RBToast.stories-BzcobblV.js} +1 -1
- package/cli/storybook-dist/assets/{RBToggle.stories-DsgKjGsJ.js → RBToggle.stories-DuLE5mKv.js} +4 -4
- package/cli/storybook-dist/assets/{RBToggleGroup.stories-BZEzSDuz.js → RBToggleGroup.stories-CuR0N0GJ.js} +5 -5
- package/cli/storybook-dist/assets/{RBTooltip.stories-4oSyAWsA.js → RBTooltip.stories--aAgNC8_.js} +1 -1
- package/cli/storybook-dist/assets/{SideNumberInput-DSKbd0bG.js → SideNumberInput-DyWQxYUj.js} +743 -743
- package/cli/storybook-dist/assets/{entry-preview-B35XREGs.js → entry-preview-D7IHsza_.js} +1 -1
- package/cli/storybook-dist/assets/{iframe-BB797lmL.js → iframe-CbaIp5I-.js} +2 -2
- package/cli/storybook-dist/assets/{index-BU2567EP.js → index-C6CBgMuG.js} +3 -3
- package/cli/storybook-dist/assets/{preview-C7DaSWyc.js → preview-B-iYLDuW.js} +2 -2
- package/cli/storybook-dist/assets/{preview-CbuRHit4.js → preview-CRWqc9DH.js} +1 -1
- package/cli/storybook-dist/assets/{react-resizable-panels.browser-ChIvlwo7.js → react-resizable-panels.browser-8hC8dr-6.js} +8 -8
- package/cli/storybook-dist/iframe.html +2 -2
- package/cli/storybook-dist/index.html +1 -1
- package/cli/storybook-dist/project.json +1 -1
- package/cli/templates/common/.mcp.json +8 -8
- package/cli/templates/common/README.md +1231 -1231
- package/cli/templates/common/assets/icon.svg +45 -45
- package/cli/templates/common/manifest.json +26 -26
- package/cli/templates/common/package.json +22 -22
- package/cli/templates/common/py/main.py +125 -125
- package/cli/templates/common/tsconfig.json +13 -13
- package/cli/templates/common/ui/content.tsx +216 -216
- package/cli/templates/common/ui/style.css +6 -6
- package/cli/templates/common/vite.config.ts +10 -10
- package/cli/templates/cpp/cpp/main.cpp +73 -73
- package/cli/templates/ros2/ros2_ws/src/__PLUGIN_SLUG__/__PLUGIN_SLUG__/node.py +25 -25
- package/cli/templates/ros2/ros2_ws/src/__PLUGIN_SLUG__/package.xml +10 -10
- package/cli/templates/ros2/ros2_ws/src/__PLUGIN_SLUG__/setup.py +18 -18
- package/cli/templates/ros2-cpp/ros2_ws/src/__PLUGIN_SLUG__/package.xml +11 -11
- package/cli/templates/ros2-cpp/ros2_ws/src/__PLUGIN_SLUG__/src/node.cpp +23 -23
- package/cli/vite.d.mts +25 -25
- package/cli/vite.mjs +292 -292
- package/package.json +3 -3
- package/cli/storybook-dist/assets/RBCommand.stories-BSqXDkKw.js +0 -73
- package/cli/storybook-dist/assets/RBDialog.stories-BAktz-ku.js +0 -38
- package/cli/storybook-dist/assets/RBDropdownMenu.stories-DbW2fWAj.js +0 -86
- package/cli/storybook-dist/assets/RBSheet.stories-_6VH-RUm.js +0 -39
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
<svg width="256" height="256" viewBox="0 0 256 256" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
-
<defs>
|
|
3
|
-
<linearGradient id="bg" x1="36" y1="28" x2="220" y2="228" gradientUnits="userSpaceOnUse">
|
|
4
|
-
<stop stop-color="#8B5CF6"/>
|
|
5
|
-
<stop offset="1" stop-color="#5B21B6"/>
|
|
6
|
-
</linearGradient>
|
|
7
|
-
<linearGradient id="grape" x1="92" y1="74" x2="168" y2="178" gradientUnits="userSpaceOnUse">
|
|
8
|
-
<stop stop-color="#D8B4FE"/>
|
|
9
|
-
<stop offset="1" stop-color="#A855F7"/>
|
|
10
|
-
</linearGradient>
|
|
11
|
-
</defs>
|
|
12
|
-
|
|
13
|
-
<rect x="16" y="16" width="224" height="224" rx="52" fill="url(#bg)"/>
|
|
14
|
-
|
|
15
|
-
<!-- plugin brackets -->
|
|
16
|
-
<path d="M72 84H56C47.1634 84 40 91.1634 40 100V116" stroke="white" stroke-width="12" stroke-linecap="round"/>
|
|
17
|
-
<path d="M184 84H200C208.837 84 216 91.1634 216 100V116" stroke="white" stroke-width="12" stroke-linecap="round"/>
|
|
18
|
-
<path d="M72 172H56C47.1634 172 40 164.837 40 156V140" stroke="white" stroke-width="12" stroke-linecap="round"/>
|
|
19
|
-
<path d="M184 172H200C208.837 172 216 164.837 216 156V140" stroke="white" stroke-width="12" stroke-linecap="round"/>
|
|
20
|
-
|
|
21
|
-
<!-- grape stem + leaf -->
|
|
22
|
-
<path d="M128 73C128 59 137 48 151 44" stroke="#F3E8FF" stroke-width="10" stroke-linecap="round"/>
|
|
23
|
-
<path d="M142 51C151 39 169 39 179 50C165 60 151 62 142 51Z" fill="#C4B5FD"/>
|
|
24
|
-
|
|
25
|
-
<!-- muscat grape cluster -->
|
|
26
|
-
<circle cx="106" cy="91" r="18" fill="url(#grape)"/>
|
|
27
|
-
<circle cx="132" cy="88" r="18" fill="url(#grape)"/>
|
|
28
|
-
<circle cx="158" cy="91" r="18" fill="url(#grape)"/>
|
|
29
|
-
<circle cx="94" cy="119" r="18" fill="url(#grape)"/>
|
|
30
|
-
<circle cx="120" cy="116" r="18" fill="url(#grape)"/>
|
|
31
|
-
<circle cx="146" cy="116" r="18" fill="url(#grape)"/>
|
|
32
|
-
<circle cx="172" cy="119" r="18" fill="url(#grape)"/>
|
|
33
|
-
<circle cx="107" cy="145" r="18" fill="url(#grape)"/>
|
|
34
|
-
<circle cx="133" cy="144" r="18" fill="url(#grape)"/>
|
|
35
|
-
<circle cx="159" cy="145" r="18" fill="url(#grape)"/>
|
|
36
|
-
<circle cx="120" cy="170" r="18" fill="url(#grape)"/>
|
|
37
|
-
<circle cx="146" cy="170" r="18" fill="url(#grape)"/>
|
|
38
|
-
<circle cx="133" cy="193" r="18" fill="url(#grape)"/>
|
|
39
|
-
|
|
40
|
-
<!-- center plugin glyph -->
|
|
41
|
-
<path d="M122 119V109C122 103.477 126.477 99 132 99H136C141.523 99 146 103.477 146 109V119" stroke="white" stroke-width="8" stroke-linecap="round"/>
|
|
42
|
-
<rect x="116" y="118" width="36" height="34" rx="10" fill="white"/>
|
|
43
|
-
<path d="M127 152V163" stroke="white" stroke-width="8" stroke-linecap="round"/>
|
|
44
|
-
<path d="M141 152V163" stroke="white" stroke-width="8" stroke-linecap="round"/>
|
|
45
|
-
</svg>
|
|
1
|
+
<svg width="256" height="256" viewBox="0 0 256 256" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bg" x1="36" y1="28" x2="220" y2="228" gradientUnits="userSpaceOnUse">
|
|
4
|
+
<stop stop-color="#8B5CF6"/>
|
|
5
|
+
<stop offset="1" stop-color="#5B21B6"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<linearGradient id="grape" x1="92" y1="74" x2="168" y2="178" gradientUnits="userSpaceOnUse">
|
|
8
|
+
<stop stop-color="#D8B4FE"/>
|
|
9
|
+
<stop offset="1" stop-color="#A855F7"/>
|
|
10
|
+
</linearGradient>
|
|
11
|
+
</defs>
|
|
12
|
+
|
|
13
|
+
<rect x="16" y="16" width="224" height="224" rx="52" fill="url(#bg)"/>
|
|
14
|
+
|
|
15
|
+
<!-- plugin brackets -->
|
|
16
|
+
<path d="M72 84H56C47.1634 84 40 91.1634 40 100V116" stroke="white" stroke-width="12" stroke-linecap="round"/>
|
|
17
|
+
<path d="M184 84H200C208.837 84 216 91.1634 216 100V116" stroke="white" stroke-width="12" stroke-linecap="round"/>
|
|
18
|
+
<path d="M72 172H56C47.1634 172 40 164.837 40 156V140" stroke="white" stroke-width="12" stroke-linecap="round"/>
|
|
19
|
+
<path d="M184 172H200C208.837 172 216 164.837 216 156V140" stroke="white" stroke-width="12" stroke-linecap="round"/>
|
|
20
|
+
|
|
21
|
+
<!-- grape stem + leaf -->
|
|
22
|
+
<path d="M128 73C128 59 137 48 151 44" stroke="#F3E8FF" stroke-width="10" stroke-linecap="round"/>
|
|
23
|
+
<path d="M142 51C151 39 169 39 179 50C165 60 151 62 142 51Z" fill="#C4B5FD"/>
|
|
24
|
+
|
|
25
|
+
<!-- muscat grape cluster -->
|
|
26
|
+
<circle cx="106" cy="91" r="18" fill="url(#grape)"/>
|
|
27
|
+
<circle cx="132" cy="88" r="18" fill="url(#grape)"/>
|
|
28
|
+
<circle cx="158" cy="91" r="18" fill="url(#grape)"/>
|
|
29
|
+
<circle cx="94" cy="119" r="18" fill="url(#grape)"/>
|
|
30
|
+
<circle cx="120" cy="116" r="18" fill="url(#grape)"/>
|
|
31
|
+
<circle cx="146" cy="116" r="18" fill="url(#grape)"/>
|
|
32
|
+
<circle cx="172" cy="119" r="18" fill="url(#grape)"/>
|
|
33
|
+
<circle cx="107" cy="145" r="18" fill="url(#grape)"/>
|
|
34
|
+
<circle cx="133" cy="144" r="18" fill="url(#grape)"/>
|
|
35
|
+
<circle cx="159" cy="145" r="18" fill="url(#grape)"/>
|
|
36
|
+
<circle cx="120" cy="170" r="18" fill="url(#grape)"/>
|
|
37
|
+
<circle cx="146" cy="170" r="18" fill="url(#grape)"/>
|
|
38
|
+
<circle cx="133" cy="193" r="18" fill="url(#grape)"/>
|
|
39
|
+
|
|
40
|
+
<!-- center plugin glyph -->
|
|
41
|
+
<path d="M122 119V109C122 103.477 126.477 99 132 99H136C141.523 99 146 103.477 146 109V119" stroke="white" stroke-width="8" stroke-linecap="round"/>
|
|
42
|
+
<rect x="116" y="118" width="36" height="34" rx="10" fill="white"/>
|
|
43
|
+
<path d="M127 152V163" stroke="white" stroke-width="8" stroke-linecap="round"/>
|
|
44
|
+
<path d="M141 152V163" stroke="white" stroke-width="8" stroke-linecap="round"/>
|
|
45
|
+
</svg>
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
{
|
|
2
|
-
"id": "__PLUGIN_ID__",
|
|
3
|
-
"name": "__PLUGIN_NAME__",
|
|
4
|
-
"version": "1.0.0",
|
|
5
|
-
"minMuscatVersion": "1.0.0",
|
|
6
|
-
"author": "__PLUGIN_AUTHOR__",
|
|
7
|
-
"email": "__PLUGIN_EMAIL__",
|
|
8
|
-
"description": {
|
|
9
|
-
"ko": "",
|
|
10
|
-
"en": ""
|
|
11
|
-
},
|
|
12
|
-
"icons": "assets/icon.svg",
|
|
13
|
-
"targetModels": "all",
|
|
14
|
-
"targetCategorys": "all",
|
|
15
|
-
"contributes": [
|
|
16
|
-
{
|
|
17
|
-
"point": "toolbar",
|
|
18
|
-
"icon": "assets/icon.svg",
|
|
19
|
-
"label": { "ko": "__PLUGIN_NAME__", "en": "__PLUGIN_NAME__" },
|
|
20
|
-
"ui": "content",
|
|
21
|
-
"opens": "popover"
|
|
22
|
-
}
|
|
23
|
-
],
|
|
24
|
-
"variables": [],
|
|
25
|
-
"runtime": { "type": "__RUNTIME_TYPE__", "entry": "main.py" }
|
|
26
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"id": "__PLUGIN_ID__",
|
|
3
|
+
"name": "__PLUGIN_NAME__",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"minMuscatVersion": "1.0.0",
|
|
6
|
+
"author": "__PLUGIN_AUTHOR__",
|
|
7
|
+
"email": "__PLUGIN_EMAIL__",
|
|
8
|
+
"description": {
|
|
9
|
+
"ko": "",
|
|
10
|
+
"en": ""
|
|
11
|
+
},
|
|
12
|
+
"icons": "assets/icon.svg",
|
|
13
|
+
"targetModels": "all",
|
|
14
|
+
"targetCategorys": "all",
|
|
15
|
+
"contributes": [
|
|
16
|
+
{
|
|
17
|
+
"point": "toolbar",
|
|
18
|
+
"icon": "assets/icon.svg",
|
|
19
|
+
"label": { "ko": "__PLUGIN_NAME__", "en": "__PLUGIN_NAME__" },
|
|
20
|
+
"ui": "content",
|
|
21
|
+
"opens": "popover"
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
"variables": [],
|
|
25
|
+
"runtime": { "type": "__RUNTIME_TYPE__", "entry": "main.py" }
|
|
26
|
+
}
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "__PLUGIN_ID__",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"private": true,
|
|
5
|
-
"type": "module",
|
|
6
|
-
"dependencies": {
|
|
7
|
-
"@rainbow-robotics/plugin-ui": "__RB_VERSION__"
|
|
8
|
-
},
|
|
9
|
-
"devDependencies": {
|
|
10
|
-
"@tailwindcss/vite": "^4.1.0",
|
|
11
|
-
"@rainbow-robotics/muscat-plugin-kit": "__RB_VERSION__",
|
|
12
|
-
"@rainbow-robotics/preview-host": "__RB_VERSION__",
|
|
13
|
-
"@types/react": "^19.0.10",
|
|
14
|
-
"@types/react-dom": "^19.0.4",
|
|
15
|
-
"@vitejs/plugin-react": "^4.0.0",
|
|
16
|
-
"react": "^19.0.0",
|
|
17
|
-
"react-dom": "^19.0.0",
|
|
18
|
-
"tailwindcss": "^4.1.0",
|
|
19
|
-
"typescript": "^5.8.0",
|
|
20
|
-
"vite": "^6.0.0"
|
|
21
|
-
}
|
|
22
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "__PLUGIN_ID__",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"dependencies": {
|
|
7
|
+
"@rainbow-robotics/plugin-ui": "__RB_VERSION__"
|
|
8
|
+
},
|
|
9
|
+
"devDependencies": {
|
|
10
|
+
"@tailwindcss/vite": "^4.1.0",
|
|
11
|
+
"@rainbow-robotics/muscat-plugin-kit": "__RB_VERSION__",
|
|
12
|
+
"@rainbow-robotics/preview-host": "__RB_VERSION__",
|
|
13
|
+
"@types/react": "^19.0.10",
|
|
14
|
+
"@types/react-dom": "^19.0.4",
|
|
15
|
+
"@vitejs/plugin-react": "^4.0.0",
|
|
16
|
+
"react": "^19.0.0",
|
|
17
|
+
"react-dom": "^19.0.0",
|
|
18
|
+
"tailwindcss": "^4.1.0",
|
|
19
|
+
"typescript": "^5.8.0",
|
|
20
|
+
"vite": "^6.0.0"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -1,125 +1,125 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Muscat plugin backend — __PLUGIN_NAME__
|
|
3
|
-
|
|
4
|
-
On-robot (default):
|
|
5
|
-
muscat-pk dev:back
|
|
6
|
-
python main.py
|
|
7
|
-
|
|
8
|
-
Remote dev (from your laptop):
|
|
9
|
-
Set env vars before running:
|
|
10
|
-
MUSCAT_ROBOT_HOST=192.168.1.100
|
|
11
|
-
MUSCAT_ROBOT_TOKEN=<service token>
|
|
12
|
-
Then: muscat-pk dev:back
|
|
13
|
-
|
|
14
|
-
Handlers:
|
|
15
|
-
plugin.serve / plugin.subscribe / plugin.publish -> plugin UI <-> backend only
|
|
16
|
-
plugin.router.on / subscribe / emit -> external endpoints
|
|
17
|
-
(REST / Socket.IO / TCP / MQTT / WebRTC at common/plugin/<plugin_id>/<path>).
|
|
18
|
-
Needs a robot running rainbow-rb-sdk >= 0.0.9.dev5; older robots have no
|
|
19
|
-
`plugin.router` (AttributeError). See README "External endpoints".
|
|
20
|
-
"""
|
|
21
|
-
|
|
22
|
-
import asyncio
|
|
23
|
-
import os
|
|
24
|
-
from typing import Any
|
|
25
|
-
|
|
26
|
-
from rainbow.rb_sdk import RBManipulateSDK, RBPluginCall
|
|
27
|
-
from rainbow.rb_sdk.rb_sdk_cpp import ConnectOptions
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
PLUGIN_NAME = "__PLUGIN_NAME__"
|
|
31
|
-
|
|
32
|
-
plugin = RBPluginCall()
|
|
33
|
-
manipulate = RBManipulateSDK()
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def register_handlers():
|
|
37
|
-
# Register handlers here — called after connect() so subscriptions survive
|
|
38
|
-
# session reconnection in remote-dev mode.
|
|
39
|
-
|
|
40
|
-
# --- Plugin UI <-> backend (not reachable from outside Muscat) ---
|
|
41
|
-
|
|
42
|
-
@plugin.subscribe("event")
|
|
43
|
-
def on_ui_event(payload: dict[str, Any] | None = None):
|
|
44
|
-
"""Handle messages published from the plugin UI with rb.pub("event", ...)."""
|
|
45
|
-
print(f"[{PLUGIN_NAME}] event:", payload)
|
|
46
|
-
|
|
47
|
-
@plugin.serve("grip")
|
|
48
|
-
def grip(payload: dict[str, Any] | None = None):
|
|
49
|
-
"""Handle the default UI button: rb.action("grip", { width })."""
|
|
50
|
-
width = (payload or {}).get("width", 20)
|
|
51
|
-
print(f"[{PLUGIN_NAME}] grip requested: width={width}")
|
|
52
|
-
plugin.publish("state", {"ready": True, "last_grip_width": width})
|
|
53
|
-
return {"ok": True, "width": width}
|
|
54
|
-
|
|
55
|
-
@plugin.serve("tool/echo")
|
|
56
|
-
def echo(payload: dict[str, Any] | None = None):
|
|
57
|
-
"""Small query example callable from the UI with rb.action("tool/echo", ...)."""
|
|
58
|
-
return {"echo": payload, "plugin": PLUGIN_NAME}
|
|
59
|
-
|
|
60
|
-
# --- External endpoints (REST / Socket.IO / TCP / MQTT / WebRTC) ---
|
|
61
|
-
# Exposed as common/plugin/<plugin_id>/hello, e.g.
|
|
62
|
-
# curl -X POST http://<robot>/common/plugin/<plugin_id>/hello \
|
|
63
|
-
# -H 'Content-Type: application/json' -d '{"name": "kim"}'
|
|
64
|
-
# Restrict transports with explicit_routes=["api"] (REST only), etc.
|
|
65
|
-
# Raise PluginRouteError(403, "msg") to set the response status.
|
|
66
|
-
|
|
67
|
-
@plugin.router.on("/hello")
|
|
68
|
-
def hello(payload: dict[str, Any] | None = None, meta: dict[str, Any] | None = None):
|
|
69
|
-
"""meta = {"transport": "api"|"socket"|"tcp"|"mqtt"|"webrtc", "principal": dict | None}."""
|
|
70
|
-
name = (payload or {}).get("name", "there")
|
|
71
|
-
return {"msg": f"hi {name}", "via": (meta or {}).get("transport")}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
def move_j_example():
|
|
75
|
-
"""
|
|
76
|
-
Example: use other robot SDKs from the same backend.
|
|
77
|
-
|
|
78
|
-
This function is not called automatically. Add safety checks and call it
|
|
79
|
-
from your own handler when the robot is ready.
|
|
80
|
-
"""
|
|
81
|
-
return manipulate.move.call_move_j(
|
|
82
|
-
robot_model="C500920",
|
|
83
|
-
target={
|
|
84
|
-
"tar_values": [0, 0, 0, 0, 0, 0],
|
|
85
|
-
"tar_frame": 0,
|
|
86
|
-
"tar_unit": 0,
|
|
87
|
-
},
|
|
88
|
-
)
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
async def main():
|
|
92
|
-
robot_host = os.getenv("MUSCAT_ROBOT_HOST")
|
|
93
|
-
robot_token = os.getenv("MUSCAT_ROBOT_TOKEN")
|
|
94
|
-
|
|
95
|
-
if robot_host and robot_token:
|
|
96
|
-
# Remote dev: connect to the robot before registering any handlers.
|
|
97
|
-
# connect() closes and reopens the Zenoh session, so handlers registered
|
|
98
|
-
# before this call would be lost.
|
|
99
|
-
opts = ConnectOptions()
|
|
100
|
-
opts.token = robot_token
|
|
101
|
-
opts.host = robot_host
|
|
102
|
-
manipulate.connect(opts)
|
|
103
|
-
|
|
104
|
-
register_handlers()
|
|
105
|
-
|
|
106
|
-
plugin.publish("state", {"ready": True, "plugin": PLUGIN_NAME}) # -> plugin UI
|
|
107
|
-
plugin.router.emit("/state", {"ready": True, "plugin": PLUGIN_NAME}) # -> external subscribers of common/plugin/<plugin_id>/state
|
|
108
|
-
print(f"[{PLUGIN_NAME}] backend ready")
|
|
109
|
-
|
|
110
|
-
try:
|
|
111
|
-
while True:
|
|
112
|
-
await asyncio.sleep(1)
|
|
113
|
-
except (KeyboardInterrupt, asyncio.CancelledError):
|
|
114
|
-
pass
|
|
115
|
-
finally:
|
|
116
|
-
if robot_host and robot_token:
|
|
117
|
-
await manipulate.disconnect()
|
|
118
|
-
print(f"[{PLUGIN_NAME}] stopped")
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
if __name__ == "__main__":
|
|
122
|
-
try:
|
|
123
|
-
asyncio.run(main())
|
|
124
|
-
except KeyboardInterrupt:
|
|
125
|
-
pass
|
|
1
|
+
"""
|
|
2
|
+
Muscat plugin backend — __PLUGIN_NAME__
|
|
3
|
+
|
|
4
|
+
On-robot (default):
|
|
5
|
+
muscat-pk dev:back
|
|
6
|
+
python main.py
|
|
7
|
+
|
|
8
|
+
Remote dev (from your laptop):
|
|
9
|
+
Set env vars before running:
|
|
10
|
+
MUSCAT_ROBOT_HOST=192.168.1.100
|
|
11
|
+
MUSCAT_ROBOT_TOKEN=<service token>
|
|
12
|
+
Then: muscat-pk dev:back
|
|
13
|
+
|
|
14
|
+
Handlers:
|
|
15
|
+
plugin.serve / plugin.subscribe / plugin.publish -> plugin UI <-> backend only
|
|
16
|
+
plugin.router.on / subscribe / emit -> external endpoints
|
|
17
|
+
(REST / Socket.IO / TCP / MQTT / WebRTC at common/plugin/<plugin_id>/<path>).
|
|
18
|
+
Needs a robot running rainbow-rb-sdk >= 0.0.9.dev5; older robots have no
|
|
19
|
+
`plugin.router` (AttributeError). See README "External endpoints".
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
import asyncio
|
|
23
|
+
import os
|
|
24
|
+
from typing import Any
|
|
25
|
+
|
|
26
|
+
from rainbow.rb_sdk import RBManipulateSDK, RBPluginCall
|
|
27
|
+
from rainbow.rb_sdk.rb_sdk_cpp import ConnectOptions
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
PLUGIN_NAME = "__PLUGIN_NAME__"
|
|
31
|
+
|
|
32
|
+
plugin = RBPluginCall()
|
|
33
|
+
manipulate = RBManipulateSDK()
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def register_handlers():
|
|
37
|
+
# Register handlers here — called after connect() so subscriptions survive
|
|
38
|
+
# session reconnection in remote-dev mode.
|
|
39
|
+
|
|
40
|
+
# --- Plugin UI <-> backend (not reachable from outside Muscat) ---
|
|
41
|
+
|
|
42
|
+
@plugin.subscribe("event")
|
|
43
|
+
def on_ui_event(payload: dict[str, Any] | None = None):
|
|
44
|
+
"""Handle messages published from the plugin UI with rb.pub("event", ...)."""
|
|
45
|
+
print(f"[{PLUGIN_NAME}] event:", payload)
|
|
46
|
+
|
|
47
|
+
@plugin.serve("grip")
|
|
48
|
+
def grip(payload: dict[str, Any] | None = None):
|
|
49
|
+
"""Handle the default UI button: rb.action("grip", { width })."""
|
|
50
|
+
width = (payload or {}).get("width", 20)
|
|
51
|
+
print(f"[{PLUGIN_NAME}] grip requested: width={width}")
|
|
52
|
+
plugin.publish("state", {"ready": True, "last_grip_width": width})
|
|
53
|
+
return {"ok": True, "width": width}
|
|
54
|
+
|
|
55
|
+
@plugin.serve("tool/echo")
|
|
56
|
+
def echo(payload: dict[str, Any] | None = None):
|
|
57
|
+
"""Small query example callable from the UI with rb.action("tool/echo", ...)."""
|
|
58
|
+
return {"echo": payload, "plugin": PLUGIN_NAME}
|
|
59
|
+
|
|
60
|
+
# --- External endpoints (REST / Socket.IO / TCP / MQTT / WebRTC) ---
|
|
61
|
+
# Exposed as common/plugin/<plugin_id>/hello, e.g.
|
|
62
|
+
# curl -X POST http://<robot>/common/plugin/<plugin_id>/hello \
|
|
63
|
+
# -H 'Content-Type: application/json' -d '{"name": "kim"}'
|
|
64
|
+
# Restrict transports with explicit_routes=["api"] (REST only), etc.
|
|
65
|
+
# Raise PluginRouteError(403, "msg") to set the response status.
|
|
66
|
+
|
|
67
|
+
@plugin.router.on("/hello")
|
|
68
|
+
def hello(payload: dict[str, Any] | None = None, meta: dict[str, Any] | None = None):
|
|
69
|
+
"""meta = {"transport": "api"|"socket"|"tcp"|"mqtt"|"webrtc", "principal": dict | None}."""
|
|
70
|
+
name = (payload or {}).get("name", "there")
|
|
71
|
+
return {"msg": f"hi {name}", "via": (meta or {}).get("transport")}
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def move_j_example():
|
|
75
|
+
"""
|
|
76
|
+
Example: use other robot SDKs from the same backend.
|
|
77
|
+
|
|
78
|
+
This function is not called automatically. Add safety checks and call it
|
|
79
|
+
from your own handler when the robot is ready.
|
|
80
|
+
"""
|
|
81
|
+
return manipulate.move.call_move_j(
|
|
82
|
+
robot_model="C500920",
|
|
83
|
+
target={
|
|
84
|
+
"tar_values": [0, 0, 0, 0, 0, 0],
|
|
85
|
+
"tar_frame": 0,
|
|
86
|
+
"tar_unit": 0,
|
|
87
|
+
},
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
async def main():
|
|
92
|
+
robot_host = os.getenv("MUSCAT_ROBOT_HOST")
|
|
93
|
+
robot_token = os.getenv("MUSCAT_ROBOT_TOKEN")
|
|
94
|
+
|
|
95
|
+
if robot_host and robot_token:
|
|
96
|
+
# Remote dev: connect to the robot before registering any handlers.
|
|
97
|
+
# connect() closes and reopens the Zenoh session, so handlers registered
|
|
98
|
+
# before this call would be lost.
|
|
99
|
+
opts = ConnectOptions()
|
|
100
|
+
opts.token = robot_token
|
|
101
|
+
opts.host = robot_host
|
|
102
|
+
manipulate.connect(opts)
|
|
103
|
+
|
|
104
|
+
register_handlers()
|
|
105
|
+
|
|
106
|
+
plugin.publish("state", {"ready": True, "plugin": PLUGIN_NAME}) # -> plugin UI
|
|
107
|
+
plugin.router.emit("/state", {"ready": True, "plugin": PLUGIN_NAME}) # -> external subscribers of common/plugin/<plugin_id>/state
|
|
108
|
+
print(f"[{PLUGIN_NAME}] backend ready")
|
|
109
|
+
|
|
110
|
+
try:
|
|
111
|
+
while True:
|
|
112
|
+
await asyncio.sleep(1)
|
|
113
|
+
except (KeyboardInterrupt, asyncio.CancelledError):
|
|
114
|
+
pass
|
|
115
|
+
finally:
|
|
116
|
+
if robot_host and robot_token:
|
|
117
|
+
await manipulate.disconnect()
|
|
118
|
+
print(f"[{PLUGIN_NAME}] stopped")
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
if __name__ == "__main__":
|
|
122
|
+
try:
|
|
123
|
+
asyncio.run(main())
|
|
124
|
+
except KeyboardInterrupt:
|
|
125
|
+
pass
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ESNext",
|
|
4
|
-
"module": "ESNext",
|
|
5
|
-
"moduleResolution": "bundler",
|
|
6
|
-
"jsx": "react-jsx",
|
|
7
|
-
"strict": true,
|
|
8
|
-
"skipLibCheck": true,
|
|
9
|
-
"noEmit": true,
|
|
10
|
-
"lib": ["DOM", "DOM.Iterable", "ESNext"]
|
|
11
|
-
},
|
|
12
|
-
"include": ["ui"]
|
|
13
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ESNext",
|
|
4
|
+
"module": "ESNext",
|
|
5
|
+
"moduleResolution": "bundler",
|
|
6
|
+
"jsx": "react-jsx",
|
|
7
|
+
"strict": true,
|
|
8
|
+
"skipLibCheck": true,
|
|
9
|
+
"noEmit": true,
|
|
10
|
+
"lib": ["DOM", "DOM.Iterable", "ESNext"]
|
|
11
|
+
},
|
|
12
|
+
"include": ["ui"]
|
|
13
|
+
}
|