hackshop-mcp 0.0.3 → 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 (74) hide show
  1. package/README.md +88 -34
  2. package/catalog.json +1584 -25
  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 +523 -7
  10. package/dist/catalog/schema.js +49 -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 +26 -0
  37. package/dist/platforms/index.js +52 -0
  38. package/dist/platforms/index.js.map +1 -0
  39. package/dist/platforms/load.d.ts +4 -0
  40. package/dist/platforms/load.js +78 -0
  41. package/dist/platforms/load.js.map +1 -0
  42. package/dist/platforms/schema.d.ts +587 -0
  43. package/dist/platforms/schema.js +64 -0
  44. package/dist/platforms/schema.js.map +1 -0
  45. package/dist/sampling.d.ts +5 -0
  46. package/dist/sampling.js +44 -21
  47. package/dist/sampling.js.map +1 -1
  48. package/dist/server.d.ts +14 -1
  49. package/dist/server.js +164 -40
  50. package/dist/server.js.map +1 -1
  51. package/dist/site-url.d.ts +1 -0
  52. package/dist/site-url.js +4 -0
  53. package/dist/site-url.js.map +1 -0
  54. package/dist/telemetry.d.ts +29 -0
  55. package/dist/telemetry.js +100 -0
  56. package/dist/telemetry.js.map +1 -0
  57. package/dist/tools/assess_hackability.d.ts +2 -29
  58. package/dist/tools/assess_hackability.js +11 -43
  59. package/dist/tools/assess_hackability.js.map +1 -1
  60. package/dist/tools/get_build_plan.d.ts +6 -0
  61. package/dist/tools/get_build_plan.js +16 -0
  62. package/dist/tools/get_build_plan.js.map +1 -0
  63. package/dist/tools/plan_gadget.d.ts +4 -0
  64. package/dist/tools/plan_gadget.js +14 -0
  65. package/dist/tools/plan_gadget.js.map +1 -0
  66. package/dist/tools/propose_hardware.d.ts +5 -0
  67. package/dist/tools/propose_hardware.js +57 -8
  68. package/dist/tools/propose_hardware.js.map +1 -1
  69. package/dist/tools/simulate_assembly.d.ts +315 -0
  70. package/dist/tools/simulate_assembly.js +145 -0
  71. package/dist/tools/simulate_assembly.js.map +1 -0
  72. package/package.json +4 -1
  73. package/platforms.json +779 -0
  74. package/tags.md +1 -0
@@ -1,7 +1,136 @@
1
1
  import { z } from "zod";
2
2
  export declare const Category: z.ZodEnum<["display", "speaker", "input", "sensor", "bulb", "sbc", "handheld", "mini-pc", "wearable", "router", "other"]>;
3
- export declare const Provenance: z.ZodEnum<["founder-verified", "community-reported", "llm-inferred"]>;
3
+ export declare const Provenance: z.ZodEnum<["founder-verified", "community-reported", "llm-inferred", "vendor-docs"]>;
4
4
  export declare const CommunitySize: z.ZodEnum<["tiny", "small", "active", "thriving"]>;
