hackshop-mcp 0.0.4 → 0.0.5

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 (64) hide show
  1. package/README.md +34 -34
  2. package/catalog.json +55 -41
  3. package/dist/build-plan/index.d.ts +10 -0
  4. package/dist/build-plan/index.js +550 -0
  5. package/dist/build-plan/index.js.map +1 -0
  6. package/dist/build-plan/types.d.ts +153 -0
  7. package/dist/build-plan/types.js +2 -0
  8. package/dist/build-plan/types.js.map +1 -0
  9. package/dist/catalog/schema.d.ts +13 -7
  10. package/dist/catalog/schema.js +2 -0
  11. package/dist/catalog/schema.js.map +1 -1
  12. package/dist/core/assess.d.ts +36 -0
  13. package/dist/core/assess.js +100 -0
  14. package/dist/core/assess.js.map +1 -0
  15. package/dist/core/errors.d.ts +2 -0
  16. package/dist/core/errors.js +70 -0
  17. package/dist/core/errors.js.map +1 -0
  18. package/dist/core/links.d.ts +3 -0
  19. package/dist/core/links.js +19 -0
  20. package/dist/core/links.js.map +1 -0
  21. package/dist/core/plan-gadget.d.ts +85 -0
  22. package/dist/core/plan-gadget.js +619 -0
  23. package/dist/core/plan-gadget.js.map +1 -0
  24. package/dist/core/resources.d.ts +37 -0
  25. package/dist/core/resources.js +143 -0
  26. package/dist/core/resources.js.map +1 -0
  27. package/dist/core/safety.d.ts +7 -0
  28. package/dist/core/safety.js +28 -0
  29. package/dist/core/safety.js.map +1 -0
  30. package/dist/core/tools.d.ts +247 -0
  31. package/dist/core/tools.js +164 -0
  32. package/dist/core/tools.js.map +1 -0
  33. package/dist/core/types.d.ts +163 -0
  34. package/dist/core/types.js +17 -0
  35. package/dist/core/types.js.map +1 -0
  36. package/dist/platforms/index.d.ts +1 -1
  37. package/dist/platforms/index.js +3 -2
  38. package/dist/platforms/index.js.map +1 -1
  39. package/dist/platforms/schema.d.ts +204 -0
  40. package/dist/platforms/schema.js +11 -0
  41. package/dist/platforms/schema.js.map +1 -1
  42. package/dist/sampling.d.ts +1 -0
  43. package/dist/sampling.js +28 -3
  44. package/dist/sampling.js.map +1 -1
  45. package/dist/server.d.ts +14 -1
  46. package/dist/server.js +97 -85
  47. package/dist/server.js.map +1 -1
  48. package/dist/site-url.d.ts +1 -0
  49. package/dist/site-url.js +4 -0
  50. package/dist/site-url.js.map +1 -0
  51. package/dist/tools/assess_hackability.d.ts +2 -33
  52. package/dist/tools/assess_hackability.js +11 -83
  53. package/dist/tools/assess_hackability.js.map +1 -1
  54. package/dist/tools/get_build_plan.d.ts +6 -0
  55. package/dist/tools/get_build_plan.js +16 -0
  56. package/dist/tools/get_build_plan.js.map +1 -0
  57. package/dist/tools/plan_gadget.d.ts +2 -64
  58. package/dist/tools/plan_gadget.js +9 -401
  59. package/dist/tools/plan_gadget.js.map +1 -1
  60. package/dist/tools/propose_hardware.d.ts +3 -0
  61. package/dist/tools/propose_hardware.js +23 -10
  62. package/dist/tools/propose_hardware.js.map +1 -1
  63. package/package.json +1 -1
  64. package/platforms.json +352 -21
package/platforms.json CHANGED
@@ -23,7 +23,7 @@
23
23
  "git clone https://github.com/facebookincubator/muse-gadget-sdk && cd muse-gadget-sdk/esp32",
