wirestudio 0.26.0__tar.gz → 0.26.2__tar.gz

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 (303) hide show
  1. {wirestudio-0.26.0/wirestudio.egg-info → wirestudio-0.26.2}/PKG-INFO +1 -1
  2. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_fleet.py +37 -0
  3. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/__init__.py +1 -1
  4. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/api/app.py +7 -3
  5. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/fleet/client.py +42 -23
  6. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/generate/yaml_gen.py +8 -0
  7. {wirestudio-0.26.0 → wirestudio-0.26.2/wirestudio.egg-info}/PKG-INFO +1 -1
  8. {wirestudio-0.26.0 → wirestudio-0.26.2}/LICENSE +0 -0
  9. {wirestudio-0.26.0 → wirestudio-0.26.2}/README.md +0 -0
  10. {wirestudio-0.26.0 → wirestudio-0.26.2}/pyproject.toml +0 -0
  11. {wirestudio-0.26.0 → wirestudio-0.26.2}/setup.cfg +0 -0
  12. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_active_design.py +0 -0
  13. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_agent.py +0 -0
  14. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_agent_stream.py +0 -0
  15. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_api.py +0 -0
  16. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_api_route.py +0 -0
  17. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_ascii_gen.py +0 -0
  18. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_build_backend.py +0 -0
  19. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_chirpstack.py +0 -0
  20. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_circuitpython.py +0 -0
  21. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_codec.py +0 -0
  22. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_compatibility.py +0 -0
  23. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_compile.py +0 -0
  24. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_coverage_baseline.py +0 -0
  25. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_design_events.py +0 -0
  26. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_designs.py +0 -0
  27. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_designs_seed.py +0 -0
  28. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_enclosure.py +0 -0
  29. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_enclosure_gate.py +0 -0
  30. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_enclosure_search.py +0 -0
  31. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_firmware_gen.py +0 -0
  32. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_footprints.py +0 -0
  33. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_intent.py +0 -0
  34. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_inventory.py +0 -0
  35. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_jlcpcb.py +0 -0
  36. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_kicad.py +0 -0
  37. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_kicad_fab.py +0 -0
  38. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_kicad_import.py +0 -0
  39. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_kicad_pcb.py +0 -0
  40. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_kicad_render.py +0 -0
  41. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_kicad_route.py +0 -0
  42. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_library_rtttl.py +0 -0
  43. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_lorawan.py +0 -0
  44. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_lorawan_api.py +0 -0
  45. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_mcp_auth.py +0 -0
  46. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_mcp_resources.py +0 -0
  47. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_mcp_server.py +0 -0
  48. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_meshtastic.py +0 -0
  49. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_modules.py +0 -0
  50. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_pin_solver.py +0 -0
  51. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_recommend.py +0 -0
  52. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_schema.py +0 -0
  53. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_schematics_gate.py +0 -0
  54. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_security_cors.py +0 -0
  55. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_seed_onboard.py +0 -0
  56. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_serve.py +0 -0
  57. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_strict.py +0 -0
  58. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_targets.py +0 -0
  59. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_tasmota.py +0 -0
  60. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_tools_add_bus.py +0 -0
  61. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_tools_solve_pins.py +0 -0
  62. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_validate.py +0 -0
  63. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_workbench.py +0 -0
  64. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_workbench_provision.py +0 -0
  65. {wirestudio-0.26.0 → wirestudio-0.26.2}/tests/test_yaml_gen.py +0 -0
  66. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/agent/__init__.py +0 -0
  67. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/agent/agent.py +0 -0
  68. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/agent/session.py +0 -0
  69. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/agent/tools.py +0 -0
  70. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/api/__init__.py +0 -0
  71. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/api/__main__.py +0 -0
  72. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/api/circuitpython.py +0 -0
  73. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/api/meshtastic.py +0 -0
  74. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/api/schemas.py +0 -0
  75. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/api/serve.py +0 -0
  76. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/api/workbench.py +0 -0
  77. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/csp/__init__.py +0 -0
  78. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/csp/compatibility.py +0 -0
  79. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/csp/pin_solver.py +0 -0
  80. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/designs/__init__.py +0 -0
  81. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/designs/active.py +0 -0
  82. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/designs/events.py +0 -0
  83. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/designs/seed.py +0 -0
  84. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/designs/store.py +0 -0
  85. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/enclosure/__init__.py +0 -0
  86. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/enclosure/openscad.py +0 -0
  87. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/enclosure/search.py +0 -0
  88. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/__init__.py +0 -0
  89. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/analog-node.json +0 -0
  90. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/atom-echo.json +0 -0
  91. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/atom-lite.json +0 -0
  92. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/atom-matrix.json +0 -0
  93. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/atoms3-lcd.json +0 -0
  94. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/atoms3-lite.json +0 -0
  95. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/atoms3-onboard.json +0 -0
  96. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/atomu-onboard.json +0 -0
  97. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/atomu.json +0 -0
  98. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/attic-logger.json +0 -0
  99. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/awning-control.json +0 -0
  100. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/bl0906-mainmeter.json +0 -0
  101. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/blind-stepper.json +0 -0
  102. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/bluemotion.json +0 -0
  103. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/bluesonoff.json +0 -0
  104. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/button-toggles-light.json +0 -0
  105. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/c3-supermini.json +0 -0
  106. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/c6-supermini.json +0 -0
  107. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/desk-climate.json +0 -0
  108. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/desk-matrix.json +0 -0
  109. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/distance-sensor.json +0 -0
  110. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/encoder-drives-stepper.json +0 -0
  111. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/esp32-audio.json +0 -0
  112. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/esp32cam-wrover.json +0 -0
  113. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/esp32cam.json +0 -0
  114. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/flow-meter.json +0 -0
  115. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/garage-motion.json +0 -0
  116. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/grill-probe.json +0 -0
  117. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/guarded-button-light.json +0 -0
  118. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/keypad.json +0 -0
  119. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/kitchen-scale.json +0 -0
  120. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/led-display.json +0 -0
  121. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/lorawan-battery-uplink.json +0 -0
  122. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/motion-turns-on-light.json +0 -0
  123. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/multi-temp.json +0 -0
  124. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/nextion-thermostat.json +0 -0
  125. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/oled-knob.json +0 -0
  126. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/oled.json +0 -0
  127. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/parking-distance.json +0 -0
  128. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/presence-rf.json +0 -0
  129. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/rc522.json +0 -0
  130. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/room-climate.json +0 -0
  131. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/rs485-energy.json +0 -0
  132. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/s3-devkitc.json +0 -0
  133. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/s3-supermini.json +0 -0
  134. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/securitypanel.json +0 -0
  135. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/smart-plug-v1.json +0 -0
  136. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/smart-plug.json +0 -0
  137. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/solder-fan.json +0 -0
  138. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/subghz-rfid.json +0 -0
  139. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/t-beam.json +0 -0
  140. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/temp-above-turns-on-fan.json +0 -0
  141. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/temp-turns-on-fan.json +0 -0
  142. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/tft-touch.json +0 -0
  143. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/ttgo-lora32.json +0 -0
  144. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/tuya-smart-plug.json +0 -0
  145. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/wasserpir.json +0 -0
  146. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/weather-station.json +0 -0
  147. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/wemosgps.json +0 -0
  148. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/examples/xiao-grove-climate.json +0 -0
  149. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/fleet/__init__.py +0 -0
  150. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/generate/__init__.py +0 -0
  151. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/generate/__main__.py +0 -0
  152. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/generate/ascii_gen.py +0 -0
  153. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/intent.py +0 -0
  154. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/inventory/__init__.py +0 -0
  155. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/inventory/check.py +0 -0
  156. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/inventory/csv_io.py +0 -0
  157. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/inventory/store.py +0 -0
  158. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/jlcpcb/__init__.py +0 -0
  159. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/jlcpcb/__main__.py +0 -0
  160. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/jlcpcb/check.py +0 -0
  161. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/jlcpcb/client.py +0 -0
  162. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/kicad/__init__.py +0 -0
  163. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/kicad/fab.py +0 -0
  164. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/kicad/generator.py +0 -0
  165. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/kicad/import.py +0 -0
  166. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/kicad/importer.py +0 -0
  167. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/kicad/netlist.py +0 -0
  168. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/kicad/pcb.py +0 -0
  169. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/kicad/pcbnew_bridge.py +0 -0
  170. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/kicad/render.py +0 -0
  171. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/kicad/route.py +0 -0
  172. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/kicad/symbol_parser.py +0 -0
  173. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/__init__.py +0 -0
  174. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/esp01_1m.yaml +0 -0
  175. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/esp32-c3-devkitm-1.yaml +0 -0
  176. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/esp32-c3-supermini.yaml +0 -0
  177. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/esp32-c6-supermini.yaml +0 -0
  178. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/esp32-devkitc-v4.yaml +0 -0
  179. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/esp32-s3-devkitc-1.yaml +0 -0
  180. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/esp32-s3-supermini.yaml +0 -0
  181. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/esp32-wrover-cam.yaml +0 -0
  182. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/esp32cam-ai-thinker.yaml +0 -0
  183. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/esp8285-1m.yaml +0 -0
  184. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/heltec-wifi-lora32-v2.yaml +0 -0
  185. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/heltec-wifi-lora32-v3.yaml +0 -0
  186. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/heltec-wifi-lora32-v4.yaml +0 -0
  187. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/m5stack-atom-echo.yaml +0 -0
  188. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/m5stack-atom-matrix.yaml +0 -0
  189. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/m5stack-atom.yaml +0 -0
  190. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/m5stack-atoms3-lite.yaml +0 -0
  191. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/m5stack-atoms3.yaml +0 -0
  192. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/m5stack-atomu.yaml +0 -0
  193. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/nodemcu-32s.yaml +0 -0
  194. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/nodemcu-v2.yaml +0 -0
  195. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/seeed-xiao-esp32c3.yaml +0 -0
  196. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/ttgo-lora32-v1.yaml +0 -0
  197. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/ttgo-lora32-v2.yaml +0 -0
  198. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/ttgo-t-beam.yaml +0 -0
  199. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/boards/wemos-d1-mini.yaml +0 -0
  200. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/adc.yaml +0 -0
  201. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/ads1115.yaml +0 -0
  202. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/ads1115_channel.yaml +0 -0
  203. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/aht10.yaml +0 -0
  204. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/apa102.yaml +0 -0
  205. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/axp192.yaml +0 -0
  206. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/battery_adc.yaml +0 -0
  207. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/bh1750.yaml +0 -0
  208. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/bl0906.yaml +0 -0
  209. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/bme280.yaml +0 -0
  210. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/bmp180.yaml +0 -0
  211. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/bmp280.yaml +0 -0
  212. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/cc1101.yaml +0 -0
  213. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/cse7766.yaml +0 -0
  214. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/dht.yaml +0 -0
  215. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/ds18b20.yaml +0 -0
  216. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/esp32_camera.yaml +0 -0
  217. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/esp32_rmt_led_strip.yaml +0 -0
  218. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/gpio_input.yaml +0 -0
  219. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/gpio_output.yaml +0 -0
  220. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/grove-aht20.yaml +0 -0
  221. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/hc-sr04.yaml +0 -0
  222. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/hc-sr501.yaml +0 -0
  223. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/hlw8012.yaml +0 -0
  224. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/htu21d.yaml +0 -0
  225. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/hx711.yaml +0 -0
  226. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/i2s_microphone.yaml +0 -0
  227. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/ili9xxx.yaml +0 -0
  228. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/lcd_pcf8574.yaml +0 -0
  229. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/ld2420.yaml +0 -0
  230. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/max31855.yaml +0 -0
  231. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/max7219.yaml +0 -0
  232. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/max98357a.yaml +0 -0
  233. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/mcp23008.yaml +0 -0
  234. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/mcp23017.yaml +0 -0
  235. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/modbus.yaml +0 -0
  236. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/mpu6050.yaml +0 -0
  237. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/mpu6886.yaml +0 -0
  238. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/nextion.yaml +0 -0
  239. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/pcf8574.yaml +0 -0
  240. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/potentiometer.yaml +0 -0
  241. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/pulse_counter.yaml +0 -0
  242. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/pwm_fan.yaml +0 -0
  243. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/rc522.yaml +0 -0
  244. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/rcwl-0516.yaml +0 -0
  245. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/rdm6300.yaml +0 -0
  246. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/remote_transmitter.yaml +0 -0
  247. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/rf_bridge.yaml +0 -0
  248. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/rotary_encoder.yaml +0 -0
  249. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/rtttl.yaml +0 -0
  250. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/sdm_meter.yaml +0 -0
  251. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/sht3xd.yaml +0 -0
  252. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/ssd1306.yaml +0 -0
  253. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/st7789.yaml +0 -0
  254. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/sx127x.yaml +0 -0
  255. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/tm1638.yaml +0 -0
  256. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/tsl2561.yaml +0 -0
  257. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/tuya.yaml +0 -0
  258. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/tuya_sensor.yaml +0 -0
  259. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/tuya_switch.yaml +0 -0
  260. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/uart_gps.yaml +0 -0
  261. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/uln2003.yaml +0 -0
  262. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/vl53l0x.yaml +0 -0
  263. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/ws2812b.yaml +0 -0
  264. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/components/xpt2046.yaml +0 -0
  265. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/modules/env-display.yaml +0 -0
  266. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/modules/fan-controller.yaml +0 -0
  267. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/modules/motion-light.yaml +0 -0
  268. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/modules/oled-knob-13.yaml +0 -0
  269. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/library/modules/relay-4ch.yaml +0 -0
  270. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/mcp/__init__.py +0 -0
  271. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/mcp/auth.py +0 -0
  272. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/mcp/server.py +0 -0
  273. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/model.py +0 -0
  274. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/recommend/__init__.py +0 -0
  275. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/recommend/recommender.py +0 -0
  276. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/schema/__init__.py +0 -0
  277. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/schema/design.schema.json +0 -0
  278. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/seed.py +0 -0
  279. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/__init__.py +0 -0
  280. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/base.py +0 -0
  281. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/build_backend.py +0 -0
  282. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/esphome.py +0 -0
  283. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/lorawan/__init__.py +0 -0
  284. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/lorawan/__main__.py +0 -0
  285. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/lorawan/api.py +0 -0
  286. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/lorawan/build_local.py +0 -0
  287. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/lorawan/chirpstack.py +0 -0
  288. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/lorawan/codec.py +0 -0
  289. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/lorawan/compile.py +0 -0
  290. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/lorawan/firmware_gen.py +0 -0
  291. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/lorawan/templates/main.cpp.j2 +0 -0
  292. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/lorawan/templates/platformio.ini.j2 +0 -0
  293. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/lorawan/workbench_provision.py +0 -0
  294. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/targets/tasmota.py +0 -0
  295. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/validate.py +0 -0
  296. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/workbench/__init__.py +0 -0
  297. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/workbench/client.py +0 -0
  298. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio/workbench/serial.py +0 -0
  299. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio.egg-info/SOURCES.txt +0 -0
  300. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio.egg-info/dependency_links.txt +0 -0
  301. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio.egg-info/entry_points.txt +0 -0
  302. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio.egg-info/requires.txt +0 -0
  303. {wirestudio-0.26.0 → wirestudio-0.26.2}/wirestudio.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: wirestudio