5
+ export declare const Physical: z.ZodEffects<z.ZodObject<{
6
+ orientation: z.ZodEnum<["upright", "flat"]>;
7
+ shape: z.ZodEnum<["board", "box", "round"]>;
8
+ size_mm: z.ZodObject<{
9
+ w: z.ZodNumber;
10
+ h: z.ZodNumber;
11
+ t: z.ZodNullable<z.ZodNumber>;
12
+ }, "strip", z.ZodTypeAny, {
13
+ w: number;
14
+ h: number;
15
+ t: number | null;
16
+ }, {
17
+ w: number;
18
+ h: number;
19
+ t: number | null;
20
+ }>;
21
+ size_confidence: z.ZodEnum<["published", "drawing", "approximate", "conflicting"]>;
22
+ size_note: z.ZodOptional<z.ZodString>;
23
+ corner_radius_mm: z.ZodOptional<z.ZodNumber>;
24
+ comes_in_case: z.ZodBoolean;
25
+ mass_g: z.ZodNullable<z.ZodNumber>;
26
+ usb: z.ZodNullable<z.ZodObject<{
27
+ type: z.ZodString;
28
+ count: z.ZodNumber;
29
+ faces: z.ZodArray<z.ZodEnum<["front", "back", "top", "bottom", "left", "right"]>, "many">;
30
+ note: z.ZodOptional<z.ZodString>;
31
+ }, "strip", z.ZodTypeAny, {
32
+ type: string;
33
+ count: number;
34
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
35
+ note?: string | undefined;
36
+ }, {
37
+ type: string;
38
+ count: number;
39
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
40
+ note?: string | undefined;
41
+ }>>;
42
+ mounting: z.ZodNullable<z.ZodString>;
43
+ printables: z.ZodDefault<z.ZodArray<z.ZodEnum<["desk-stand", "enclosure"]>, "many">>;
44
+ source_url: z.ZodString;
45
+ }, "strip", z.ZodTypeAny, {
46
+ orientation: "flat" | "upright";
47
+ shape: "board" | "box" | "round";
48
+ size_mm: {
49
+ w: number;
50
+ h: number;
51
+ t: number | null;
52
+ };
53
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
54
+ comes_in_case: boolean;
55
+ mass_g: number | null;
56
+ usb: {
57
+ type: string;
58
+ count: number;
59
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
60
+ note?: string | undefined;
61
+ } | null;
62
+ mounting: string | null;
63
+ printables: ("desk-stand" | "enclosure")[];
64
+ source_url: string;
65
+ size_note?: string | undefined;
66
+ corner_radius_mm?: number | undefined;
67
+ }, {
68
+ orientation: "flat" | "upright";
69
+ shape: "board" | "box" | "round";
70
+ size_mm: {
71
+ w: number;
72
+ h: number;
73
+ t: number | null;
74
+ };
75
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
76
+ comes_in_case: boolean;
77
+ mass_g: number | null;
78
+ usb: {
79
+ type: string;
80
+ count: number;
81
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
82
+ note?: string | undefined;
83
+ } | null;
84
+ mounting: string | null;
85
+ source_url: string;
86
+ size_note?: string | undefined;
87
+ corner_radius_mm?: number | undefined;
88
+ printables?: ("desk-stand" | "enclosure")[] | undefined;
89
+ }>, {
90
+ orientation: "flat" | "upright";
91
+ shape: "board" | "box" | "round";
92
+ size_mm: {
93
+ w: number;
94
+ h: number;
95
+ t: number | null;
96
+ };
97
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
98
+ comes_in_case: boolean;
99
+ mass_g: number | null;
100
+ usb: {
101
+ type: string;
102
+ count: number;
103
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
104
+ note?: string | undefined;
105
+ } | null;
106
+ mounting: string | null;
107
+ printables: ("desk-stand" | "enclosure")[];
108
+ source_url: string;
109
+ size_note?: string | undefined;
110
+ corner_radius_mm?: number | undefined;
111
+ }, {
112
+ orientation: "flat" | "upright";
113
+ shape: "board" | "box" | "round";
114
+ size_mm: {
115
+ w: number;
116
+ h: number;
117
+ t: number | null;
118
+ };
119
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
120
+ comes_in_case: boolean;
121
+ mass_g: number | null;
122
+ usb: {
123
+ type: string;
124
+ count: number;
125
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
126
+ note?: string | undefined;
127
+ } | null;
128
+ mounting: string | null;
129
+ source_url: string;
130
+ size_note?: string | undefined;
131
+ corner_radius_mm?: number | undefined;
132
+ printables?: ("desk-stand" | "enclosure")[] | undefined;
133
+ }>;
5
134
  export declare const DeviceEntry: z.ZodObject<{
6
135
  id: z.ZodString;
7
136
  name: z.ZodString;
@@ -9,11 +138,146 @@ export declare const DeviceEntry: z.ZodObject<{
9
138
  idea_fit_tags: z.ZodArray<z.ZodString, "many">;
10
139
  hack_difficulty: z.ZodNumber;
11
140
  brick_risk: z.ZodNumber;
12
- brick_provenance: z.ZodEnum<["founder-verified", "community-reported", "llm-inferred"]>;
141
+ brick_provenance: z.ZodEnum<["founder-verified", "community-reported", "llm-inferred", "vendor-docs"]>;
13
142
  last_verified: z.ZodString;
14
143
  firmware_links: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
15
144
  community_size_bucket: z.ZodEnum<["tiny", "small", "active", "thriving"]>;
16
145
  notes: z.ZodString;
146
+ est_used_price_usd_min: z.ZodOptional<z.ZodNumber>;
147
+ est_used_price_usd_max: z.ZodOptional<z.ZodNumber>;
148
+ buy_url: z.ZodOptional<z.ZodString>;
149
+ image_url: z.ZodOptional<z.ZodString>;
150
+ est_setup_hours_min: z.ZodOptional<z.ZodNumber>;
151
+ est_setup_hours_max: z.ZodOptional<z.ZodNumber>;
152
+ physical: z.ZodOptional<z.ZodEffects<z.ZodObject<{
153
+ orientation: z.ZodEnum<["upright", "flat"]>;
154
+ shape: z.ZodEnum<["board", "box", "round"]>;
155
+ size_mm: z.ZodObject<{
156
+ w: z.ZodNumber;
157
+ h: z.ZodNumber;
158
+ t: z.ZodNullable<z.ZodNumber>;
159
+ }, "strip", z.ZodTypeAny, {
160
+ w: number;
161
+ h: number;
162
+ t: number | null;
163
+ }, {
164
+ w: number;
165
+ h: number;
166
+ t: number | null;
167
+ }>;
168
+ size_confidence: z.ZodEnum<["published", "drawing", "approximate", "conflicting"]>;
169
+ size_note: z.ZodOptional<z.ZodString>;
170
+ corner_radius_mm: z.ZodOptional<z.ZodNumber>;
171
+ comes_in_case: z.ZodBoolean;
172
+ mass_g: z.ZodNullable<z.ZodNumber>;
173
+ usb: z.ZodNullable<z.ZodObject<{
174
+ type: z.ZodString;
175
+ count: z.ZodNumber;
176
+ faces: z.ZodArray<z.ZodEnum<["front", "back", "top", "bottom", "left", "right"]>, "many">;
177
+ note: z.ZodOptional<z.ZodString>;
178
+ }, "strip", z.ZodTypeAny, {
179
+ type: string;
180
+ count: number;
181
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
182
+ note?: string | undefined;
183
+ }, {
184
+ type: string;
185
+ count: number;
186
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
187
+ note?: string | undefined;
188
+ }>>;
189
+ mounting: z.ZodNullable<z.ZodString>;
190
+ printables: z.ZodDefault<z.ZodArray<z.ZodEnum<["desk-stand", "enclosure"]>, "many">>;
191
+ source_url: z.ZodString;
192
+ }, "strip", z.ZodTypeAny, {
193
+ orientation: "flat" | "upright";
194
+ shape: "board" | "box" | "round";
195
+ size_mm: {
196
+ w: number;
197
+ h: number;
198
+ t: number | null;
199
+ };
200
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
201
+ comes_in_case: boolean;
202
+ mass_g: number | null;
203
+ usb: {
204
+ type: string;
205
+ count: number;
206
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
207
+ note?: string | undefined;
208
+ } | null;
209
+ mounting: string | null;
210
+ printables: ("desk-stand" | "enclosure")[];
211
+ source_url: string;
212
+ size_note?: string | undefined;
213
+ corner_radius_mm?: number | undefined;
214
+ }, {
215
+ orientation: "flat" | "upright";
216
+ shape: "board" | "box" | "round";
217
+ size_mm: {
218
+ w: number;
219
+ h: number;
220
+ t: number | null;
221
+ };
222
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
223
+ comes_in_case: boolean;
224
+ mass_g: number | null;
225
+ usb: {
226
+ type: string;
227
+ count: number;
228
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
229
+ note?: string | undefined;
230
+ } | null;
231
+ mounting: string | null;
232
+ source_url: string;
233
+ size_note?: string | undefined;
234
+ corner_radius_mm?: number | undefined;
235
+ printables?: ("desk-stand" | "enclosure")[] | undefined;
236
+ }>, {
237
+ orientation: "flat" | "upright";
238
+ shape: "board" | "box" | "round";
239
+ size_mm: {
240
+ w: number;
241
+ h: number;
242
+ t: number | null;
243
+ };
244
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
245
+ comes_in_case: boolean;
246
+ mass_g: number | null;
247
+ usb: {
248
+ type: string;
249
+ count: number;
250
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
251
+ note?: string | undefined;
252
+ } | null;
253
+ mounting: string | null;
254
+ printables: ("desk-stand" | "enclosure")[];
255
+ source_url: string;
256
+ size_note?: string | undefined;
257
+ corner_radius_mm?: number | undefined;
258
+ }, {
259
+ orientation: "flat" | "upright";
260
+ shape: "board" | "box" | "round";
261
+ size_mm: {
262
+ w: number;
263
+ h: number;
264
+ t: number | null;
265
+ };
266
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
267
+ comes_in_case: boolean;
268
+ mass_g: number | null;
269
+ usb: {
270
+ type: string;
271
+ count: number;
272
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
273
+ note?: string | undefined;
274
+ } | null;
275
+ mounting: string | null;
276
+ source_url: string;
277
+ size_note?: string | undefined;
278
+ corner_radius_mm?: number | undefined;
279
+ printables?: ("desk-stand" | "enclosure")[] | undefined;
280
+ }>>;
17
281
  }, "strip", z.ZodTypeAny, {
18
282
  id: string;
19
283
  name: string;
@@ -21,11 +285,40 @@ export declare const DeviceEntry: z.ZodObject<{
21
285
  idea_fit_tags: string[];
22
286
  hack_difficulty: number;
23
287
  brick_risk: number;
24
- brick_provenance: "founder-verified" | "community-reported" | "llm-inferred";
288
+ brick_provenance: "founder-verified" | "community-reported" | "llm-inferred" | "vendor-docs";
25
289
  last_verified: string;
26
290
  firmware_links: string[];
27
291
  community_size_bucket: "tiny" | "small" | "active" | "thriving";
28
292
  notes: string;
293
+ est_used_price_usd_min?: number | undefined;
294
+ est_used_price_usd_max?: number | undefined;
295
+ buy_url?: string | undefined;
296
+ image_url?: string | undefined;
297
+ est_setup_hours_min?: number | undefined;
298
+ est_setup_hours_max?: number | undefined;
299
+ physical?: {
300
+ orientation: "flat" | "upright";
301
+ shape: "board" | "box" | "round";
302
+ size_mm: {
303
+ w: number;
304
+ h: number;
305
+ t: number | null;
306
+ };
307
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
308
+ comes_in_case: boolean;
309
+ mass_g: number | null;
310
+ usb: {
311
+ type: string;
312
+ count: number;
313
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
314
+ note?: string | undefined;
315
+ } | null;
316
+ mounting: string | null;
317
+ printables: ("desk-stand" | "enclosure")[];
318
+ source_url: string;
319
+ size_note?: string | undefined;
320
+ corner_radius_mm?: number | undefined;
321
+ } | undefined;
29
322
  }, {
30
323
  id: string;
31
324
  name: string;
@@ -33,15 +326,45 @@ export declare const DeviceEntry: z.ZodObject<{
33
326
  idea_fit_tags: string[];
34
327
  hack_difficulty: number;
35
328
  brick_risk: number;
36
- brick_provenance: "founder-verified" | "community-reported" | "llm-inferred";
329
+ brick_provenance: "founder-verified" | "community-reported" | "llm-inferred" | "vendor-docs";
37
330
  last_verified: string;
38
331
  community_size_bucket: "tiny" | "small" | "active" | "thriving";
39
332
  notes: string;
40
333
  firmware_links?: string[] | undefined;
334
+ est_used_price_usd_min?: number | undefined;
335
+ est_used_price_usd_max?: number | undefined;
336
+ buy_url?: string | undefined;
337
+ image_url?: string | undefined;
338
+ est_setup_hours_min?: number | undefined;
339
+ est_setup_hours_max?: number | undefined;
340
+ physical?: {
341
+ orientation: "flat" | "upright";
342
+ shape: "board" | "box" | "round";
343
+ size_mm: {
344
+ w: number;
345
+ h: number;
346
+ t: number | null;
347
+ };
348
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
349
+ comes_in_case: boolean;
350
+ mass_g: number | null;
351
+ usb: {
352
+ type: string;
353
+ count: number;
354
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
355
+ note?: string | undefined;
356
+ } | null;
357
+ mounting: string | null;
358
+ source_url: string;
359
+ size_note?: string | undefined;
360
+ corner_radius_mm?: number | undefined;
361
+ printables?: ("desk-stand" | "enclosure")[] | undefined;
362
+ } | undefined;
41
363
  }>;
42
364
  export type DeviceEntry = z.infer<typeof DeviceEntry>;
43
365
  export type Category = z.infer<typeof Category>;
44
366
  export type Provenance = z.infer<typeof Provenance>;
367
+ export type Physical = z.infer<typeof Physical>;
45
368
  export declare const Catalog: z.ZodArray<z.ZodObject<{
46
369
  id: z.ZodString;
47
370
  name: z.ZodString;
@@ -49,11 +372,146 @@ export declare const Catalog: z.ZodArray<z.ZodObject<{
49
372
  idea_fit_tags: z.ZodArray<z.ZodString, "many">;
50
373
  hack_difficulty: z.ZodNumber;
51
374
  brick_risk: z.ZodNumber;
52
- brick_provenance: z.ZodEnum<["founder-verified", "community-reported", "llm-inferred"]>;
375
+ brick_provenance: z.ZodEnum<["founder-verified", "community-reported", "llm-inferred", "vendor-docs"]>;
53
376
  last_verified: z.ZodString;
54
377
  firmware_links: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
55
378
  community_size_bucket: z.ZodEnum<["tiny", "small", "active", "thriving"]>;
56
379
  notes: z.ZodString;
380
+ est_used_price_usd_min: z.ZodOptional<z.ZodNumber>;
381
+ est_used_price_usd_max: z.ZodOptional<z.ZodNumber>;
382
+ buy_url: z.ZodOptional<z.ZodString>;
383
+ image_url: z.ZodOptional<z.ZodString>;
384
+ est_setup_hours_min: z.ZodOptional<z.ZodNumber>;
385
+ est_setup_hours_max: z.ZodOptional<z.ZodNumber>;
386
+ physical: z.ZodOptional<z.ZodEffects<z.ZodObject<{
387
+ orientation: z.ZodEnum<["upright", "flat"]>;
388
+ shape: z.ZodEnum<["board", "box", "round"]>;
389
+ size_mm: z.ZodObject<{
390
+ w: z.ZodNumber;
391
+ h: z.ZodNumber;
392
+ t: z.ZodNullable<z.ZodNumber>;
393
+ }, "strip", z.ZodTypeAny, {
394
+ w: number;
395
+ h: number;
396
+ t: number | null;
397
+ }, {
398
+ w: number;
399
+ h: number;
400
+ t: number | null;
401
+ }>;
402
+ size_confidence: z.ZodEnum<["published", "drawing", "approximate", "conflicting"]>;
403
+ size_note: z.ZodOptional<z.ZodString>;
404
+ corner_radius_mm: z.ZodOptional<z.ZodNumber>;
405
+ comes_in_case: z.ZodBoolean;
406
+ mass_g: z.ZodNullable<z.ZodNumber>;
407
+ usb: z.ZodNullable<z.ZodObject<{
408
+ type: z.ZodString;
409
+ count: z.ZodNumber;
410
+ faces: z.ZodArray<z.ZodEnum<["front", "back", "top", "bottom", "left", "right"]>, "many">;
411
+ note: z.ZodOptional<z.ZodString>;
412
+ }, "strip", z.ZodTypeAny, {
413
+ type: string;
414
+ count: number;
415
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
416
+ note?: string | undefined;
417
+ }, {
418
+ type: string;
419
+ count: number;
420
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
421
+ note?: string | undefined;
422
+ }>>;
423
+ mounting: z.ZodNullable<z.ZodString>;
424
+ printables: z.ZodDefault<z.ZodArray<z.ZodEnum<["desk-stand", "enclosure"]>, "many">>;
425
+ source_url: z.ZodString;
426
+ }, "strip", z.ZodTypeAny, {
427
+ orientation: "flat" | "upright";
428
+ shape: "board" | "box" | "round";
429
+ size_mm: {
430
+ w: number;
431
+ h: number;
432
+ t: number | null;
433
+ };
434
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
435
+ comes_in_case: boolean;
436
+ mass_g: number | null;
437
+ usb: {
438
+ type: string;
439
+ count: number;
440
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
441
+ note?: string | undefined;
442
+ } | null;
443
+ mounting: string | null;
444
+ printables: ("desk-stand" | "enclosure")[];
445
+ source_url: string;
446
+ size_note?: string | undefined;
447
+ corner_radius_mm?: number | undefined;
448
+ }, {
449
+ orientation: "flat" | "upright";
450
+ shape: "board" | "box" | "round";
451
+ size_mm: {
452
+ w: number;
453
+ h: number;
454
+ t: number | null;
455
+ };
456
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
457
+ comes_in_case: boolean;
458
+ mass_g: number | null;
459
+ usb: {
460
+ type: string;
461
+ count: number;
462
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
463
+ note?: string | undefined;
464
+ } | null;
465
+ mounting: string | null;
466
+ source_url: string;
467
+ size_note?: string | undefined;
468
+ corner_radius_mm?: number | undefined;
469
+ printables?: ("desk-stand" | "enclosure")[] | undefined;
470
+ }>, {
471
+ orientation: "flat" | "upright";
472
+ shape: "board" | "box" | "round";
473
+ size_mm: {
474
+ w: number;
475
+ h: number;
476
+ t: number | null;
477
+ };
478
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
479
+ comes_in_case: boolean;
480
+ mass_g: number | null;
481
+ usb: {
482
+ type: string;
483
+ count: number;
484
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
485
+ note?: string | undefined;
486
+ } | null;
487
+ mounting: string | null;
488
+ printables: ("desk-stand" | "enclosure")[];
489
+ source_url: string;
490
+ size_note?: string | undefined;
491
+ corner_radius_mm?: number | undefined;
492
+ }, {
493
+ orientation: "flat" | "upright";
494
+ shape: "board" | "box" | "round";
495
+ size_mm: {
496
+ w: number;
497
+ h: number;
498
+ t: number | null;
499
+ };
500
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
501
+ comes_in_case: boolean;
502
+ mass_g: number | null;
503
+ usb: {
504
+ type: string;
505
+ count: number;
506
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
507
+ note?: string | undefined;
508
+ } | null;
509
+ mounting: string | null;
510
+ source_url: string;
511
+ size_note?: string | undefined;
512
+ corner_radius_mm?: number | undefined;
513
+ printables?: ("desk-stand" | "enclosure")[] | undefined;
514
+ }>>;
57
515
  }, "strip", z.ZodTypeAny, {
58
516
  id: string;
59
517
  name: string;
@@ -61,11 +519,40 @@ export declare const Catalog: z.ZodArray<z.ZodObject<{
61
519
  idea_fit_tags: string[];
62
520
  hack_difficulty: number;
63
521
  brick_risk: number;
64
- brick_provenance: "founder-verified" | "community-reported" | "llm-inferred";
522
+ brick_provenance: "founder-verified" | "community-reported" | "llm-inferred" | "vendor-docs";
65
523
  last_verified: string;
66
524
  firmware_links: string[];
67
525
  community_size_bucket: "tiny" | "small" | "active" | "thriving";
68
526
  notes: string;
527
+ est_used_price_usd_min?: number | undefined;
528
+ est_used_price_usd_max?: number | undefined;
529
+ buy_url?: string | undefined;
530
+ image_url?: string | undefined;
531
+ est_setup_hours_min?: number | undefined;
532
+ est_setup_hours_max?: number | undefined;
533
+ physical?: {
534
+ orientation: "flat" | "upright";
535
+ shape: "board" | "box" | "round";
536
+ size_mm: {
537
+ w: number;
538
+ h: number;
539
+ t: number | null;
540
+ };
541
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
542
+ comes_in_case: boolean;
543
+ mass_g: number | null;
544
+ usb: {
545
+ type: string;
546
+ count: number;
547
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
548
+ note?: string | undefined;
549
+ } | null;
550
+ mounting: string | null;
551
+ printables: ("desk-stand" | "enclosure")[];
552
+ source_url: string;
553
+ size_note?: string | undefined;
554
+ corner_radius_mm?: number | undefined;
555
+ } | undefined;
69
556
  }, {
70
557
  id: string;
71
558
  name: string;
@@ -73,11 +560,40 @@ export declare const Catalog: z.ZodArray<z.ZodObject<{
73
560
  idea_fit_tags: string[];
74
561
  hack_difficulty: number;
75
562
  brick_risk: number;
76
- brick_provenance: "founder-verified" | "community-reported" | "llm-inferred";
563
+ brick_provenance: "founder-verified" | "community-reported" | "llm-inferred" | "vendor-docs";
77
564
  last_verified: string;
78
565
  community_size_bucket: "tiny" | "small" | "active" | "thriving";
79
566
  notes: string;
80
567
  firmware_links?: string[] | undefined;
568
+ est_used_price_usd_min?: number | undefined;
569
+ est_used_price_usd_max?: number | undefined;
570
+ buy_url?: string | undefined;
571
+ image_url?: string | undefined;
572
+ est_setup_hours_min?: number | undefined;
573
+ est_setup_hours_max?: number | undefined;
574
+ physical?: {
575
+ orientation: "flat" | "upright";
576
+ shape: "board" | "box" | "round";
577
+ size_mm: {
578
+ w: number;
579
+ h: number;
580
+ t: number | null;
581
+ };
582
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
583
+ comes_in_case: boolean;
584
+ mass_g: number | null;
585
+ usb: {
586
+ type: string;
587
+ count: number;
588
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
589
+ note?: string | undefined;
590
+ } | null;
591
+ mounting: string | null;
592
+ source_url: string;
593
+ size_note?: string | undefined;
594
+ corner_radius_mm?: number | undefined;
595
+ printables?: ("desk-stand" | "enclosure")[] | undefined;
596
+ } | undefined;
81
597
  }>, "many">;
82
598
  export type Catalog = z.infer<typeof Catalog>;
83
599
  export declare const UNRECOVERABLE_BRICK_CATEGORIES: ReadonlySet<Category>;
@@ -16,8 +16,50 @@ export const Provenance = z.enum([
16
16
  "founder-verified",
17
17
  "community-reported",
18
18
  "llm-inferred",
19
+ "vendor-docs",
19
20
  ]);
20
21
  export const CommunitySize = z.enum(["tiny", "small", "active", "thriving"]);
22
+ const UsbFace = z.enum(["front", "back", "top", "bottom", "left", "right"]);
23
+ export const Physical = z.object({
24
+ orientation: z.enum(["upright", "flat"]),
25
+ shape: z.enum(["board", "box", "round"]),
26
+ size_mm: z.object({
27
+ w: z.number().positive(),
28
+ h: z.number().positive(),
29
+ t: z.number().positive().nullable(),
30
+ }),
31
+ size_confidence: z.enum(["published", "drawing", "approximate", "conflicting"]),
32
+ size_note: z.string().optional(),
33
+ corner_radius_mm: z.number().min(0).optional(),
34
+ comes_in_case: z.boolean(),
35
+ mass_g: z.number().positive().nullable(),
36
+ usb: z.object({
37
+ type: z.string().min(1),
38
+ count: z.number().int().min(0),
39
+ faces: z.array(UsbFace),
40
+ note: z.string().optional(),
41
+ }).nullable(),
42
+ mounting: z.string().nullable(),
43
+ printables: z.array(z.enum(["desk-stand", "enclosure"])).default([]),
44
+ source_url: z.string().url(),
45
+ }).superRefine((physical, ctx) => {
46
+ if (physical.printables.length === 0)
47
+ return;
48
+ if (physical.size_mm.t === null) {
49
+ ctx.addIssue({
50
+ code: z.ZodIssueCode.custom,
51
+ path: ["size_mm", "t"],
52
+ message: "printable parts require a numeric thickness",
53
+ });
54
+ }
55
+ if (!["published", "drawing"].includes(physical.size_confidence)) {
56
+ ctx.addIssue({
57
+ code: z.ZodIssueCode.custom,
58
+ path: ["size_confidence"],
59
+ message: "printable parts require published or drawing dimensions",
60
+ });
61
+ }
62
+ });
21
63
  export const DeviceEntry = z.object({
22
64
  id: z.string().min(1).regex(/^[a-z0-9-]+$/, "id must be lowercase-kebab-case"),
23
65
  name: z.string().min(1),
@@ -30,6 +72,13 @@ export const DeviceEntry = z.object({
30
72
  firmware_links: z.array(z.string().url()).default([]),
31
73
  community_size_bucket: CommunitySize,
32
74
  notes: z.string().max(500, "notes capped at 500 chars to discourage dumping"),
75
+ est_used_price_usd_min: z.number().int().nonnegative().optional(),
76
+ est_used_price_usd_max: z.number().int().nonnegative().optional(),
77
+ buy_url: z.string().url().optional(),
78
+ image_url: z.string().url().optional(),
79
+ est_setup_hours_min: z.number().nonnegative().optional(),
80
+ est_setup_hours_max: z.number().nonnegative().optional(),
81
+ physical: Physical.optional(),
33
82
  });
34
83
  export const Catalog = z.array(DeviceEntry).min(1);
35
84
  // Categories where bricking is unrecoverable. LLM-inferred brick-risk MUST be
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/catalog/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC;IAC7B,SAAS;IACT,SAAS;IACT,OAAO;IACP,QAAQ;IACR,MAAM;IACN,KAAK;IACL,UAAU;IACV,SAAS;IACT,UAAU;IACV,QAAQ;IACR,OAAO;CACR,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC;IAC/B,kBAAkB;IAClB,oBAAoB;IACpB,cAAc;CACf,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAE7E,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,EAAE,iCAAiC,CAAC;IAC9E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,QAAQ,EAAE,QAAQ;IAClB,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACvD,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,gBAAgB,EAAE,UAAU;IAC5B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,qBAAqB,EAAE,2CAA2C,CAAC;IACnG,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACrD,qBAAqB,EAAE,aAAa;IACpC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,iDAAiD,CAAC;CAC9E,CAAC,CAAC;AAMH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAGnD,8EAA8E;AAC9E,+EAA+E;AAC/E,MAAM,CAAC,MAAM,8BAA8B,GAA0B,IAAI,GAAG,CAAC;IAC3E,UAAU;IACV,KAAK;CACN,CAAC,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/catalog/schema.ts"],"names":[],"mappings":"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"}