24
24
  "Set the token: idf.py menuconfig > ESP32 Device SDK > Muse Gadgets SDK token (or CONFIG_GADGET_SDK_TOKEN in the build's sdkconfig).",
25
25
  "Build and flash with the board's command below, then idf.py -p PORT flash monitor. If flashing can't connect: hold BOOT, tap RESET, release BOOT.",
26
- "In the Muse app: Settings > Devices > Add Device, pick MuseGadget-XXXXXX, press the board's button when the light breathes blue. Green = connected."
26
+ "In the Muse app, turn on Settings > Devices > Developer mode, then Settings > Devices > Add Device (+). Pick MuseGadget-XXXXXX and press the board's button (BOOT on dev kits) when the light breathes blue. Green = connected."
27
27
  ],
28
28
  "agent_quickstart": "curl -fsSL https://dev.meta.ai/install.sh | sh && git clone https://github.com/facebookincubator/muse-gadget-sdk && cd muse-gadget-sdk/esp32 && muse --disable-sandbox # then: \"Build this firmware for my <board> and flash it.\" Any coding agent that reads AGENTS.md can do the same.",
29
29
  "tiers": [
@@ -74,7 +74,21 @@
74
74
  "round_display": false,
75
75
  "display_in": null
76
76
  },
77
- "note": "Status light and button. Muse's recommended starting point."
77
+ "note": "Status light and button. Muse's recommended starting point. The direct `idf.py build` command is correct; `tools/board.sh devkit build` also works.",
78
+ "parts": [
79
+ {
80
+ "name": "USB-C data cable",
81
+ "qty": 1,
82
+ "required": true,
83
+ "note": "Must carry data, not just charge. Most flashing problems are charge-only cables.",
84
+ "search": "USB-C data cable",
85
+ "est_price_usd": 8
86
+ }
87
+ ],
88
+ "try_saying": [
89
+ "What devices on my home network can you reach?",
90
+ "Blink the gadget's light when my build finishes."
91
+ ]
78
92
  },
79
93
  {
80
94
  "device_id": "ideaspark-esp32-1-9-lcd",
@@ -95,7 +109,21 @@
95
109
  "round_display": false,
96
110
  "display_in": 1.9
97
111
  },
98
- "note": "No PSRAM, so no home-network tunnel; draws images straight to the screen."
112
+ "note": "No PSRAM, so no home-network tunnel; draws images straight to the screen.",
113
+ "parts": [
114
+ {
115
+ "name": "USB-C data cable",
116
+ "qty": 1,
117
+ "required": true,
118
+ "note": "Must carry data, not just charge. Most flashing problems are charge-only cables.",
119
+ "search": "USB-C data cable",
120
+ "est_price_usd": 8
121
+ }
122
+ ],
123
+ "try_saying": [
124
+ "Show a picture of a sunset on my gadget.",
125
+ "Put today's top three tasks on the gadget's screen."
126
+ ]
99
127
  },
100
128
  {
101
129
  "device_id": "seeed-sensecap-indicator",
@@ -116,7 +144,28 @@
116
144
  "round_display": false,
117
145
  "display_in": 3.95
118
146
  },
119
- "note": "Air sensors only on D1S/D1Pro (temp/humidity via the bundled Grove AHT20)."
147
+ "note": "Air sensors only on D1S/D1Pro (temp/humidity via the bundled Grove AHT20).",
148
+ "parts": [
149
+ {
150
+ "name": "USB-C data cable",
151
+ "qty": 1,
152
+ "required": true,
153
+ "note": "Must carry data, not just charge. Most flashing problems are charge-only cables.",
154
+ "search": "USB-C data cable",
155
+ "est_price_usd": 8
156
+ },
157
+ {
158
+ "name": "Pick the D1S or D1Pro variant for air sensors",
159
+ "qty": 0,
160
+ "required": false,
161
+ "note": "The base D1 has no CO2/tVOC sensors; Muse can only read sensors the variant has.",
162
+ "buy_url": "https://www.seeedstudio.com/SenseCAP-Indicator-D1Pro-p-5644.html"
163
+ }
164
+ ],
165
+ "try_saying": [
166
+ "What's the CO2 level in my office right now?",
167
+ "Show my calendar for today on the Indicator."
168
+ ]
120
169
  },