3
- Version: 0.26.0
3
+ Version: 0.26.2
4
4
  Summary: Agent-driven IoT device design tool that produces ESPHome YAML.
5
5
  Author: wirestudio contributors
6
6
  License: MIT
@@ -753,3 +753,40 @@ async def test_fleet_push_lorawan_secrets_no_op_for_non_lorawan_designs(
753
753
  # The pushed YAML has no lorawan block at all; the secrets are ignored.
754
754
  assert "lorawan:" not in pushed
755
755
  assert "dev_eui" not in pushed
756
+
757
+
758
+ async def test_get_firmware_resolves_a_run_id_to_its_job_id():
759
+ """The addon keys artifacts by job_id, while the push response, the
760
+ status poll and the studio's own route are all keyed by run_id. Passing
761
+ the run_id straight through 404s, which reads as "the build produced
762
+ nothing" rather than "wrong key" -- a compile that actually succeeded
763
+ looks broken."""
764
+ addon = FakeFleetAddon()
765
+ addon.queue_jobs = [{
766
+ "id": "job-abc", "run_id": "run-1", "state": "success",
767
+ "target": "dev.yaml", "finished_at": "2026-08-01T00:00:00Z",
768
+ }]
769
+ # Stored under the job id, as the real addon does.
770
+ addon.firmware["job-abc"] = {"app": b"FAKE-APP-IMAGE", "factory": None}
771
+ fc = addon.make_client()
772
+ assert await fc.get_firmware("run-1") == b"FAKE-APP-IMAGE"
773
+
774
+
775
+ async def test_get_firmware_still_accepts_a_job_id_directly():
776
+ addon = FakeFleetAddon()
777
+ addon.firmware["job-abc"] = {"app": b"DIRECT", "factory": None}
778
+ fc = addon.make_client()
779
+ assert await fc.get_firmware("job-abc") == b"DIRECT"
780
+
781
+
782
+ async def test_get_firmware_reports_the_jobs_it_tried():
783
+ """A genuinely missing artifact should say the run's jobs were checked,
784
+ so the failure is distinguishable from the key mix-up above."""
785
+ addon = FakeFleetAddon()
786
+ addon.queue_jobs = [{
787
+ "id": "job-abc", "run_id": "run-1", "state": "success",
788
+ "target": "dev.yaml", "finished_at": "2026-08-01T00:00:00Z",
789
+ }]
790
+ fc = addon.make_client()
791
+ with pytest.raises(FleetUnavailable, match="job"):
792
+ await fc.get_firmware("run-1")
@@ -1,3 +1,3 @@
1
1
  """wirestudio: design.json -> ESPHome YAML + ASCII diagram."""
2
2
 
3
- __version__ = "0.26.0"
3
+ __version__ = "0.26.2"
@@ -1330,12 +1330,16 @@ def create_app(
1330
1330
  ``/lorawan/firmware/{cache_key}[/factory]`` so the WebSerial flow
1331
1331
  on the external-component path can reuse ``lib/flash.ts`` unchanged.
1332
1332
 
1333
+ Takes a run_id, matching the push response and the status poll.
1334
+ The addon keys artifacts by job_id, so the client resolves the run
1335
+ to its jobs when the id isn't found directly; a job_id also works
1336
+ if you happen to have one.
1337
+
1333
1338
  Returns 404 when the run hasn't finished, has aged out of the
1334
1339
  addon's tracking, or the build didn't produce the requested image
1335
1340
  type; 503 when fleet credentials are missing; 502 when the addon
1336
- is reachable but the call failed (e.g. the upstream artifact
1337
- endpoint isn't implemented yet -- see
1338
- ``docs/lorawan/fleet-firmware-flash.md``).
1341
+ is reachable but the call failed -- see
1342
+ ``docs/lorawan/fleet-firmware-flash.md``.
1339
1343
  """
1340
1344
  fc = make_fleet()
1341
1345
  if not fc.is_configured():
@@ -291,40 +291,59 @@ class FleetClient:
291
291
  ) -> bytes:
292
292
  """Fetch the compiled firmware bytes for a finished build.
293
293
 
294
- Mirrors the addon's artifact endpoint at
295
- ``GET /ui/api/jobs/{run_id}/firmware[/factory]`` (the upstream
296
- half of the headless-device flash story -- see
297
- ``docs/lorawan/fleet-firmware-flash.md``). The browser never holds
298
- ``FLEET_TOKEN``; this is the studio-side passthrough that fetches
299
- with the server token and re-streams the bytes to the WebSerial
300
- flasher via the matching studio route.
294
+ The addon stores artifacts at ``GET /ui/api/jobs/{job_id}/firmware``
295
+ keyed by **job_id**, while everything else in this flow -- the push
296
+ response, the status poll, the studio's own route -- is keyed by
297
+ run_id. Passing the run_id straight through 404s, which reads as
298
+ "the build produced nothing" rather than "wrong key", so a compile
299
+ that actually succeeded looks broken. Accepts either: tries the id
300
+ as given, then resolves the run's jobs and retries.
301
+
302
+ The browser never holds ``FLEET_TOKEN``; this is the studio-side
303
+ passthrough that fetches with the server token and re-streams the
304
+ bytes to the WebSerial flasher via the matching studio route.
301
305
 
302
306
  ``factory=False`` (default) fetches the app image (re-flash that
303
307
  preserves NVS); ``factory=True`` fetches the merged factory image
304
308
  for blank-board flashing at offset 0x0. 404 -> ``FleetUnavailable``
305
309
  the same way ``get_job_log`` handles unknown run_ids, so the UI
306
310
  can stop polling.
307
-
308
- The upstream endpoint does not exist yet at the time of writing
309
- (it's the scoped fleet half); calls will 502 via the matching
310
- studio route until the addon ships it. That gates the dialog's
311
- "Flash via WebSerial" button on the upstream rollout without
312
- changing this client surface later.
313
311
  """
314
312
  if not self.is_configured():
315
313
  raise FleetUnavailable("FLEET_URL or FLEET_TOKEN missing")
316
314
  suffix = "/factory" if factory else ""
315
+
316
+ async def _fetch(c: httpx.AsyncClient, ident: str) -> Optional[bytes]:
317
+ resp = await c.get(f"/ui/api/jobs/{ident}/firmware{suffix}")
318
+ if resp.status_code == 404:
319
+ return None
320
+ if resp.status_code >= 400:
321
+ raise FleetUnavailable(
322
+ f"firmware fetch failed: http {resp.status_code} {resp.text}"
323
+ )
324
+ return resp.content
325
+
317
326
  async with self._client() as c:
318
- resp = await c.get(f"/ui/api/jobs/{run_id}/firmware{suffix}")
319
- if resp.status_code == 404:
320
- raise FleetUnavailable(
321
- f"firmware artifact not available for run_id {run_id!r}"
322
- )
323
- if resp.status_code >= 400:
324
- raise FleetUnavailable(
325
- f"firmware fetch failed: http {resp.status_code} {resp.text}"
326
- )
327
- return resp.content
327
+ content = await _fetch(c, run_id)
328
+ if content is not None:
329
+ return content
330
+
331
+ # Not found under that id. If it was a run_id, the artifact lives
332
+ # under one of its jobs.
333
+ try:
334
+ jobs = (await self.get_run_status(run_id)).jobs
335
+ except FleetUnavailable:
336
+ jobs = []
337
+ async with self._client() as c:
338
+ for job in jobs:
339
+ content = await _fetch(c, job.job_id)
340
+ if content is not None:
341
+ return content
342
+
343
+ raise FleetUnavailable(
344
+ f"firmware artifact not available for {run_id!r}"
345
+ + (f" or its {len(jobs)} job(s)" if jobs else "")
346
+ )
328
347
 
329
348
  # ------------------------------------------------------------------
330
349
  # Internals
@@ -504,6 +504,14 @@ def build_yaml_dict(
504
504
  chip_block["framework"] = {"type": design.board.framework}
505
505
  if board.chip_variant != "esp32":
506
506
  chip_block["variant"] = board.chip_variant.upper()
507
+ # ESPHome defaults to 4 MB regardless of the PlatformIO board, so a
508
+ # 16 MB board silently gets a 4 MB partition table -- three quarters
509
+ # of the flash unused and OTA slots smaller than the chip allows.
510
+ # Nothing errors, which is why it goes unnoticed. Under-declaring is
511
+ # the safe direction (over-declaring boot-loops the bootloader on a
512
+ # size mismatch), so emit what the board file says.
513
+ if board.flash_size_mb:
514
+ chip_block["flash_size"] = f"{board.flash_size_mb}MB"
507
515
  out["esp32"] = chip_block
508
516
  else:
509
517
  out[board.chip_variant] = chip_block
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: wirestudio
3
- Version: 0.26.0
3
+ Version: 0.26.2
4
4
  Summary: Agent-driven IoT device design tool that produces ESPHome YAML.
5
5
  Author: wirestudio contributors
6
6
  License: MIT
File without changes
File without changes
File without changes
File without changes