roboapi 0.4.2__py3-none-any.whl

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.
Files changed (94) hide show
  1. roboapi/__init__.py +2 -0
  2. roboapi/calibration/__init__.py +6 -0
  3. roboapi/calibration/profile.py +139 -0
  4. roboapi/calibration/session.py +350 -0
  5. roboapi/cli.py +215 -0
  6. roboapi/config/__init__.py +22 -0
  7. roboapi/config/loader.py +119 -0
  8. roboapi/config/models.py +191 -0
  9. roboapi/embodiment.py +251 -0
  10. roboapi/errors.py +37 -0
  11. roboapi/geometry.py +337 -0
  12. roboapi/hardware/__init__.py +5 -0
  13. roboapi/hardware/base.py +113 -0
  14. roboapi/hardware/camera.py +167 -0
  15. roboapi/hardware/franka/__init__.py +5 -0
  16. roboapi/hardware/franka/arm.py +476 -0
  17. roboapi/hardware/franka/desk.py +555 -0
  18. roboapi/hardware/franka/feedback.py +196 -0
  19. roboapi/hardware/franka/guiding.py +104 -0
  20. roboapi/hardware/franka/ik.py +543 -0
  21. roboapi/hardware/franka/limits.py +110 -0
  22. roboapi/hardware/franka/settings.py +116 -0
  23. roboapi/hardware/robotiq.py +350 -0
  24. roboapi/hardware/ur/__init__.py +16 -0
  25. roboapi/hardware/ur/build.py +92 -0
  26. roboapi/hardware/ur/compliant.py +128 -0
  27. roboapi/hardware/ur/dashboard.py +103 -0
  28. roboapi/hardware/ur/feedback.py +159 -0
  29. roboapi/hardware/ur/ipc.py +206 -0
  30. roboapi/hardware/ur/native/CMakeLists.txt +37 -0
  31. roboapi/hardware/ur/native/dependencies.lock.json +13 -0
  32. roboapi/hardware/ur/native/include/ur_cpp/cartesian_speedl.hpp +170 -0
  33. roboapi/hardware/ur/native/include/ur_cpp/control_loop.hpp +126 -0
  34. roboapi/hardware/ur/native/include/ur_cpp/geom.hpp +72 -0
  35. roboapi/hardware/ur/native/include/ur_cpp/motion_primitives.hpp +350 -0
  36. roboapi/hardware/ur/native/include/ur_cpp/robot_io.hpp +26 -0
  37. roboapi/hardware/ur/native/include/ur_cpp/streaming_pose.hpp +369 -0
  38. roboapi/hardware/ur/native/src/control_loop.cpp +512 -0
  39. roboapi/hardware/ur/native/src/robot_io_urcl.cpp +143 -0
  40. roboapi/hardware/ur/native/tests/cartesian_speedl_unit.cpp +113 -0
  41. roboapi/hardware/ur/native/tests/control_modes_unit.cpp +137 -0
  42. roboapi/hardware/ur/native/tests/streaming_pose_unit.cpp +348 -0
  43. roboapi/hardware/ur/native/tests/velocity_governor_unit.cpp +65 -0
  44. roboapi/hardware/ur/native/worker.cpp +147 -0
  45. roboapi/hardware/ur/position.py +253 -0
  46. roboapi/hardware/ur/settings.py +95 -0
  47. roboapi/images.py +16 -0
  48. roboapi/initialize.py +137 -0
  49. roboapi/mcp.py +497 -0
  50. roboapi/motion.py +125 -0
  51. roboapi/naming.py +7 -0
  52. roboapi/operations.py +45 -0
  53. roboapi/policy/__init__.py +7 -0
  54. roboapi/policy/client.py +277 -0
  55. roboapi/policy/protocol.py +166 -0
  56. roboapi/policy/settings.py +79 -0
  57. roboapi/product-names.json +12 -0
  58. roboapi/records.py +149 -0
  59. roboapi/runtime.py +911 -0
  60. roboapi/semantics.py +6 -0
  61. roboapi/tasks.py +337 -0
  62. roboapi/web/__init__.py +5 -0
  63. roboapi/web/presets.py +44 -0
  64. roboapi/web/server.py +419 -0
  65. roboapi/web/static/assets/Bundler-LICENSE.txt +48 -0
  66. roboapi/web/static/assets/CalibrationScene-BO_spRoL.js +4220 -0
  67. roboapi/web/static/assets/Inter-OFL.txt +93 -0
  68. roboapi/web/static/assets/Inter-Variable-c8O0ljhh.ttf +0 -0
  69. roboapi/web/static/assets/Lucide-LICENSE.txt +43 -0
  70. roboapi/web/static/assets/Meshoptimizer-LICENSE.txt +23 -0
  71. roboapi/web/static/assets/MiSans-Regular-ES4DrbaF.woff2 +0 -0
  72. roboapi/web/static/assets/MiSans-Semibold-B34HIk9C.woff2 +0 -0
  73. roboapi/web/static/assets/PokeBrand-NOTICE.txt +20 -0
  74. roboapi/web/static/assets/React-LICENSE.txt +23 -0
  75. roboapi/web/static/assets/Three-LICENSE.txt +23 -0
  76. roboapi/web/static/assets/home-reference-CTpf8-oV.png +0 -0
  77. roboapi/web/static/assets/index-CGLhpUm0.js +28 -0
  78. roboapi/web/static/assets/index-QXqV-fDC.css +1 -0
  79. roboapi/web/static/assets/robotiq-ace-pro-2-EJuoOXTy.glb +0 -0
  80. roboapi/web/static/index.html +15 -0
  81. roboapi-0.4.2.dist-info/METADATA +205 -0
  82. roboapi-0.4.2.dist-info/RECORD +94 -0
  83. roboapi-0.4.2.dist-info/WHEEL +5 -0
  84. roboapi-0.4.2.dist-info/entry_points.txt +2 -0
  85. roboapi-0.4.2.dist-info/licenses/LICENSE +202 -0
  86. roboapi-0.4.2.dist-info/licenses/NOTICE +16 -0
  87. roboapi-0.4.2.dist-info/licenses/frontend/public/assets/Bundler-LICENSE.txt +48 -0
  88. roboapi-0.4.2.dist-info/licenses/frontend/public/assets/Inter-OFL.txt +93 -0
  89. roboapi-0.4.2.dist-info/licenses/frontend/public/assets/Lucide-LICENSE.txt +43 -0
  90. roboapi-0.4.2.dist-info/licenses/frontend/public/assets/Meshoptimizer-LICENSE.txt +23 -0
  91. roboapi-0.4.2.dist-info/licenses/frontend/public/assets/PokeBrand-NOTICE.txt +20 -0
  92. roboapi-0.4.2.dist-info/licenses/frontend/public/assets/React-LICENSE.txt +23 -0
  93. roboapi-0.4.2.dist-info/licenses/frontend/public/assets/Three-LICENSE.txt +23 -0
  94. roboapi-0.4.2.dist-info/top_level.txt +1 -0