121
170
  {
122
171
  "device_id": "seeed-reterminal-e1001",
@@ -137,7 +186,21 @@
137
186
  "round_display": false,
138
187
  "display_in": 7.5
139
188
  },
140
- "note": "Status text and black-and-white images on 7.5\" e-paper."
189
+ "note": "Status text and black-and-white images on 7.5\" e-paper.",
190
+ "parts": [
191
+ {
192
+ "name": "USB-C data cable",
193
+ "qty": 1,
194
+ "required": true,
195
+ "note": "Must carry data, not just charge. Most flashing problems are charge-only cables.",
196
+ "search": "USB-C data cable",
197
+ "est_price_usd": 8
198
+ }
199
+ ],
200
+ "try_saying": [
201
+ "Put this week's family calendar on the e-paper board.",
202
+ "Show a black-and-white photo of the kids on the board."
203
+ ]
141
204
  },
142
205
  {
143
206
  "device_id": "home-assistant-voice-pe",
@@ -158,7 +221,29 @@
158
221
  "round_display": false,
159
222
  "display_in": null
160
223
  },
161
- "note": "Status on the LED ring, push-to-talk, dial as volume."
224
+ "note": "Status on the LED ring, push-to-talk, dial as volume.",
225
+ "parts": [
226
+ {
227
+ "name": "USB-C power supply (5 V / 2 A)",
228
+ "qty": 1,
229
+ "required": true,
230
+ "note": "The Voice PE is USB-C powered; a phone charger that supplies 5 V / 2 A works.",
231
+ "search": "USB-C power adapter 5V 2A",
232
+ "est_price_usd": 10
233
+ },
234
+ {
235
+ "name": "USB-C data cable",
236
+ "qty": 1,
237
+ "required": true,
238
+ "note": "Must carry data, not just charge. Most flashing problems are charge-only cables.",
239
+ "search": "USB-C data cable",
240
+ "est_price_usd": 8
241
+ }
242
+ ],
243
+ "try_saying": [
244
+ "(Press the button) What's on my calendar tomorrow?",
245
+ "(Press the button) Turn the volume down."
246
+ ]
162
247
  },
163
248
  {
164
249
  "device_id": "waveshare-esp32-s3-touch-amoled-1-75c",
@@ -179,7 +264,29 @@
179
264
  "round_display": true,
180
265
  "display_in": 1.75
181
266
  },
182
- "note": "Round AMOLED avatar; best desk object."
267
+ "note": "Round AMOLED avatar; best desk object.",
268
+ "parts": [
269
+ {
270
+ "name": "USB-C data cable",
271
+ "qty": 1,
272
+ "required": true,
273
+ "note": "Must carry data, not just charge. Most flashing problems are charge-only cables.",
274
+ "search": "USB-C data cable",
275
+ "est_price_usd": 8
276
+ },
277
+ {
278
+ "name": "3.7 V Li-ion cell with MX1.25 connector",
279
+ "qty": 1,
280
+ "required": false,
281
+ "note": "Optional, for cordless use. Buy the battery SKU or check the Waveshare wiki for the cell size before ordering one separately.",
282
+ "buy_url": "https://www.waveshare.com/esp32-s3-touch-amoled-1.75c.htm",
283
+ "est_price_usd": 8
284
+ }
285
+ ],
286
+ "try_saying": [
287
+ "(Hold to talk) What are you working on?",
288
+ "Show me the image you just found."
289
+ ]
183
290
  },
184
291
  {
185
292
  "device_id": "aipi-lite",
@@ -200,7 +307,21 @@
200
307
  "round_display": false,
201
308
  "display_in": null
202
309
  },
203
- "note": "Palm-size voice buddy with a snap-on battery and a two-button menu."
310
+ "note": "Palm-size voice buddy with a snap-on battery and a two-button menu.",
311
+ "parts": [
312
+ {
313
+ "name": "USB-C data cable",
314
+ "qty": 1,
315
+ "required": true,
316
+ "note": "Must carry data, not just charge. Most flashing problems are charge-only cables.",
317
+ "search": "USB-C data cable",
318
+ "est_price_usd": 8
319
+ }
320
+ ],
321
+ "try_saying": [
322
+ "(Hold to talk) Remind me to call the dentist at 3.",
323
+ "Show me today's weather icon."
324
+ ]
204
325
  },
205
326
  {
206
327
  "device_id": "waveshare-esp32-c6-touch-amoled-1-8",
@@ -221,7 +342,29 @@
221
342
  "round_display": false,
222
343
  "display_in": 1.8
223
344
  },
224
- "note": "No PSRAM: voice notes go over the control session and replies come back as scrolling text."
345
+ "note": "No PSRAM: voice notes go over the control session and replies come back as scrolling text.",
346
+ "parts": [
347
+ {
348
+ "name": "USB-C data cable",
349
+ "qty": 1,
350
+ "required": true,
351
+ "note": "Must carry data, not just charge. Most flashing problems are charge-only cables.",
352
+ "search": "USB-C data cable",
353
+ "est_price_usd": 8
354
+ },
355
+ {
356
+ "name": "3.7 V Li-ion cell with MX1.25 connector",
357
+ "qty": 1,
358
+ "required": false,
359
+ "note": "Optional. Waveshare recommends a thin cell around 3.85 x 24 x 28 mm; check the wiki before buying.",
360
+ "buy_url": "https://docs.waveshare.com/ESP32-C6-Touch-AMOLED-1.8",
361
+ "est_price_usd": 8
362
+ }
363
+ ],
364
+ "try_saying": [
365
+ "(Hold to talk) Summarize my unread email.",
366
+ "What's the status of the task you're running?"
367
+ ]
225
368
  },
226
369
  {
227
370
  "device_id": "seeed-sensecap-watcher",
@@ -242,7 +385,21 @@
242
385
  "round_display": true,
243
386
  "display_in": 1.45
244
387
  },
245
- "note": "camera.capture returns a JPEG (CONFIG_MUSE_WATCHER_CAMERA=y)."
388
+ "note": "camera.capture returns a JPEG (CONFIG_MUSE_WATCHER_CAMERA=y).",
389
+ "parts": [
390
+ {
391
+ "name": "USB-C data cable",
392
+ "qty": 1,
393
+ "required": true,
394
+ "note": "Must carry data, not just charge. Most flashing problems are charge-only cables.",
395
+ "search": "USB-C data cable",
396
+ "est_price_usd": 8
397
+ }
398
+ ],
399
+ "try_saying": [
400
+ "Take a picture of my 3D printer and tell me if the print failed.",
401
+ "Is anyone at my desk right now?"
402
+ ]
246
403
  },
247
404
  {
248
405
  "device_id": "m5stack-sticks3",
@@ -263,7 +420,21 @@
263
420
  "round_display": false,
264
421
  "display_in": 1.14
265
422
  },
266
- "note": "Pocket stick with speaker, mic, IMU and battery; the best push-to-talk remote."
423
+ "note": "Pocket stick with speaker, mic, IMU and battery; the best push-to-talk remote.",
424
+ "parts": [
425
+ {
426
+ "name": "USB-C data cable",
427
+ "qty": 1,
428
+ "required": true,
429
+ "note": "Must carry data, not just charge. Most flashing problems are charge-only cables.",
430
+ "search": "USB-C data cable",
431
+ "est_price_usd": 8
432
+ }
433
+ ],
434
+ "try_saying": [
435
+ "(Hold to talk) Add milk to the grocery list.",
436
+ "Show me the picture you made."
437
+ ]
267
438
  },