@@ -0,0 +1 @@
1
+ .settings-dialog.calibration-dialog{color:#242526;background:#fafaf9;border:1px solid #ffffffb3;border-radius:28px;width:min(680px,100vw - 48px);max-width:none;height:min(734px,100dvh - 56px);max-height:none;overflow:hidden;box-shadow:0 24px 90px #25252d26,0 3px 12px #25252d0a}.settings-dialog.calibration-dialog[open]{flex-direction:column;display:flex}.settings-dialog.calibration-dialog::backdrop{-webkit-backdrop-filter:blur(7px);backdrop-filter:blur(7px);background:#24252b33}.settings-dialog.calibration-dialog .dialog-heading{flex-shrink:0;padding:16px 20px 4px 28px}.settings-dialog.calibration-dialog .dialog-heading h2{color:#77787c;letter-spacing:0;font-size:13px;font-weight:400}.settings-dialog.calibration-dialog .dialog-heading .icon-button{border:0;border-radius:50%;width:32px;height:32px;min-height:32px;margin:0;padding:0}.settings-dialog.calibration-dialog .dialog-heading svg{width:17px;height:17px}.settings-dialog.calibration-dialog .dialog-body{flex-direction:column;flex:1;min-height:0;padding:0;display:flex;overflow:auto}.calibration-guide{flex-direction:column;flex:1;min-height:0;display:flex}.calibration-copy{text-align:center;flex-shrink:0;min-height:130px;padding:14px 48px 0}.calibration-copy h2{letter-spacing:-.8px;outline:none;font-size:28px;line-height:1.4}.calibration-copy p{color:#696a6f;white-space:pre-line;text-wrap:pretty;max-width:500px;margin:12px auto 0;font-size:15px;line-height:1.75}.calibration-scene{flex:1;min-height:150px;margin:0 12px;position:relative;overflow:hidden}.calibration-three-scene,.calibration-scene-labels{position:absolute;inset:0}.calibration-three-scene canvas{touch-action:none;cursor:grab;width:100%;height:100%;display:block}.calibration-three-scene canvas:active{cursor:grabbing}.calibration-scene-labels{pointer-events:none}.calibration-scene-label{opacity:0;color:#80576a;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);white-space:nowrap;background:#fafaf9d9;border-radius:6px;padding:2px 6px;font-size:13px;font-weight:600;transition:opacity .3s;position:absolute;top:0;left:0}.calibration-scene-label.axis-z{color:#5f7f9d}.calibration-scene-status{color:#77787c;background:#fafaf9;justify-content:center;align-items:center;gap:9px;font-size:13px;display:flex;position:absolute;inset:0}.calibration-scene-status button{background:0 0;border-color:#e7e7e9;padding:6px 10px}.calibration-view-control{color:#7c7d82;background:#f2f2f2;border:0;border-radius:50%;width:36px;height:36px;min-height:36px;padding:0;position:absolute;bottom:6px}.calibration-view-control svg{width:17px;height:17px}.calibration-view-control.reset-view{left:16px}.calibration-view-control.replay-guide{right:16px}.calibration-home-views{justify-content:flex-end;gap:8px;width:56%;max-width:340px;display:flex;position:absolute;top:12px;right:12px}.calibration-home-views figure{background:#fafaf9;border:1px solid #e7e7e9;border-radius:10px;flex:0 166px;min-width:0;margin:0;position:relative;overflow:hidden}.calibration-home-views .is-live:after{content:"";background:#85c9a3;border-radius:50%;width:6px;height:6px;position:absolute;top:7px;right:7px;box-shadow:0 0 0 2px #173a2866}.calibration-home-views img{aspect-ratio:16/9;object-fit:contain;width:100%;display:block}.calibration-footer{flex-shrink:0;padding:16px 36px 20px}.calibration-feedback{overflow-wrap:anywhere;text-align:center;max-height:96px;margin:0 0 16px;font-size:13px;line-height:1.6;overflow:auto}.calibration-step-navigation{grid-template-columns:1fr auto 1fr;align-items:center;min-height:32px;margin-bottom:16px;display:grid}.calibration-back{color:#77787c;background:0 0;border:0;border-radius:6px;grid-area:1/1;justify-self:start;align-items:center;gap:6px;min-width:32px;height:32px;padding:0 6px 0 0;font-size:13px;display:inline-flex}.calibration-back svg{width:16px;height:16px}.calibration-progress{grid-area:1/2;justify-content:center;align-items:center;gap:6px;display:flex}.calibration-progress>span:not(.calibration-step-count){background:#e4e4e6;border-radius:4px;width:22px;height:4px}.calibration-progress>.complete{background:#d4b5c3!important}.calibration-progress>.current{background:#a97088!important}.calibration-step-count{color:#89898e;font-variant-numeric:tabular-nums;margin-left:8px;font-size:13px}.calibration-actions{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px;display:flex}.calibration-guiding{flex-shrink:0;align-items:center;gap:12px;display:flex}.calibration-guiding-label{color:#73747a;white-space:nowrap;align-items:center;gap:7px;font-size:13px;display:inline-flex}.calibration-guiding-label svg{width:16px;height:16px}.calibration-axis-segments{background:#efedef;border-radius:12px;gap:2px;padding:3px;display:flex}.calibration-axis-segments button{color:#79757a;background:0 0;border:0;border-radius:9px;width:32px;height:30px;min-height:30px;padding:0;font-size:13px}.calibration-axis-segments button[aria-pressed=true]{color:#8e5b70;background:#fff;font-weight:600;box-shadow:0 1px 4px #37233012}.calibration-record-actions{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:8px;margin-left:auto;display:flex}.calibration-record-actions button{border:0;border-radius:22px;justify-content:center;align-items:center;gap:8px;height:40px;min-height:40px;padding:0 14px;font-size:13px;display:inline-flex}.calibration-record-actions svg{width:16px;height:16px}.calibration-return{color:#68656b;background:#eeecee}.calibration-return:disabled{opacity:.55}.calibration-record-actions .calibration-primary{color:#fff;background:#252629}.calibration-record-actions .calibration-primary:hover:not(:disabled){background:#414246}.calibration-next-arrow{transform:rotate(180deg)}.calibration-spinning,.calibration-scene-status>svg{animation:1.4s linear infinite calibration-spin}@keyframes calibration-spin{to{transform:rotate(360deg)}}@media (width>=1200px){.settings-dialog.calibration-dialog{width:720px;height:min(780px,100dvh - 64px)}.calibration-copy{padding-top:20px}.calibration-copy h2{font-size:30px}}@media (width<=680px){.calibration-guiding{justify-content:space-between;width:100%}.calibration-copy{padding-inline:28px}.calibration-copy h2{font-size:26px}}@media (width<=520px){.settings-dialog.calibration-dialog{border:0;border-radius:0;width:100vw;height:100dvh;margin:0}.settings-dialog.calibration-dialog .dialog-heading{padding:calc(12px + env(safe-area-inset-top)) 18px 8px 24px}.calibration-copy{min-height:154px;padding:26px 26px 0}.calibration-copy h2{font-size:27px}.calibration-copy p{margin-top:14px;font-size:15px;line-height:1.8}.calibration-scene{margin:0 2px}.calibration-footer{padding:18px 24px calc(20px + env(safe-area-inset-bottom))}.calibration-step-navigation{margin-bottom:12px}.calibration-back span{display:none}.calibration-record-actions{width:100%}.calibration-record-actions .calibration-primary{flex:1;padding-inline:12px}.calibration-record-actions button{gap:6px;height:42px;min-height:42px;padding-inline:10px}.calibration-guiding-label{font-size:14px}.calibration-axis-segments button{width:42px;height:32px;min-height:32px}}@media (height<=650px){.calibration-guide{min-height:490px}.settings-dialog.calibration-dialog .dialog-heading{padding-top:8px}.calibration-copy{min-height:110px;padding-top:4px}.calibration-copy h2{font-size:24px}.calibration-copy p{margin-top:7px;font-size:14px}.calibration-scene{min-height:120px}.calibration-footer{padding-top:8px;padding-bottom:14px}.calibration-step-navigation{margin-bottom:4px}}@media (prefers-reduced-motion:reduce){.calibration-spinning,.calibration-scene-status>svg{animation:none}.calibration-scene-label{transition:none}}.direction-check-dialog .calibration-copy{min-height:76px}.direction-check-options{background:#efedef;border-radius:16px;gap:4px;max-width:360px;margin:0 auto;padding:4px;display:flex}.direction-check-options button{color:#77747a;background:0 0;border:0;border-radius:12px;flex:1;justify-content:center;align-items:center;gap:6px;height:36px;min-height:36px;padding:0 12px;font-size:14px;display:flex}.direction-check-options button[aria-pressed=true]{color:#80576a;background:#fff;box-shadow:0 1px 5px #37233012}.direction-check-actions{align-items:center;gap:12px;margin-top:20px;display:flex}.direction-check-recalibrate{color:#77787c;background:0 0;border:0;flex-shrink:0;padding:6px 0;font-size:13px}@media (width<=520px){.direction-check-actions,.direction-check-actions .calibration-record-actions{flex-wrap:wrap}.direction-check-actions .calibration-record-actions button{flex:1}.direction-check-recalibrate{order:1;margin:0 auto}}@font-face{font-family:PokeInter;src:url(/assets/Inter-Variable-c8O0ljhh.ttf)format("truetype");font-weight:100 900;font-display:swap}@font-face{font-family:PokeMiSans;src:url(/assets/MiSans-Regular-ES4DrbaF.woff2)format("woff2");font-weight:400;font-display:swap}@font-face{font-family:PokeMiSans;src:url(/assets/MiSans-Semibold-B34HIk9C.woff2)format("woff2");font-weight:500 800;font-display:swap}:root{color:#111;font-synthesis:none;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--muted:#65666b;--line:#d7e2f0;--raised:#f3f5f9;--pink:#f7c9d7;--green:#39765e;--error:#a74a4a;--glass:#ffffffa8;--ink:#111;background:#fcfdfd;font-family:PokeInter,PokeMiSans,Arial,sans-serif;font-size:14px;line-height:1.5}*{box-sizing:border-box}body{min-width:320px;margin:0}h1,h2,h3,p{margin:0}h1,h2,h3,strong{font-weight:600}button,input,textarea{font:inherit;color:inherit}button,a,input,textarea{transition:background-color .16s,border-color .16s,box-shadow .16s}button,.button{border:1px solid var(--line);color:#111;cursor:pointer;white-space:nowrap;background:#fff;border-radius:9px;justify-content:center;align-items:center;gap:8px;min-height:36px;padding:7px 12px;font-size:13px;line-height:1.4;text-decoration:none;display:inline-flex}button:hover:not(:disabled),.button:hover{background:#f2f2f3}button:disabled{opacity:.4;cursor:not-allowed}button.primary,.button.primary{color:#fff;background:#111;border-color:#111}button.primary:hover:not(:disabled),.button.primary:hover{background:#303034;border-color:#303034}button:focus-visible,a:focus-visible,summary:focus-visible{outline-offset:3px;outline:2px solid #7777db}input:focus-visible,textarea:focus-visible{outline-offset:2px;outline:2px solid #7777db}a{color:inherit}svg{flex-shrink:0}code,pre{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:.9em}.sr-only{clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.icon-button{background:0 0;border:0;border-radius:8px;flex-shrink:0;width:32px;height:32px;min-height:32px;padding:0}.icon-button:hover:not(:disabled){background:#eeeef1}.full-width{width:100%}.muted{color:var(--muted)}.error{color:var(--error)}.feedback{overflow-wrap:anywhere;margin-top:14px;font-size:12px;line-height:1.7}.info-note{margin-bottom:8px;font-size:12px}.console-shell{background:#fcfdfd;height:100dvh;padding:16px;display:block;overflow:hidden}.console-stage{height:100%;position:relative}.scene{border:1.5px solid var(--line);background:#eef1f5;border-radius:24px;width:100%;height:100%;position:relative;overflow:hidden}.scene-main,.camera-layer{position:absolute;inset:0}.camera-layer.can-pan{cursor:grab;touch-action:pinch-zoom;-webkit-user-select:none;user-select:none}.camera-layer.is-panning{cursor:grabbing}.camera-layer:focus-visible{outline-offset:-5px;outline:2px solid #7777db}.camera-image{object-fit:cover;-webkit-user-select:none;user-select:none;background:0 0;width:100%;max-width:none;height:100%;display:block;position:absolute;inset:0}.camera-layer[data-view=fit] .camera-image{object-fit:contain}.camera-empty{color:#747b88;flex-direction:column;justify-content:center;align-items:center;gap:14px;padding:160px 24px 210px;font-size:12px;display:flex;position:absolute;inset:0}.camera-empty>div{border:1px solid var(--line);background:#ffffffb8;border-radius:24px;place-items:center;width:72px;height:72px;display:grid}.camera-empty svg{stroke-width:1.2px;width:30px;height:30px}.camera-status{z-index:1;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);color:#fff;background:#11111180;border:1px solid #ffffff24;border-radius:99px;align-items:center;gap:7px;min-height:28px;padding:5px 10px;font-size:10px;display:flex;position:absolute;top:78px;left:29px}.camera-status>i{background:#cbd0d8;border-radius:50%;flex-shrink:0;width:5px;height:5px}.camera-status.is-live>i{background:#a4edd9}.scene-header{z-index:4;justify-content:space-between;align-items:flex-start;gap:18px;display:flex;position:absolute;top:18px;left:24px;right:24px}.scene-brand{-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);background:#fffffff0;border:1px solid #ffffffb3;border-radius:99px;align-items:center;height:48px;padding:0 21px 0 1px;display:flex;box-shadow:0 2px 14px #11111106}.scene-brand img{object-fit:contain;width:88px;height:55px;display:block}.scene-brand>span{background:#d9dbe0;width:1px;height:18px;margin-right:16px}.scene-brand h1{letter-spacing:-.4px;font-size:13px;line-height:1}.scene-toolbar{-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);background:#fffffff0;border:1px solid #ffffffbf;border-radius:99px;align-items:center;gap:2px;padding:5px;display:flex;box-shadow:0 2px 14px #11111106}.scene-tool{color:#3b3d43;background:0 0;border:0;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:36px;height:36px;min-height:36px;padding:0;text-decoration:none;display:inline-flex;position:relative}.scene-tool:hover:not(:disabled){background:#eeeef1}.scene-controls,.camera-view-controls{z-index:2;-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);background:#ffffffe0;border:1px solid #ffffffc9;border-radius:99px;flex-direction:column;align-items:center;gap:3px;padding:5px;display:flex;position:absolute;top:43%;transform:translateY(-50%);box-shadow:0 3px 20px #1620390b}.scene-controls{right:24px}.composer-home>.lucide-loader-circle{animation:1.15s linear infinite run-spin}.camera-view-controls{left:24px}.scene-controls .scene-tool:after,.camera-view-controls .scene-tool:after{content:attr(data-tip);color:#fff;white-space:nowrap;pointer-events:none;opacity:0;background:#111111ed;border-radius:9px;padding:6px 10px;font-size:11px;transition:opacity .15s,transform .15s;position:absolute;right:calc(100% + 15px);transform:translate(3px)}.camera-view-controls .scene-tool:after{left:calc(100% + 15px);right:auto}.scene-controls .scene-tool:hover:not(:disabled):after,.scene-controls .scene-tool:focus-visible:after,.camera-view-controls .scene-tool:hover:not(:disabled):after,.camera-view-controls .scene-tool:focus-visible:after{opacity:1;transform:none}.task-caption{z-index:2;background:var(--glass);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);text-align:center;border:1px solid #d7e2f0e6;border-radius:18px;width:min(480px,100% - 560px);padding:12px 20px 11px;position:absolute;top:18px;left:50%;transform:translate(-50%);box-shadow:0 3px 20px #1620390b}.task-instruction{-webkit-line-clamp:2;overflow-wrap:anywhere;letter-spacing:-.2px;-webkit-box-orient:vertical;font-size:16px;font-weight:500;line-height:1.5;display:-webkit-box;overflow:hidden}.task-metrics{color:#414650;flex-wrap:wrap;justify-content:center;align-items:center;gap:4px 17px;margin-top:5px;font-size:12px;line-height:1.6;display:flex}.task-metrics>span{white-space:nowrap;align-items:center;gap:5px;display:inline-flex}.task-metrics svg{width:12px;height:12px}.task-metrics time,.task-metrics strong{font-variant-numeric:tabular-nums;font-size:12px;font-weight:400}.task-metrics small{margin-left:3px;font-size:11px}.task-state>i{background:#8b919b;border-radius:50%;width:5px;height:5px}.task-state.is-running>i{background:#9d6275;box-shadow:0 0 0 3px #f7c9d766}.pending-mark{color:#6d591f;background:#ffeabb;border-radius:99px;padding:2px 7px;font-size:10px}.instruction-panel{z-index:5;pointer-events:none;flex-direction:column;align-items:flex-end;gap:8px;width:min(600px,100% - 64px);display:flex;position:absolute;bottom:20px;left:50%;transform:translate(-50%)}.instruction-panel>*{pointer-events:auto}.instruction-shortcuts{align-items:center;gap:7px;width:100%;display:flex}.instruction-shortcuts>.preset-chips{flex:1}.preset-chips{align-items:center;gap:6px;width:100%;min-width:0;max-width:100%;display:flex;position:relative}.preset-chips-track{scrollbar-width:none;touch-action:pan-y pinch-zoom;overscroll-behavior-x:contain;flex:1;align-items:center;gap:7px;min-width:0;padding:4px;display:flex;overflow:hidden}.preset-chips-track::-webkit-scrollbar{display:none}.preset-chip-measure{visibility:hidden;pointer-events:none;width:100%;height:0;display:flex;position:absolute;top:0;left:0;overflow:hidden}.preset-chip{border:1px solid var(--line);background:var(--glass);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);white-space:nowrap;border-radius:99px;flex-shrink:0;align-items:center;gap:8px;width:max-content;min-width:0;max-width:220px;min-height:32px;padding:6px 11px;font-size:12px;line-height:1.4;display:inline-flex}.preset-chip:hover:not(:disabled){background:#f7c9d7b8}.preset-chip:focus-visible{outline-offset:2px}.preset-chip>span{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.preset-chip svg,.preset-navigation svg{width:13px;height:13px}.preset-navigation{background:var(--glass);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);flex:0 0 28px;width:28px;height:36px;min-height:36px;padding:0}.preset-navigation.previous svg{transform:rotate(90deg)}.preset-navigation.next svg{transform:rotate(-90deg)}.composer{z-index:2;background:var(--glass);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border:1px solid #e2e7eec4;border-radius:24px;width:100%;padding:10px 10px 8px;transition:background-color .2s,border-color .16s,box-shadow .16s;position:relative;box-shadow:0 8px 28px #16203912}.composer:focus-within{background:#ffffffe8;border-color:#edc5d2;box-shadow:0 0 0 3px #f7c9d72b,0 8px 28px #16203915}.composer textarea{resize:none;width:100%;min-height:36px;max-height:112px;box-shadow:none;letter-spacing:-.1px;background:0 0;border:0;outline:none;padding:5px 8px;font-size:16px;line-height:1.5;display:block;overflow-y:auto}.composer textarea::placeholder{color:#626771;opacity:1}.composer textarea:disabled{color:#747882;background:0 0}.composer-actions{justify-content:space-between;align-items:center;gap:12px;margin-top:12px;display:flex}.composer-left,.composer-right{justify-content:flex-end;align-items:center;gap:6px;min-width:0;display:flex}.composer-left>.icon-button{border-radius:50%;width:40px;height:40px;min-height:40px}.composer-left{flex-shrink:0}.add-instruction>svg{stroke-width:1.8px;width:22px;height:22px}.add-instruction[aria-expanded=true]{background:#ffffff91}.model-trigger{color:#3d424d;background:0 0;border:0;border-radius:99px;align-items:center;gap:7px;min-width:0;max-width:230px;min-height:36px;padding:5px 8px;font-size:14px;display:flex}.model-trigger:hover:not(:disabled),.model-trigger[aria-expanded=true]{background:#ffffff91}.model-trigger>span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.model-trigger>svg{width:16px;height:16px}.model-trigger>svg:first-child{fill:currentColor;stroke-width:1.5px}.send-control{--control-fill:#17191cd4;color:#fff;background:0 0;border:0;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:40px;height:40px;min-height:40px;padding:0;display:flex;position:relative}.send-control:before{content:"";background:var(--control-fill);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-radius:50%;width:36px;height:36px;transition:background-color .16s,transform .16s;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.send-control:active:not(:disabled):before{transform:translate(-50%,-50%)scale(.94)}.send-control>svg{stroke-width:1.9px;width:22px;height:22px;position:relative}.send-control:hover:not(:disabled){--control-fill:#111111eb;background:0 0}.send-control:disabled{opacity:1;color:#91959d;--control-fill:#e5e7ecb8;background:0 0}.run-control:disabled{color:#fff;--control-fill:#17191cd4;opacity:.6;background:0 0}.run-control .run-spinner{width:23px;height:23px;animation:1.15s linear infinite run-spin}.run-control .run-stop-square{stroke-width:0;width:10px;height:10px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.run-control.is-paused .run-spinner{animation-play-state:paused}.run-control:after{content:attr(title);color:#fff;white-space:nowrap;pointer-events:none;opacity:0;background:#111111ed;border-radius:9px;padding:6px 10px;font-size:10px;transition:opacity .15s;position:absolute;bottom:calc(100% + 12px);right:0}.run-control:hover:after,.run-control:focus-visible:after{opacity:1}@keyframes run-spin{to{transform:rotate(360deg)}}.composer-hint{color:#6c5d64;padding:3px 8px 5px;font-size:11px}.composer-hint>button{background:0 0;border:0;gap:6px;min-height:24px;padding:0;font-size:11px}.composer-hint svg{width:14px;height:14px}.composer-popover{z-index:5;border:1px solid var(--line);-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);background:#fffffff7;border-radius:16px;width:340px;max-width:calc(100% - 24px);max-height:calc(100dvh - 185px);padding:8px;position:absolute;bottom:62px;right:12px;overflow-y:auto;box-shadow:0 8px 36px #18223820}.popover-left{left:12px;right:auto}.popover-heading{align-items:center;gap:3px;min-height:38px;margin:0 0 6px;padding:0 4px;display:flex}.popover-heading h2{margin-left:5px;margin-right:auto;font-size:13px}.popover-heading>.icon-button{width:32px;height:32px;min-height:32px}.popover-heading svg{width:17px;height:17px}.model-settings{padding:0 10px 6px}.model-settings fieldset{gap:13px}.model-settings label,.key-field{color:#4e535d;font-size:11px;display:block;position:relative}.model-settings input{border-radius:11px;margin-top:6px;padding:10px 11px;font-size:12px}.key-field>label{display:inline}.key-configured{color:#65786c;align-items:center;gap:3px;font-size:9px;display:flex;position:absolute;top:0;right:1px}.key-configured svg{width:11px;height:11px}.key-input{position:relative}.key-input input{padding-right:42px}.key-input>.icon-button{width:36px;height:36px;min-height:36px;position:absolute;top:1px;right:4px}.key-input svg{width:16px;height:16px}.runtime-settings{border-top:1px solid #e5e8ee;margin:1px 0 0;padding-top:14px}.model-settings>.primary{gap:12px;min-height:40px;margin-top:12px;font-size:12px}.settings-note{margin-top:9px;font-size:10px;line-height:1.6}.presets-panel{padding:0 4px 3px}.preset-list{max-height:260px;overflow-y:auto}.preset-row{align-items:center;gap:1px;display:flex}.preset-option{text-align:left;background:0 0;border:0;border-radius:8px;flex:1;justify-content:space-between;align-items:center;gap:12px;min-width:0;min-height:36px;padding:8px;font-size:13px;display:flex}.preset-option:hover:not(:disabled){background:#fcecf2}.preset-option>span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.preset-option>svg{width:14px;height:14px}.preset-tool{color:#7d818a;width:29px;height:34px;min-height:34px}.preset-tool>svg{width:14px;height:14px}.add-preset{border-top:1px solid #e5e8ee;align-items:center;gap:7px;margin:8px 3px 2px;padding:8px 0 0;display:flex}.add-preset>input{border-radius:8px;width:100%;min-width:0;padding:7px 10px;font-size:13px}.add-preset>.icon-button{width:38px;height:38px;min-height:38px}.preset-edit{width:100%;padding:4px}.preset-edit textarea{resize:vertical;min-height:70px;font-size:12px}.preset-edit>div{justify-content:flex-end;gap:4px;display:flex}.preset-edit .icon-button{width:34px;height:34px;min-height:34px}.settings-dialog{border:1.5px solid var(--line);color:#111;background:#fcfdfdf8;border-radius:18px;width:min(480px,100vw - 32px);max-height:calc(100dvh - 32px);margin:auto;padding:0;position:fixed;inset:0;overflow:auto;box-shadow:0 20px 80px #1a244025}.settings-dialog::backdrop{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);background:#18223548}.dialog-heading{justify-content:space-between;align-items:center;gap:15px;padding:16px 18px 0;display:flex}.dialog-heading h2{letter-spacing:-.4px;font-size:18px}.dialog-heading .icon-button{margin-right:-4px}.dialog-body{padding:16px 18px 18px}.wide-dialog{width:min(750px,100vw - 32px)}.indicator{color:var(--muted);white-space:nowrap;align-items:center;gap:7px;font-size:12px;display:inline-flex}.indicator:before{content:"";background:#9ba3b1;border-radius:50%;flex-shrink:0;width:5px;height:5px}.indicator.good:before{background:var(--green)}.indicator.bad:before{background:var(--error)}.device-status-list>div{border-bottom:1px solid #e6e8ef;padding:10px 0}.device-status-list>div:first-child{padding-top:4px}.device-status-list>div>div{justify-content:space-between;align-items:center;gap:16px;font-size:13px;display:flex}.device-status-list .indicator{background:0 0;border-radius:99px;padding:0;font-size:12px}.device-status-list p{overflow-wrap:anywhere;margin-top:8px;font-size:12px}label{font-size:12px;font-weight:400}textarea,input:not([type=checkbox]){color:#111;background:#fcfdfd;border:1px solid #d7dce5;border-radius:9px;width:100%;padding:8px 10px;font-size:14px;line-height:1.6;display:block}textarea:disabled,input:disabled{background:var(--raised);color:#7c8089}textarea{resize:vertical}fieldset{border:0;gap:18px;margin:0;padding:0;display:grid}fieldset label input{margin-top:8px}summary{cursor:pointer}.dialog-actions{justify-content:flex-end;gap:10px;margin-top:16px;display:flex}.activity-list{margin:0;padding:0;list-style:none}.activity-list li{overflow-wrap:anywhere;border-bottom:1px solid #efeff1;grid-template-columns:66px minmax(0,1fr);align-items:baseline;gap:12px;padding:5px 0;font:12px/1.5 ui-monospace,SFMono-Regular,Consolas,monospace;display:grid}.activity-list time{color:var(--muted);font-variant-numeric:tabular-nums;flex-shrink:0}.info-grid{grid-template-columns:1fr 1fr;gap:0 24px;margin:0;display:grid}.info-grid>div{border-bottom:1px solid #e6e8ef;justify-content:space-between;align-items:center;gap:10px;padding:9px 0;font-size:13px;display:flex}.info-grid dt,.diagnostics dt{color:var(--muted)}.info-grid dd{font-variant-numeric:tabular-nums;margin:0}.diagnostics{margin-top:14px;font-size:12px}.diagnostics>summary{min-height:32px;color:var(--muted)}.diagnostics dl{gap:12px;display:grid}.diagnostics dd{overflow-wrap:anywhere;margin:3px 0 0;font-family:ui-monospace,monospace}.notifications{z-index:1000;pointer-events:none;flex-direction:column;gap:8px;width:min(360px,100vw - 48px);max-height:calc(100dvh - 48px);display:flex;position:fixed;inset:24px 24px auto auto;overflow:auto}.notification{pointer-events:auto;border:1px solid var(--line);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);color:#111;overflow-wrap:anywhere;background:#fffffff2;border-radius:20px;flex-shrink:0;justify-content:space-between;align-items:center;gap:12px;margin:0;padding:10px 12px 10px 16px;font-size:12px;display:flex;box-shadow:0 8px 28px #16203918}.notification-dot{background:var(--error);border-radius:50%;flex-shrink:0;width:5px;height:5px}.notification .icon-button{width:32px;height:32px;min-height:32px}.notification.warning .notification-dot{background:#a67c31}.notification.info .notification-dot{background:#54738d}@media (width<=1099px){.task-caption{width:min(480px,100% - 72px);top:84px}}@media (width<=720px){.console-shell{padding:9px}.scene{border-radius:20px}.scene-header{gap:9px;top:14px;left:14px;right:14px}.scene-brand{height:47px;padding-right:15px}.scene-brand img{width:82px;height:51px}.scene-brand>span{height:16px;margin-right:12px}.scene-brand h1{font-size:12px}.scene-toolbar{gap:0;padding:4px}.scene-toolbar .scene-tool{width:38px;height:38px;min-height:38px}.scene-toolbar .scene-tool>svg{width:17px;height:17px}.camera-status{min-height:25px;padding:4px 8px;font-size:10px;top:76px;left:18px}.scene-controls,.camera-view-controls{gap:1px;padding:4px;top:50%}.scene-controls{right:14px}.camera-view-controls{left:14px}.scene-controls .scene-tool,.camera-view-controls .scene-tool{width:38px;height:38px;min-height:38px}.task-caption{border-radius:21px;width:calc(100% - 40px);padding:12px 15px 10px;top:106px}.task-instruction{font-size:15px}.task-metrics{gap:13px;font-size:10px}.instruction-panel{gap:9px;width:calc(100% - 28px);bottom:17px}.instruction-shortcuts{flex-wrap:wrap}.instruction-shortcuts>.preset-chips{flex-basis:100%}.composer{border-radius:24px;padding:10px 10px 8px}.composer textarea{min-height:36px;font-size:16px}.preset-chip{min-height:32px;padding:6px 10px;font-size:12px}.model-trigger{max-width:160px}.notifications{width:calc(100vw - 32px);max-height:calc(100dvh - 32px);inset:16px 16px auto auto}.dialog-heading{padding:16px 18px 0}.dialog-heading h2{font-size:19px}.dialog-body{padding:16px 18px 18px}}@media (width<=420px){.composer-actions{gap:6px}.composer-right{gap:4px}.model-trigger{gap:5px;max-width:146px;padding:5px 6px;font-size:13px}.task-metrics{gap:10px}.info-grid{gap:0 15px}.info-grid>div{font-size:11px}}@media (width<=360px){.scene-header{gap:6px;left:10px;right:10px}.scene-brand{padding-right:10px}.scene-brand img{width:72px}.scene-brand>span{margin-right:9px}.scene-toolbar .scene-tool{width:32px}.task-metrics{gap:8px;font-size:9px}.task-metrics time,.task-metrics strong{font-size:10px}}@media (height<=540px){.instruction-panel{gap:8px;width:min(500px,100% - 48px);bottom:16px}.composer{padding:7px 10px}.composer textarea{min-height:40px;max-height:75px;padding-top:6px;font-size:14px}.scene-header{top:14px}.task-caption{padding-top:6px;padding-bottom:6px;top:78px}.task-instruction{-webkit-line-clamp:1;font-size:14px;line-height:1.3}.composer-popover{max-height:calc(100dvh - 155px);bottom:58px}.camera-empty{padding-top:120px;padding-bottom:180px}}@media (height<=540px) and (width>=600px){.camera-view-controls{flex-direction:row;top:82px;left:auto;right:24px;transform:none}.camera-view-controls .scene-tool:after{left:auto;right:calc(100% + 15px)}.task-caption{width:min(480px,100% - 260px)}.scene-controls{border-radius:22px;grid-template-columns:repeat(2,42px);display:grid;top:auto;bottom:16px;transform:none}.instruction-panel{width:min(500px,100% - 160px);left:24px;transform:none}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition:none!important}.run-control .run-spinner,.composer-home>.lucide-loader-circle{animation:none}}.history-caption.task-caption{z-index:4;-webkit-backdrop-filter:none;backdrop-filter:none;box-shadow:none;background:0 0;border:0;padding:0}.history-current,.history-back,.history-record,.history-no-records{background:var(--glass);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border:1px solid #d7e2f0d6;border-radius:18px;box-shadow:0 3px 20px #1620390b}.history-current{z-index:3;padding:8px 12px;position:relative}.history-card-trigger{border-radius:inherit;z-index:1;background:0 0;border:0;width:100%;height:100%;padding:0;position:absolute;inset:0}.history-card-trigger:hover:not(:disabled){background:#ffffff18}.history-current .task-card-heading,.history-current .task-card-footer{pointer-events:none}.history-current .task-actions,.history-current .recording-warning{z-index:2;pointer-events:auto;position:relative}.task-card-heading{align-items:center;gap:12px;min-height:28px;display:flex}.task-card-heading .task-instruction{text-align:left;flex:1;min-width:0;font-size:15px}.task-card-footer{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:4px 8px;margin-top:3px;display:flex}.history-current .task-metrics{justify-content:flex-start;gap:10px;margin:0;font-size:12px}.history-back{transform-origin:bottom;pointer-events:none;transition:transform .26s,opacity .18s;position:absolute;inset:0}.history-back-near{z-index:2;background:#ffffff5c;transform:translateY(6px)scaleX(.96)}.history-back-far{z-index:1;background:#ffffff38;transform:translateY(12px)scaleX(.92)}.history-caption.is-open .history-back{opacity:0;transform:none}.history-indicator{color:#656b75;font-variant-numeric:tabular-nums;flex-shrink:0;align-items:center;gap:4px;min-height:28px;font-size:12px;display:inline-flex}.history-indicator>svg{width:14px;height:14px}.history-indicator>svg:last-child{width:11px;transition:transform .2s}.history-caption.is-open .history-indicator>svg:last-child{transform:rotate(180deg)}.history-empty-label{color:#414650;font-size:13px}.task-actions{align-items:center;gap:2px;margin-left:auto;display:flex}.task-actions .icon-button{color:#535965;border-radius:50%;width:28px;height:28px;min-height:28px}.task-actions .icon-button svg{width:15px;height:15px}.task-actions .icon-button:hover{background:#ffffff78}.task-actions .icon-button[aria-pressed=true]{color:#433039;background:#f7c9d79e}.task-actions .icon-button[data-has-note=true]{color:#8a4f64}.task-action-divider{background:#59647225;width:1px;height:12px;margin-inline:3px}.task-metrics .task-recording{color:#7e4c60;letter-spacing:.4px;gap:5px;font-size:10px}.task-recording i{background:#a65a76;border-radius:50%;width:5px;height:5px}.task-metrics .recording-warning{color:#8e4e36;background:0 0;border:0;min-height:0;padding:0;font-size:12px}.history-cards{width:100%;position:absolute;top:calc(100% + 8px)}.history-records{overscroll-behavior:contain;scrollbar-width:thin;scrollbar-color:#ffffff70 transparent;flex-direction:column;gap:6px;max-height:min(350px,100dvh - 360px);margin:-3px -3px 0;padding:3px 3px 6px;display:flex;overflow-y:auto}.history-record{min-width:0;padding:8px 12px;animation:.22s both history-unfold}.history-caption .history-pick{text-align:left;white-space:normal;background:0 0;border:0;justify-content:space-between;align-items:center;gap:12px;width:100%;min-height:26px;padding:0;display:flex}.history-pick:hover{color:#805168}.history-pick>svg{flex-shrink:0;width:16px}.history-record-title{text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:500;line-height:1.5;display:block;overflow:hidden}.history-record-meta{color:#414650;font-variant-numeric:tabular-nums;align-items:center;gap:10px;font-size:12px;line-height:1.5;display:flex}.history-record-meta>span{align-items:center;gap:4px;display:inline-flex}.history-record-meta svg{width:12px;height:12px}.history-record-meta time{color:#5c626c}.history-no-records{color:#515863;margin:0;padding:12px;font-size:12px}.recording-toggle{white-space:nowrap;cursor:pointer;align-items:center;gap:9px;display:flex}.recording-toggle input{appearance:none;cursor:pointer;background:#525c6744;border:0;border-radius:20px;width:28px;min-width:28px;height:17px;padding:0;transition:background .16s;position:relative}.recording-toggle input:before{content:"";background:#fff;border-radius:50%;width:13px;height:13px;transition:transform .16s;position:absolute;top:2px;left:2px;box-shadow:0 1px 3px #0002}.recording-toggle input:checked{background:#a3677b}.recording-toggle input:checked:before{transform:translate(11px)}.task-detail-dialog{width:min(680px,100% - 24px)}.task-detail-instruction{overflow-wrap:anywhere;margin:0 0 9px;font-size:17px;font-weight:500}.task-detail-meta{color:var(--muted);flex-wrap:wrap;gap:14px;margin-bottom:12px;font-size:12px;display:flex}.task-detail-meta>span{align-items:center;gap:5px;display:inline-flex}.task-detail-meta svg{width:13px}.task-video{background:#17191c;border-radius:12px;width:100%;max-height:42dvh;display:block}.recording-placeholder{min-height:40px;color:var(--muted);background:#e9edf1a6;border-radius:10px;justify-content:center;align-items:center;gap:10px;padding:8px 12px;font-size:13px;display:flex}.task-detail-actions{align-items:center;gap:6px;margin:10px 0 12px;display:flex}.task-detail-actions .task-actions{margin:0}.task-detail-spacer{flex:1}.task-download{color:inherit;border-radius:30px;align-items:center;gap:6px;padding:8px 10px;font-size:12px;text-decoration:none;display:inline-flex}.task-download:hover{background:#eceef1}.task-download svg{width:16px}.task-note{gap:9px;display:grid}.task-note label{align-items:center;gap:9px;font-size:13px;display:flex}.task-note label span{color:var(--muted);font-size:11px}.task-note textarea{resize:vertical;border-radius:10px;min-height:64px;padding:11px 13px;font-size:13px}.task-note>button{justify-self:end;padding:8px 17px;font-size:12px}.task-delete-confirm{text-align:right;background:#f7c9d733;border-radius:16px;margin-top:18px;padding:15px}.task-delete-confirm p{text-align:left;margin:0 0 10px;font-size:13px}.task-delete-confirm button{min-height:32px;margin-left:8px;font-size:12px}.task-delete-confirm button:last-child{color:#fff;background:#7a344b}.task-detail-stop{background:#fcfdfdf0;justify-content:flex-end;align-items:center;gap:12px;margin-top:6px;padding-top:12px;font-size:12px;display:flex;position:sticky;bottom:0}.new-task-hint{align-items:center;gap:5px;display:flex}.new-task-hint button{min-height:24px;padding:0}.new-task-hint svg{width:13px}@keyframes history-unfold{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}@media (width<=420px){.history-current,.history-record{padding:8px 10px}.history-current .task-metrics{gap:8px}.history-record-meta{gap:8px;font-size:11px}.task-card-footer{column-gap:4px}}@media (height<=540px){.history-records{max-height:max(70px,100dvh - 290px)}}@media (prefers-reduced-motion:reduce){.history-caption *{transition:none!important;animation:none!important}}.scene[hidden]{display:none}.settings-page{background:#fcfcfc;border:1px solid #e8e8eb;border-radius:20px;flex-direction:column;height:100%;display:flex;overflow:hidden}.settings-page-header{border-bottom:1px solid #eaeaec;flex-shrink:0;justify-content:space-between;align-items:center;gap:16px;min-height:52px;padding:8px 16px;display:flex}.settings-page-heading{flex-shrink:0;align-items:center;gap:8px;font-size:15px;font-weight:600;display:flex}.settings-layout{flex:1;min-height:0;display:flex}.settings-sidebar{background:#f6f6f7;border-right:1px solid #eaeaec;flex-direction:column;flex:0 0 184px;padding:16px 12px;display:flex}.settings-back{color:#34363b;background:0 0;border:0;border-radius:8px;width:36px;height:36px;min-height:36px;padding:0}.settings-back svg{width:18px;height:18px}.settings-sidebar nav{gap:3px;display:grid}.settings-sidebar nav button{color:#62626a;background:0 0;border:0;border-radius:8px;justify-content:flex-start;align-items:center;gap:9px;min-height:36px;padding:7px 10px;font-size:13px;text-decoration:none;display:flex}.settings-sidebar nav button[aria-current]{color:#422e37;background:#f3e5eb}.settings-sidebar nav svg{flex-shrink:0;width:16px;height:16px}.settings-main{flex-direction:column;flex:1;min-width:0;display:flex}.settings-content-header{flex-shrink:0;justify-content:space-between;align-items:center;gap:16px;min-height:68px;padding:18px 24px;display:flex}.settings-content-header h1{letter-spacing:-.4px;outline:none;font-size:20px;line-height:1.3}.settings-run-status{min-width:0;color:var(--muted);justify-content:flex-end;align-items:center;gap:9px;font-size:12px;display:flex}.settings-run-instruction{text-overflow:ellipsis;white-space:nowrap;max-width:150px;overflow:hidden}.settings-run-label{white-space:nowrap;align-items:center;gap:6px;display:inline-flex}.settings-run-label i{background:#a1a1a8;border-radius:50%;width:5px;height:5px}.is-active .settings-run-label i{background:#39765e}.settings-run-status time{font-variant-numeric:tabular-nums}.settings-run-status .send-control{width:40px;min-width:40px;height:40px;min-height:40px}.settings-stop-label{display:none}.settings-content{overscroll-behavior:contain;flex:1;min-width:0;min-height:0;padding:0 24px 24px;overflow-y:auto}.settings-content-inner{max-width:760px;margin:0 auto}.settings-section{margin-bottom:24px}.settings-section h2{font-size:14px;font-weight:500}.settings-section p{color:var(--muted);font-size:12px}.settings-row{border-bottom:1px solid #e7e7ea;justify-content:space-between;align-items:center;gap:16px;min-height:52px;padding:8px 0;display:flex}.settings-row p{margin-top:4px}.settings-page select{font:inherit;color:#111;background:#fff;border:1px solid #dddde2;border-radius:8px;padding:7px 28px 7px 10px;font-size:13px}.settings-page .model-settings{padding:4px 0 0}.settings-page .model-settings fieldset{gap:16px}.settings-page .model-settings label,.settings-page .key-field{color:#34363b;font-size:13px}.settings-page .model-settings fieldset>label,.settings-page .key-field{grid-template-columns:104px minmax(0,1fr);align-items:center;gap:12px;display:grid}.settings-page .model-settings input{background:#fff;border-radius:8px;min-height:38px;margin:0;padding:8px 10px;font-size:13px;line-height:1.5}.settings-page .model-settings .key-input input{padding-right:38px}.settings-page .key-input>.icon-button{width:32px;height:32px;min-height:32px;top:3px;right:3px}.settings-page .key-configured{grid-area:2/2;margin-top:-8px;font-size:12px;position:static}.settings-page .key-input{grid-area:1/2}.settings-page .model-settings .runtime-settings{border-bottom:1px solid #e7e7ea;grid-template-columns:1fr 120px;margin-top:4px;padding:12px 0}.settings-page .model-settings>.primary{width:auto;min-height:36px;margin-top:16px;padding:7px 14px;font-size:13px}.settings-page .model-settings>.primary svg{display:none}.settings-page .settings-note{margin-top:12px;font-size:12px}.settings-saved{align-items:center;gap:6px;margin-top:12px;font-size:12px;display:flex;color:var(--green)!important}.settings-saved svg{width:14px;height:14px}.settings-recording-toggle input{width:32px;min-width:32px;height:20px}.settings-recording-toggle input:before{width:16px;height:16px}.settings-recording-toggle input:checked:before{transform:translate(12px)}.workspace-settings>fieldset{gap:0}.workspace-settings .workspace-bounds{border-bottom:1px solid #eaeaec;grid-template-columns:minmax(0,1fr) repeat(2,minmax(0,120px));align-items:center;gap:12px;padding:16px 0;font-size:13px;display:grid}.workspace-sign{text-align:center}.workspace-axis{display:contents}.workspace-bounds input{background:#fff;border-radius:8px;min-width:0;min-height:38px;padding:8px 10px;font-size:13px}.device-setting-row .workspace-save{color:inherit;padding:6px 8px}.storage-heading{justify-content:space-between;align-items:center;gap:12px;margin:20px 0 8px;display:flex}.text-button{color:var(--muted);background:0 0;border:0;min-height:28px;padding:4px 0;font-size:12px}.storage-summary{color:var(--muted);flex-wrap:wrap;align-items:baseline;gap:6px 16px;padding:0 0 20px;font-size:13px;display:flex}.storage-summary strong{color:#222;font-size:14px;font-weight:500}.storage-toolbar{border-bottom:1px solid #e7e7ea;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;padding:8px 0;display:flex}.storage-toolbar>label{color:var(--muted);align-items:center;gap:8px;font-size:12px;display:flex}.storage-toolbar>div{gap:6px;display:flex}.storage-toolbar button{border-color:#dedee3;border-radius:7px;min-height:30px;padding:5px 8px;font-size:12px}.storage-toolbar .storage-delete{color:#96585e}.storage-section input[type=checkbox]{accent-color:#a3677b;cursor:pointer;width:14px;height:14px;margin:0;padding:0}.storage-task{cursor:pointer;border-bottom:1px solid #eaeaec;grid-template-columns:14px minmax(0,1fr) 80px 42px 62px;align-items:center;gap:10px;min-height:50px;padding:10px 0;display:grid}.storage-task-name{align-items:center;gap:6px;min-width:0;display:flex}.storage-task-name strong{text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:500;overflow:hidden}.storage-task em{color:#9a6176;white-space:nowrap;font-size:11px;font-style:normal}.storage-task-date,.storage-task-duration,.storage-task-size{color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:12px}.storage-task-size{text-align:right}.storage-empty{text-align:center;padding:20px 0}.storage-confirm{background:#fbf2f4;border:1px solid #e4cad1;border-radius:10px;flex-wrap:wrap;align-items:flex-start;gap:10px;margin-top:12px;padding:12px;display:flex}.storage-confirm>svg{color:#96585e;width:16px;height:16px;margin-top:2px}.storage-confirm>div:not(.storage-confirm-actions){flex:1;min-width:180px}.storage-confirm strong{font-size:13px}.storage-confirm p{margin-top:4px}.storage-confirm-actions{gap:6px;margin-left:auto;display:flex}.storage-confirm-actions button{min-height:32px;padding:6px 10px;font-size:12px}.storage-confirm-actions .danger{color:#fff;background:#985b68;border-color:#985b68}.settings-page .device-status-list>div{padding:12px 0}.device-connection-actions{flex-wrap:wrap;align-items:center;gap:8px;margin:14px 0;display:flex}.device-setting-row,.device-control-row{border-bottom:1px solid #eaeaec;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 12px;min-height:52px;padding:10px 0;font-size:13px;display:flex}.device-setting-row>div{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.device-setting-row button,.device-control-row button{min-height:32px;padding:6px 10px;font-size:13px}.device-manage-link{color:var(--muted);background:0 0;border:0;margin-top:12px;padding-inline:0;font-size:12px}.logs-panel{z-index:1;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);background:#ffffffd9;border:1px solid #e2e7eec4;border-radius:18px;flex-direction:column;width:100%;height:min(260px,28dvh);max-height:max(100px,100dvh - 380px);display:flex;position:absolute;bottom:calc(100% + 12px);right:0;overflow:hidden;box-shadow:0 10px 32px #1620391a}.logs-heading{border-bottom:1px solid #e6e6ea;align-items:center;gap:8px;min-height:42px;padding:5px 12px;display:flex}.logs-heading>svg{width:16px;height:16px;color:var(--muted)}.logs-heading h2{font-size:13px;font-weight:500}.logs-heading input{background:0 0;border-radius:7px;width:180px;margin-left:auto;padding:5px 9px;font-size:12px;line-height:1.5}.logs-heading .icon-button{width:28px;height:28px;min-height:28px}.logs-heading .icon-button svg{width:16px;height:16px}.logs-body{flex:1;min-height:0;padding:2px 14px 8px;overflow:auto}.logs-body>p{padding:12px 0;font-size:12px}@media (width>=1100px){.settings-sidebar{flex-basis:200px}.settings-content-header{padding-inline:max(32px,50% - 380px)}.settings-content{padding-inline:32px}}@media (width<=900px){.settings-run-instruction{display:none}}@media (width<=600px){.settings-page{border-radius:18px}.settings-page-header{gap:8px;min-height:48px;padding:6px 10px}.settings-page-heading{gap:4px;font-size:14px}.settings-layout{flex-direction:column}.settings-sidebar{border:0;border-bottom:1px solid #eaeaec;flex:none;padding:8px 10px}.settings-sidebar nav{scrollbar-width:none;gap:3px;display:flex;overflow-x:auto}.settings-sidebar nav button{flex-shrink:0;gap:5px;min-height:32px;padding:7px 9px;font-size:12px}.settings-sidebar nav svg{display:none}.settings-main{min-height:0}.settings-content-header{min-height:48px;padding:12px 16px}.settings-content-header h1{font-size:18px}.settings-run-status{gap:6px}.settings-run-label{white-space:normal;min-width:0;line-height:1.3}.settings-run-status time{display:none}.settings-content{padding:0 16px 20px}.settings-page .model-settings fieldset>label,.settings-page .key-field{grid-template-columns:82px minmax(0,1fr);gap:8px}.workspace-settings .workspace-bounds{grid-template-columns:92px repeat(2,minmax(0,1fr));gap:12px 8px}.storage-toolbar>div{width:100%}.storage-toolbar button{flex:1}.storage-task{grid-template-columns:14px minmax(0,1fr) 42px 62px;gap:2px 8px;padding:8px 0}.storage-task>input{grid-area:1/1/3}.storage-task-name{grid-area:1/2/auto/4}.storage-task-date{grid-area:2/2}.storage-task-duration{grid-area:2/3}.storage-task-size{grid-area:1/4/3}.storage-summary{gap:6px 12px}.logs-heading input{width:min(160px,45%)}}@media (pointer:coarse){button,.button,.scene-tool,.icon-button,.settings-sidebar nav button{min-height:44px}.scene-tool,.icon-button{min-width:44px}.task-actions .icon-button{min-width:36px;min-height:40px}.preset-chip{min-height:40px}}.device-calibration-entry{text-align:left;background:0 0;border:0;border-bottom:1px solid #e7e7ea;border-radius:0;justify-content:space-between;align-items:center;gap:16px;width:100%;min-height:52px;padding:10px 0;font-size:13px;display:flex}.device-calibration-entry>span:last-child{color:var(--muted);align-items:center;gap:10px;display:inline-flex}.device-calibration-entry svg{width:16px;height:16px;transform:rotate(-90deg)}.device-calibration-entry:hover:not(:disabled){color:#8e5b70;background:0 0}
@@ -0,0 +1,15 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <meta name="color-scheme" content="light" />
7
+ <meta name="theme-color" content="#fcfdfd" />
8
+ <title>RoboAPI · PokeBot</title>
9
+ <script type="module" crossorigin src="/assets/index-CGLhpUm0.js"></script>
10
+ <link rel="stylesheet" crossorigin href="/assets/index-QXqV-fDC.css">
11
+ </head>
12
+ <body>
13
+ <div id="root"></div>
14
+ </body>
15
+ </html>
@@ -0,0 +1,205 @@
1
+ Metadata-Version: 2.4
2
+ Name: roboapi
3
+ Version: 0.4.2
4
+ Summary: Run robot policies on UR and Franka through a browser or an MCP agent.
5
+ Author: PokeBot
6
+ License-Expression: Apache-2.0 AND MIT AND ISC AND OFL-1.1 AND LicenseRef-MiSans
7
+ Classifier: Programming Language :: Python :: 3.10
8
+ Classifier: Programming Language :: Python :: 3.11
9
+ Classifier: Programming Language :: Python :: 3.12
10
+ Classifier: Programming Language :: Python :: Implementation :: CPython
11
+ Classifier: Operating System :: POSIX :: Linux
12
+ Requires-Python: <3.13,>=3.10
13
+ Description-Content-Type: text/markdown
14
+ License-File: LICENSE
15
+ License-File: NOTICE
16
+ License-File: frontend/public/assets/Bundler-LICENSE.txt
17
+ License-File: frontend/public/assets/Inter-OFL.txt
18
+ License-File: frontend/public/assets/Lucide-LICENSE.txt
19
+ License-File: frontend/public/assets/Meshoptimizer-LICENSE.txt
20
+ License-File: frontend/public/assets/PokeBrand-NOTICE.txt
21
+ License-File: frontend/public/assets/React-LICENSE.txt
22
+ License-File: frontend/public/assets/Three-LICENSE.txt
23
+ Requires-Dist: numpy
24
+ Requires-Dist: scipy
25
+ Requires-Dist: pillow
26
+ Requires-Dist: opencv-python
27
+ Requires-Dist: imageio-ffmpeg
28
+ Requires-Dist: httpx
29
+ Requires-Dist: pyyaml
30
+ Requires-Dist: mcp
31
+ Requires-Dist: tyro<2,>=1.0.16
32
+ Provides-Extra: ur-cb3
33
+ Requires-Dist: ur_rtde; extra == "ur-cb3"
34
+ Provides-Extra: franka
35
+ Requires-Dist: franky-control<3,>=2.0; extra == "franka"
36
+ Requires-Dist: websockets>=15; extra == "franka"
37
+ Provides-Extra: franka56
38
+ Requires-Dist: franky-control==2.0.0+libfranka.0.13.3; extra == "franka56"
39
+ Requires-Dist: websockets>=15; extra == "franka56"
40
+ Provides-Extra: panda
41
+ Requires-Dist: franky-control==2.0.0+libfranka.0.9.2; extra == "panda"
42
+ Requires-Dist: websockets>=15; extra == "panda"
43
+ Provides-Extra: gripper
44
+ Requires-Dist: minimalmodbus; extra == "gripper"
45
+ Dynamic: license-file
46
+
47
+ # RoboAPI
48
+
49
+ > Version 0.3.0 renames the Python package, CLI and import to `roboapi`. Use a new environment and configuration; existing `robomcp` releases are different artifacts.
50
+
51
+ Test and run robot policies on UR and Franka through a browser or an MCP agent.
52
+
53
+ RoboAPI connects a single arm, a Robotiq parallel gripper and a wrist fisheye camera to a
54
+ session-based model API. It collects observations, requests action
55
+ chunks and executes them with the same Cartesian semantics across robots.
56
+
57
+ The source archive on PyPI includes complete installation, calibration and model API guides
58
+ in `docs/`: select **Download files** on the PyPI project page, download the `.tar.gz` archive,
59
+ and extract it. The GitHub repository is currently private.
60
+
61
+ ## Requirements
62
+
63
+ - **Robot:** UR5 (CB3), UR5e, UR7e, Franka FR3 or Panda with system software 4.2.1–4.x.
64
+ - **Camera:** wrist-mounted fisheye RGB, using V4L2 with MJPG at 1280×720 and 30 FPS.
65
+ Mounting must match the model's training viewpoint.
66
+ - **Host:** Linux x86-64 and CPython 3.10–3.12; new installations use 3.12 with
67
+ [uv](https://docs.astral.sh/uv/getting-started/installation/).
68
+ - **Model service:** a Base URL, model ID and API key for the model API contract.
69
+
70
+ The release wheel includes the web interface. UR e-Series requires a separately built
71
+ control runtime from sources included in the wheel. Franka uses a compatible SDK and
72
+ requires a realtime host.
73
+
74
+ ## Get started
75
+
76
+ 1. Install system libraries and create a Python environment on the robot host:
77
+
78
+ ```sh
79
+ sudo apt-get update
80
+ sudo apt-get install -y libgl1 libglib2.0-0
81
+ mkdir -p ~/roboapi && cd ~/roboapi
82
+ uv venv --python 3.12
83
+ . .venv/bin/activate
84
+ ```
85
+
86
+ Install the matching package for the robot and gripper:
87
+
88
+ | Robot | Command |
89
+ | --- | --- |
90
+ | UR CB3 | `uv pip install 'roboapi[ur-cb3,gripper]'` |
91
+ | UR e-Series | `uv pip install 'roboapi[gripper]'` |
92
+ | Franka FR3, system 5.9+ | `uv pip install 'roboapi[franka,gripper]'` |
93
+ | Franka FR3, system 5.6.0 | `uv pip install 'roboapi[franka56,gripper]' --index https://timschneider42.github.io/franky/whl/libfranka-0.13.3/` |
94
+ | Franka Panda, system 4.2.1–4.x | `uv pip install 'roboapi[panda,gripper]' --index https://timschneider42.github.io/franky/whl/libfranka-0.9.2/` |
95
+
96
+ UR e-Series additionally needs its native runtime built on the host:
97
+
98
+ ```sh
99
+ sudo apt-get install -y build-essential cmake
100
+ python -m roboapi.hardware.ur.build --build-dir build/ur-native --install-dir "$VIRTUAL_ENV"
101
+ ```
102
+
103
+ For Franka, configure the [realtime kernel and permissions](https://frankarobotics.github.io/docs/doc/libfranka/docs/real_time_kernel.html),
104
+ connect to the control cabinet's Shop Floor interface and enable FCI. FR3 5.6 and Panda
105
+ require a one-time import of the standard load and flange TCP in Desk: run
106
+ `roboapi export-franka-tool --output endeffector-config.json` and follow the Franka
107
+ installation guide in the source archive. The physical tool must match that preset.
108
+
109
+ Use the `video` and `dialout` groups as appropriate for the camera and serial gripper.
110
+ On UR, configure the flange-centre TCP and physical load in PolyScope.
111
+ 2. Run the setup wizard on the robot host:
112
+
113
+ ```sh
114
+ roboapi init
115
+ ```
116
+
117
+ Have the robot address, camera device and model credentials ready. The wizard selects the
118
+ gripper connection and saves the local configuration; Franka also needs Desk credentials.
119
+ 3. Start the browser interface:
120
+
121
+ ```sh
122
+ roboapi http
123
+ ```
124
+
125
+ Open [localhost:8080](http://127.0.0.1:8080/). Camera preview starts automatically, with
126
+ read-only arm feedback when available. Franka preview uses Desk; startup leaves its
127
+ brakes and operating mode unchanged. For a remote robot host, forward its port 8080
128
+ over SSH, then open the local forwarded address.
129
+ 4. Open **Settings → Devices → Calibrate**. Teach Home and three points on a level surface.
130
+ After the last point, RoboAPI returns Home, saves the calibration and initializes the arm and gripper.
131
+ Try the optional direction checks, or choose **Done** to return to the run view.
132
+ UR uses PolyScope teaching; Franka uses the arm's native guiding buttons, with one selectable
133
+ translation axis and rotation held after capturing Home.
134
+ 5. Enter an **Instruction** and choose **Start**. Check the camera and current state; use
135
+ **Logs** for errors. The send arrow becomes **Robot Stop**, and **Home** returns to the calibrated pose.
136
+
137
+ Actions run at 30 Hz. Between chunks, RoboAPI waits 0.5 seconds by default before capturing
138
+ the next observation. Open the current model at the input’s right to go to **Settings →
139
+ Model & runtime** and change its connection or **Chunk wait (s)** while stopped. Choose
140
+ English or Chinese in **Settings → General**.
141
+
142
+ Shift+Enter sends; Enter inserts a newline. Up/Down recalls past instructions without sending.
143
+ Sending a new draft during a web run interrupts its current action chunk and starts a new task
144
+ once the stop completes.
145
+
146
+ **Settings → Devices → Motion range** sets each axis's negative and positive distances from Home in centimetres.
147
+ It starts enabled at Home ±0.60 m on each axis. Out-of-range position targets stop at the box
148
+ boundary without ending the task; this does not constrain external forces or the whole arm.
149
+ If the robot is already outside, use **Home** to return smoothly before starting another motion.
150
+ Installation calibration is unrestricted, and saving limits never moves the robot.
151
+ Runs continue until stopped or interrupted by a fault. Ctrl+C shuts down the service.
152
+
153
+ The task cards above the camera retain past instructions. After stopping, send with an
154
+ empty input to continue the current task, or enter a different instruction to start a new
155
+ one. Each task has a thumbs-up/down rating, an optional note and one camera recording.
156
+ Continuing a task appends to its recording and skips the stopped waiting time. Open a task
157
+ to review or download its video, edit feedback or delete it; selecting an old instruction
158
+ only fills the input until you explicitly send it.
159
+
160
+ Recording starts automatically with each run and can be disabled for subsequent runs in
161
+ **Settings → Recording & storage**. Videos contain the full camera view, independent of browser panning
162
+ or cropping. Tasks and feedback remain on the robot host until manually deleted; ratings
163
+ are not sent to the model service.
164
+
165
+ Settings can be inspected during a run, with the current state and **Robot Stop** kept in
166
+ the section heading. Returning preserves the instruction draft, camera view and expanded history.
167
+ Storage management shows task and video usage on the robot host. Clear selected or all
168
+ recordings while keeping instructions and feedback, or delete whole tasks after confirmation.
169
+ Active tasks and recordings still being saved are skipped. Device shortcuts remain in the main header.
170
+ **Logs** opens a floating panel with a text filter; the camera and instruction controls remain in place and stay usable.
171
+
172
+ ## Connect an agent
173
+
174
+ Choose one startup mode for an installation:
175
+
176
+ | Mode | Start with | Connect to |
177
+ | --- | --- | --- |
178
+ | Browser | `roboapi http` | `http://127.0.0.1:8080/` |
179
+ | Browser and network MCP | `roboapi http --with-mcp` | Browser on 8080; MCP at `http://127.0.0.1:8000/mcp` |
180
+ | Client-managed stdio MCP | Let the MCP client launch `roboapi serve` | stdio; browser also available on 8080 by default |
181
+
182
+ Each command starts its own runtime and device connections. Stop the existing service before
183
+ switching modes. To add a network agent to a browser session, restart with `--with-mcp`.
184
+ See `docs/installation.md` in the source archive for stdio and remote MCP client configuration.
185
+
186
+ The browser and agent share devices and settings. Stop the run before switching interfaces.
187
+
188
+ ## Documentation
189
+
190
+ | Guide | Contents |
191
+ | --- | --- |
192
+ | `docs/installation.md` | Hardware preparation, native builds, connections, local files and upgrades |
193
+ | `docs/calibration.md` | Home, reference plane and shared task coordinates |
194
+ | `docs/model-api.md` | Sessions, observations, actions and execution feedback |
195
+ | `docs/development.md` | Source setup, tests, packaging and releases |
196
+ | `DESIGN.md` | Product scope and architecture |
197
+
198
+ CI checks Python 3.10–3.12, frontend tests, hardware SDK imports and the installed web package,
199
+ and builds and tests the UR control runtime. Physical robot operation requires separate verification;
200
+ see the validation section of `docs/development.md`.
201
+
202
+ ## License
203
+
204
+ Copyright 2026 PokeBot. Project code is licensed under [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0).
205
+ Bundled third-party components retain their respective licenses; see `NOTICE` in the source archive.
@@ -0,0 +1,94 @@
1
+ roboapi/__init__.py,sha256=7n4bzF6Ul3-ftitBmQd1UZs8neuF_jGevhDhDzhHYak,140
2
+ roboapi/cli.py,sha256=1mtXWwaY5qZlWjUd-h2aSeBmRGxGRbqGAc1RVv8rrYM,7165
3
+ roboapi/embodiment.py,sha256=zC2J06m5s--dqQikU64LSXOPNavabtSSh2zzyUumxIU,9783
4
+ roboapi/errors.py,sha256=3xh_wAC1uzuYk8YsEspjGzzxN2sSvX6TTf-N2DDGqBE,966
5
+ roboapi/geometry.py,sha256=Pc_RiShzXwMLRQHwa8Uitm76uRSEMsw_O45pV7ffXX4,16230
6
+ roboapi/images.py,sha256=yE48bdZjEbpOSaa7w7dkDrCyVF4D6-P8ni-nVcmQqo4,577
7
+ roboapi/initialize.py,sha256=bY9TqB_N8pdOXzDFOeG3hrSWgmLLsIgSqJT5OYlLdRk,6097
8
+ roboapi/mcp.py,sha256=kNqchKw7OxIu_D9-WqTkNbHVCiD3nUAr52yRVrkopM8,25596
9
+ roboapi/motion.py,sha256=NldlJPOWG_FVR2Dj6eVv1f_q6nZ6e07_S22ZRIxg6t8,5040
10
+ roboapi/naming.py,sha256=ZSZgSYihIAERMWOq5ATw038PW-p6FVhgU3EeRdilR4k,266
11
+ roboapi/operations.py,sha256=yQHIhRxuM6U5TyLnOwb5cEhKnp6w101R2QGe7epfVTk,1155
12
+ roboapi/product-names.json,sha256=lL_zWDuSEG9BiFNgCb08TkZ-doHoxI1faQTr1NSMIMk,578
13
+ roboapi/records.py,sha256=Oat63FpShIZl5aGBKFhoS4R3UdeaqlQDHcUDoLwn3hU,6214
14
+ roboapi/runtime.py,sha256=Ip0ROKTK-Rrrpe9vO4j-KVddMqmkQU44vQlRIFvHsjs,44000
15
+ roboapi/semantics.py,sha256=m24YldUEASbxV9a0JqwW3w9SXW56K0GaSXZzpkVmNBY,216
16
+ roboapi/tasks.py,sha256=xVz1CHc6n6Rtwj954AAwzw0QAewGeYC3qqcgtRj9EV0,15442
17
+ roboapi/calibration/__init__.py,sha256=Thf1pLx7_zuRv0SFOXFFA9rwm5VMbg3422wVz1wGwHg,252
18
+ roboapi/calibration/profile.py,sha256=Lp1WT9EHCCAagFE3Pq4JBoO6HYRga6TbchpMvgFIbxk,5497
19
+ roboapi/calibration/session.py,sha256=-tGcsLifbIH1ecPgpxv_dXuQrikudO15Yc9ncFQ5b70,15462
20
+ roboapi/config/__init__.py,sha256=-haRDpUlLdz1ThJ8ulbBTRbxAvoDQikQ98ln515a2as,505
21
+ roboapi/config/loader.py,sha256=RfddyKVbyDf3UxDMuMdoYQeFVecAKUOzI5r-lklS_Lw,4341
22
+ roboapi/config/models.py,sha256=EbVn9s54T29OXk7sOYlOHI2eeNjBFD1UoiMycoSK3eQ,8297
23
+ roboapi/hardware/__init__.py,sha256=z8MyeXRIs3JeFkf8keqPEBptBW8HLS-tOGveZ_-qXyg,144
24
+ roboapi/hardware/base.py,sha256=-FTCB9utvMFb8rHIs9VdS96TXbuzz9nZQcCznlGUiEM,3673
25
+ roboapi/hardware/camera.py,sha256=LoHrA5MlD0l0qk_HNoyvITw0zreGwcwmVWvcVXJpCtk,6635
26
+ roboapi/hardware/robotiq.py,sha256=6ibDgaMQi--XeAGW6Yr2xQ-MkKoxZEyQc9GcFu4kz00,14197
27
+ roboapi/hardware/franka/__init__.py,sha256=vyLxnVS82aw-ZTR9m4SNbWScZ0HVKtN3LOfyJoGQOhY,84
28
+ roboapi/hardware/franka/arm.py,sha256=JnqTWoi-aZuE8CrjyRGqsJBzWx_lSGjw5roufCKCKnc,19988
29
+ roboapi/hardware/franka/desk.py,sha256=FAb26Fyu7qWT92YNKweZvvbDHRgycSogn4uTuex2oeU,23841
30
+ roboapi/hardware/franka/feedback.py,sha256=tVKijSyuhynVRm6htoI8EJYpBG7OG2bWLMHJsoyAFiA,8132
31
+ roboapi/hardware/franka/guiding.py,sha256=4C9tX3uzXrZ_CZ0j_eeuHnL45_sOnkKYK5bEYSgqkCY,4396
32
+ roboapi/hardware/franka/ik.py,sha256=v3zkiBpa8d8Mgfr2q5Z05Ui6eOdnVNqHSLJ9LT4vf4A,22301
33
+ roboapi/hardware/franka/limits.py,sha256=imPPF1GL42oWctdZhvVSiofAmxFIqoMtUJYavx7Dguo,4787
34
+ roboapi/hardware/franka/settings.py,sha256=k4tKKPZzEQDn3FzO23c5Y3F-5BX6P7-TteUY1MMXyCQ,5029
35
+ roboapi/hardware/ur/__init__.py,sha256=v3s-a-WN9eWFO9N2IK2y8CC4Kv6fX2t5wN7agwNudlI,451
36
+ roboapi/hardware/ur/build.py,sha256=D2Ufiug4IqfLAp9pzNLjpYuUNEk9SPzB4Zc3uD6F4hU,4328
37
+ roboapi/hardware/ur/compliant.py,sha256=k7fuGNem6FRV653ZC1aU6MWsxbPq7la08xR17Ow5FmY,4534
38
+ roboapi/hardware/ur/dashboard.py,sha256=UGGFNwiWf5NXQVHegkaYx-FhfmIBZR_0lJ38jcjpEek,5070
39
+ roboapi/hardware/ur/feedback.py,sha256=3ikwn9hsRk1SQzAKMQCbMDZG4n-QZqbQcborlHfjCTI,6808
40
+ roboapi/hardware/ur/ipc.py,sha256=K2TxBvsqLgk0CM8BInNT5aimJfX0_Gow2fXLpeiAuAw,8515
41
+ roboapi/hardware/ur/position.py,sha256=dP07zufhpNR2xtWv__WtHZjZ8-TX_K_y71GEvR9dpfA,10587
42
+ roboapi/hardware/ur/settings.py,sha256=hxgF3aqKH0z2P9LfepXLQxfhYmRw1FB_guOyvzW23zc,4133
43
+ roboapi/hardware/ur/native/CMakeLists.txt,sha256=3LPzVxSgk8zwBWumfeSahvU4prRbCO082v9TJ02B3pk,2013
44
+ roboapi/hardware/ur/native/dependencies.lock.json,sha256=WfX2Ua9Z-0tGmraeeb74pUQMQwA9-97C6r-AI8U6hTc,369
45
+ roboapi/hardware/ur/native/worker.cpp,sha256=wWPNhpQ7QGdbm6Jz_x4uiJyES5aWUzYh-iCBvWM6AFc,7138
46
+ roboapi/hardware/ur/native/include/ur_cpp/cartesian_speedl.hpp,sha256=Uau46tSdwQJFkN-FhdSkq5xDOVyayDVJB-UeM-r2USE,6553
47
+ roboapi/hardware/ur/native/include/ur_cpp/control_loop.hpp,sha256=HPF2xGru16HwfElaoDPfSdh7FoyRj68w2BJG8E2uX_0,3520
48
+ roboapi/hardware/ur/native/include/ur_cpp/geom.hpp,sha256=wx9V021NeHDdJQH-3KtO3QMi-eRGqPiIpD1A0RvuAeU,2291
49
+ roboapi/hardware/ur/native/include/ur_cpp/motion_primitives.hpp,sha256=NozDaB4D_nO-GPU0tqCXTzwT84Tf8mWr734cyi-ByPg,12832
50
+ roboapi/hardware/ur/native/include/ur_cpp/robot_io.hpp,sha256=HiuEFjz7mR2hi8bY7HCV51_CnkgNleMy16rYy_XzEqs,829
51
+ roboapi/hardware/ur/native/include/ur_cpp/streaming_pose.hpp,sha256=73TlafettNDgmbZj-NIFsaxOU0foRSHeVFefbZUdRME,15478
52
+ roboapi/hardware/ur/native/src/control_loop.cpp,sha256=wi3VVFx1eNIxA0RFbDRJOKJSyDBaImnqf2dkuQtz0wE,14699
53
+ roboapi/hardware/ur/native/src/robot_io_urcl.cpp,sha256=0_5ryMz4DJgFSnXCrcM2xd-IGoP16DubTTcr5Q-b_hI,5030
54
+ roboapi/hardware/ur/native/tests/cartesian_speedl_unit.cpp,sha256=7h4u42pvP8s6YMtJmsk8z3MuCx8HKaIg9DS8o0m28uw,4507
55
+ roboapi/hardware/ur/native/tests/control_modes_unit.cpp,sha256=pWR6yR7yXhgRgGrXVVG-0fYV4AZzX6TMk4ib5yM7Ruo,4123
56
+ roboapi/hardware/ur/native/tests/streaming_pose_unit.cpp,sha256=iDAp1T0_seVvGdLuRcco20IGQKulRJ-Nem5ZcGpYFVY,12818
57
+ roboapi/hardware/ur/native/tests/velocity_governor_unit.cpp,sha256=kCjPKPRHWJjBQsGna4gGFG-bpnUcV0GRL7UkY8bHufI,2390
58
+ roboapi/policy/__init__.py,sha256=V4izTFUCwlaGaOmsbnv9M9jKqeSEfIF-vibniSbkKfs,259
59
+ roboapi/policy/client.py,sha256=O5T6euPTofHiPYLG9UQd6jah953vGG5cQD_zsq8typ0,12850
60
+ roboapi/policy/protocol.py,sha256=UiTvn0BZlGcUH_3zOf8A3SwVu7k5sbUanaLyhn83fGc,7241
61
+ roboapi/policy/settings.py,sha256=i4F5a2-vxQIrrnzR5EYZm5lBwJcdwlCSHq7Y3GWi734,2734
62
+ roboapi/web/__init__.py,sha256=dv6BuRFpjESsI_t7Z5cRhVYJA3lcjsBYgx8WXOfq3sQ,104
63
+ roboapi/web/presets.py,sha256=n2jtInSuHrjGOi5Blp10IkcqBn17YpejtfSqHf3fCBQ,1682
64
+ roboapi/web/server.py,sha256=f4AYUgbfz0t0VL8kWCLt3WoGzJDXZUFAofTFFrH2Qpg,23237
65
+ roboapi/web/static/index.html,sha256=wVFBmZerLU7QUk5eeITsAykAImS1nh6TRtfKGHP9fLw,502
66
+ roboapi/web/static/assets/Bundler-LICENSE.txt,sha256=Oxh1TZlpTOdeyA8lgE5KvkiJ26Dg9zYzI2oCOCYqFXU,2284
67
+ roboapi/web/static/assets/CalibrationScene-BO_spRoL.js,sha256=M2qgclDZ5JjTy-OGnJnpAoZEiL3o_ANAaUHAWZL8MV8,709640
68
+ roboapi/web/static/assets/Inter-OFL.txt,sha256=XP1LGkMC8IKLTSdWt5J_NwCHZ6Dx7Cww8SOMvJxD_eo,4376
69
+ roboapi/web/static/assets/Inter-Variable-c8O0ljhh.ttf,sha256=C-I5nqkl8fg_-XR2R2HamGDsUHQu0ppdTB_9DFx6w6g,874708
70
+ roboapi/web/static/assets/Lucide-LICENSE.txt,sha256=tJUEe9k6mwaRNREHb1BNq6F9W76z4GUPO7U6QiAynFc,3208
71
+ roboapi/web/static/assets/Meshoptimizer-LICENSE.txt,sha256=ti92iCFU_Ud5awWX1b1z6rmzmUIFavEfH2IKwuPKLW8,1094
72
+ roboapi/web/static/assets/MiSans-Regular-ES4DrbaF.woff2,sha256=1wTBqTLAvX6KBx0nbNgcDtDJ_s-iasI09L7QVZ_hyy0,4858624
73
+ roboapi/web/static/assets/MiSans-Semibold-B34HIk9C.woff2,sha256=eCJ8bsWVZnhcZawLUxIyi_ovh5kY89dANyV4VhWpqPY,5034212
74
+ roboapi/web/static/assets/PokeBrand-NOTICE.txt,sha256=fZEjcpMvuSFEWC4Zjn2AmlcHZIwRLFEpP4PM1UC5L5E,905
75
+ roboapi/web/static/assets/React-LICENSE.txt,sha256=QqG1VS2WKutWZ1na0l5oIs6sP4aozAV0VsI0fVfx6Xc,1120
76
+ roboapi/web/static/assets/Three-LICENSE.txt,sha256=6YOU8xJEAWdkFzxS_SeGfYhOaiLn0Rv6kvSXATeTdIQ,1091
77
+ roboapi/web/static/assets/home-reference-CTpf8-oV.png,sha256=b4sKSQmhVcB_zbDotBBh-5YkMrL_-Ui489CFKH1NZWs,1604215
78
+ roboapi/web/static/assets/index-CGLhpUm0.js,sha256=1cOR1eCPhmsBgW_mtYgWdiV02WvLLIm2xWVe3oJAiBE,320902
79
+ roboapi/web/static/assets/index-QXqV-fDC.css,sha256=8FuFZFIeWkJnadj-y87wM9EUIGsd7idVEqO9O2CJcjk,48620
80
+ roboapi/web/static/assets/robotiq-ace-pro-2-EJuoOXTy.glb,sha256=N-nO9wT_7dRCjnHseDpLr-1rhHNyUltivZu2OImfHqw,471784
81
+ roboapi-0.4.2.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
82
+ roboapi-0.4.2.dist-info/licenses/NOTICE,sha256=xciDo5DrzPKU1FQGnYklXTHdzQUD4qmdSOdNYOR_sqc,793
83
+ roboapi-0.4.2.dist-info/licenses/frontend/public/assets/Bundler-LICENSE.txt,sha256=Oxh1TZlpTOdeyA8lgE5KvkiJ26Dg9zYzI2oCOCYqFXU,2284
84
+ roboapi-0.4.2.dist-info/licenses/frontend/public/assets/Inter-OFL.txt,sha256=XP1LGkMC8IKLTSdWt5J_NwCHZ6Dx7Cww8SOMvJxD_eo,4376
85
+ roboapi-0.4.2.dist-info/licenses/frontend/public/assets/Lucide-LICENSE.txt,sha256=tJUEe9k6mwaRNREHb1BNq6F9W76z4GUPO7U6QiAynFc,3208
86
+ roboapi-0.4.2.dist-info/licenses/frontend/public/assets/Meshoptimizer-LICENSE.txt,sha256=ti92iCFU_Ud5awWX1b1z6rmzmUIFavEfH2IKwuPKLW8,1094
87
+ roboapi-0.4.2.dist-info/licenses/frontend/public/assets/PokeBrand-NOTICE.txt,sha256=fZEjcpMvuSFEWC4Zjn2AmlcHZIwRLFEpP4PM1UC5L5E,905
88
+ roboapi-0.4.2.dist-info/licenses/frontend/public/assets/React-LICENSE.txt,sha256=QqG1VS2WKutWZ1na0l5oIs6sP4aozAV0VsI0fVfx6Xc,1120
89
+ roboapi-0.4.2.dist-info/licenses/frontend/public/assets/Three-LICENSE.txt,sha256=6YOU8xJEAWdkFzxS_SeGfYhOaiLn0Rv6kvSXATeTdIQ,1091
90
+ roboapi-0.4.2.dist-info/METADATA,sha256=EneO6pDMB0YbugplweC1aQcjZEsBSsnKn6Um5in8XS0,10486
91
+ roboapi-0.4.2.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
92
+ roboapi-0.4.2.dist-info/entry_points.txt,sha256=YmL1ty92vA50Ap-11W2rAgzYyGv2tY4JOHycyMIxurU,48
93
+ roboapi-0.4.2.dist-info/top_level.txt,sha256=jUgyb07gWR-MJg4FbWabjric-MGV3x0oFt51iP09P80,8
94
+ roboapi-0.4.2.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.2.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ roboapi = roboapi.cli:app.cli