268
439
  {
269
440
  "device_id": "m5stack-stickc-plus2",
@@ -285,7 +456,21 @@
285
456
  "display_in": 1.14
286
457
  },
287
458
  "eol": true,
288
- "note": "End of life at M5Stack; buzzer only, so no spoken replies."
459
+ "note": "End of life at M5Stack; buzzer only, so no spoken replies.",
460
+ "parts": [
461
+ {
462
+ "name": "USB-C data cable",
463
+ "qty": 1,
464
+ "required": true,
465
+ "note": "Must carry data, not just charge. Most flashing problems are charge-only cables.",
466
+ "search": "USB-C data cable",
467
+ "est_price_usd": 8
468
+ }
469
+ ],
470
+ "try_saying": [
471
+ "(Hold to talk) Add milk to the grocery list.",
472
+ "Show me the picture you made."
473
+ ]
289
474
  }
290
475
  ],
291
476
  "sources": [
@@ -312,7 +497,7 @@
312
497
  "summary": "A Python service (musegadget) that turns a Linux box with Bluetooth LE into a Muse gadget. Muse gets shell, file and health commands on the machine and can push messages back to you.",
313
498
  "toolchain": "Python 3.9+, BlueZ, python3-dbus and python3-gi; Raspberry Pi OS Bullseye+, Debian 11+ or Ubuntu 22.04+ (32- or 64-bit); sudo.",
314
499
  "requires": [
315
- "A Muse account and the Muse app with Developer mode on",
500
+ "A Muse account and the Muse app with Settings > Devices > Developer mode on",
316
501
  "An SDK token (mgst_...) from gadgets.muse.ai",
317
502
  "A Linux machine with Bluetooth LE on your network"
318
503
  ],
@@ -320,7 +505,7 @@
320
505
  "curl -fsSL https://raw.githubusercontent.com/facebookincubator/muse-gadget-sdk/main/linux/install.sh -o install.sh",
321
506
  "Read it first: less install.sh",
322
507
  "bash install.sh --sdk-token mgst_... (installs to /opt/musegadget and starts the musegadget systemd service)",
323
- "Pair from the Muse app within 10 minutes (device shows as MuseGadgetXXXXXX); re-pair later with sudo musegadget pair.",
508
+ "In the Muse app, turn on Settings > Devices > Developer mode, then Settings > Devices > Add Device (+). Pick MuseGadget-XXXXXX within 10 minutes of install. Green = connected; re-pair later with sudo musegadget pair.",
324
509
  "Optional: push messages to Muse from scripts with musegadget send-user-msg \"...\""
325
510
  ],
326
511
  "agent_quickstart": "Ask Muse (or any coding agent on the box) things like: \"Install Home Assistant on my Pi and tell me how to open it.\"",
@@ -363,7 +548,37 @@
363
548
  "ble_builtin": true,
364
549
  "compute": "standard"
365
550
  },
366
- "note": "Featured on gadgets.muse.ai."
551
+ "note": "Featured on gadgets.muse.ai.",
552
+ "parts": [
553
+ {
554
+ "name": "Official 27 W USB-C power supply",
555
+ "qty": 1,
556
+ "required": true,
557
+ "note": "The Pi 5 needs 5 V / 5 A for full USB power.",
558
+ "buy_url": "https://www.raspberrypi.com/products/27w-power-supply/",
559
+ "est_price_usd": 12
560
+ },
561
+ {
562
+ "name": "microSD card, 32 GB or larger",
563
+ "qty": 1,
564
+ "required": true,
565
+ "note": "Flash Raspberry Pi OS (Bookworm) with Raspberry Pi Imager.",
566
+ "search": "microSD 32GB A2",
567
+ "est_price_usd": 10
568
+ },
569
+ {
570
+ "name": "Case with active cooler",
571
+ "qty": 1,
572
+ "required": false,
573
+ "note": "Recommended if it will also run Home Assistant.",
574
+ "search": "Raspberry Pi 5 case active cooler",
575
+ "est_price_usd": 12
576
+ }
577
+ ],
578
+ "try_saying": [
579
+ "Install Home Assistant on my Pi and tell me how to open it.",
580
+ "How much disk space is left on the Pi?"
581
+ ]
367
582
  },
368
583
  {
369
584
  "device_id": "raspberry-pi-4b",
@@ -375,7 +590,29 @@
375
590
  "ble_builtin": true,
376
591
  "compute": "standard"
377
592
  },
378
- "note": "Listed in the Linux SDK README."
593
+ "note": "Listed in the Linux SDK README.",
594
+ "parts": [
595
+ {
596
+ "name": "USB-C power supply (5.1 V / 3 A)",
597
+ "qty": 1,
598
+ "required": true,
599
+ "note": "The official 15.3 W supply avoids undervoltage warnings.",
600
+ "buy_url": "https://www.raspberrypi.com/products/type-c-power-supply/",
601
+ "est_price_usd": 10
602
+ },
603
+ {
604
+ "name": "microSD card, 16 GB or larger",
605
+ "qty": 1,
606
+ "required": true,
607
+ "note": "Flash Raspberry Pi OS with Raspberry Pi Imager.",
608
+ "search": "microSD 32GB A1",
609
+ "est_price_usd": 10
610
+ }
611
+ ],
612
+ "try_saying": [
613
+ "Install Home Assistant on my Pi and tell me how to open it.",
614
+ "Check the Pi's temperature and uptime."
615
+ ]
379
616
  },
380
617
  {
381
618
  "device_id": "raspberry-pi-zero-2w",
@@ -387,7 +624,29 @@
387
624
  "ble_builtin": true,
388
625
  "compute": "light"
389
626
  },
390
- "note": "Listed in the Linux SDK README; slow but enough for shell and file commands."
627
+ "note": "Listed in the Linux SDK README; slow but enough for shell and file commands.",
628
+ "parts": [
629
+ {
630
+ "name": "Micro-USB power supply (5 V / 2.5 A)",
631
+ "qty": 1,
632
+ "required": true,
633
+ "note": "Use the PWR port, not the USB data port.",
634
+ "search": "Raspberry Pi micro USB power supply 2.5A",
635
+ "est_price_usd": 8
636
+ },
637
+ {
638
+ "name": "microSD card, 16 GB or larger",
639
+ "qty": 1,
640
+ "required": true,
641
+ "note": "Flash Raspberry Pi OS Lite (64-bit) with Raspberry Pi Imager.",
642
+ "search": "microSD 32GB A1",
643
+ "est_price_usd": 10
644
+ }
645
+ ],
646
+ "try_saying": [
647
+ "Check the Pi's temperature and uptime.",
648
+ "Message me if the garage sensor script stops."
649
+ ]
391
650
  },
392
651
  {
393
652
  "device_id": "dell-wyse-5070",
@@ -399,7 +658,29 @@
399
658
  "ble_builtin": false,
400
659
  "compute": "desktop"
401
660
  },
402
- "note": "Not on Meta's list. Meets the stated requirements on Debian/Ubuntu if it has Bluetooth LE; most units need a USB BLE adapter."
661
+ "note": "Not on Meta's list. Meets the stated requirements on Debian/Ubuntu if it has Bluetooth LE; most units need a USB BLE adapter.",
662
+ "parts": [
663
+ {
664
+ "name": "USB Bluetooth LE adapter",
665
+ "qty": 1,
666
+ "required": true,
667
+ "note": "Most units have no Bluetooth; the Muse Linux SDK needs BLE to pair.",
668
+ "search": "USB Bluetooth 5.0 adapter Linux",
669
+ "est_price_usd": 12
670
+ },
671
+ {
672
+ "name": "USB stick for the Debian/Ubuntu installer",
673
+ "qty": 1,
674
+ "required": true,
675
+ "note": "8 GB or larger.",
676
+ "search": "USB flash drive 16GB",
677
+ "est_price_usd": 6
678
+ }
679
+ ],
680
+ "try_saying": [
681
+ "Set up a nightly backup of my photos folder on this box.",
682
+ "How much disk space is left?"
683
+ ]
403
684
  },
404
685
  {
405
686
  "device_id": "hp-t620-plus",
@@ -411,7 +692,29 @@
411
692
  "ble_builtin": false,
412
693
  "compute": "desktop"
413
694
  },
414
- "note": "Not on Meta's list. Add a USB Bluetooth LE adapter."
695
+ "note": "Not on Meta's list. Add a USB Bluetooth LE adapter.",
696
+ "parts": [
697
+ {
698
+ "name": "USB Bluetooth LE adapter",
699
+ "qty": 1,
700
+ "required": true,
701
+ "note": "The Muse Linux SDK needs BLE to pair.",
702
+ "search": "USB Bluetooth 5.0 adapter Linux",
703
+ "est_price_usd": 12
704
+ },
705
+ {
706
+ "name": "USB stick for the Debian/Ubuntu installer",
707
+ "qty": 1,
708
+ "required": true,
709
+ "note": "8 GB or larger.",
710
+ "search": "USB flash drive 16GB",
711
+ "est_price_usd": 6
712
+ }
713
+ ],
714
+ "try_saying": [
715
+ "Set up a nightly backup of my photos folder on this box.",
716
+ "How much disk space is left?"
717
+ ]
415
718
  },
416
719
  {
417
720
  "device_id": "intel-nuc",
@@ -423,7 +726,21 @@
423
726
  "ble_builtin": null,
424
727
  "compute": "desktop"
425
728
  },
426
- "note": "Not on Meta's list. Many NUCs ship with Bluetooth; check yours."
729
+ "note": "Not on Meta's list. Many NUCs ship with Bluetooth; check yours.",
730
+ "parts": [
731
+ {
732
+ "name": "USB Bluetooth LE adapter (only if yours has none)",
733
+ "qty": 1,
734
+ "required": false,
735
+ "note": "Many NUCs have Bluetooth built in; check with bluetoothctl list.",
736
+ "search": "USB Bluetooth 5.0 adapter Linux",
737
+ "est_price_usd": 12
738
+ }
739
+ ],
740
+ "try_saying": [
741
+ "Install Home Assistant in Docker and tell me how to open it.",
742
+ "How much disk space is left?"
743
+ ]
427
744
  },
428
745
  {
429
746
  "device_id": "lenovo-thinkcentre-tiny",
@@ -435,7 +752,21 @@
435
752
  "ble_builtin": null,
436
753
  "compute": "desktop"
437
754
  },
438
- "note": "Not on Meta's list. Bluetooth depends on the Wi-Fi card fitted; add a USB BLE adapter if missing."
755
+ "note": "Not on Meta's list. Bluetooth depends on the Wi-Fi card fitted; add a USB BLE adapter if missing.",
756
+ "parts": [
757
+ {
758
+ "name": "USB Bluetooth LE adapter (only if yours has none)",
759
+ "qty": 1,
760
+ "required": false,
761
+ "note": "Bluetooth depends on the Wi-Fi card fitted.",
762
+ "search": "USB Bluetooth 5.0 adapter Linux",
763
+ "est_price_usd": 12
764
+ }
765
+ ],
766
+ "try_saying": [
767
+ "Install Home Assistant in Docker and tell me how to open it.",
768
+ "How much disk space is left?"
769
+ ]
439
770
  }
440
771
  ],
441
772
  "sources": [