hackshop-mcp 0.0.2 → 0.0.4

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 (38) hide show
  1. package/README.md +63 -9
  2. package/SAMPLING.md +12 -6
  3. package/catalog.json +1877 -54
  4. package/dist/catalog/schema.d.ts +510 -0
  5. package/dist/catalog/schema.js +47 -0
  6. package/dist/catalog/schema.js.map +1 -1
  7. package/dist/platforms/index.d.ts +26 -0
  8. package/dist/platforms/index.js +51 -0
  9. package/dist/platforms/index.js.map +1 -0
  10. package/dist/platforms/load.d.ts +4 -0
  11. package/dist/platforms/load.js +78 -0
  12. package/dist/platforms/load.js.map +1 -0
  13. package/dist/platforms/schema.d.ts +383 -0
  14. package/dist/platforms/schema.js +53 -0
  15. package/dist/platforms/schema.js.map +1 -0
  16. package/dist/sampling.d.ts +4 -0
  17. package/dist/sampling.js +17 -19
  18. package/dist/sampling.js.map +1 -1
  19. package/dist/server.js +135 -23
  20. package/dist/server.js.map +1 -1
  21. package/dist/telemetry.d.ts +29 -0
  22. package/dist/telemetry.js +100 -0
  23. package/dist/telemetry.js.map +1 -0
  24. package/dist/tools/assess_hackability.d.ts +4 -0
  25. package/dist/tools/assess_hackability.js +44 -4
  26. package/dist/tools/assess_hackability.js.map +1 -1
  27. package/dist/tools/plan_gadget.d.ts +66 -0
  28. package/dist/tools/plan_gadget.js +406 -0
  29. package/dist/tools/plan_gadget.js.map +1 -0
  30. package/dist/tools/propose_hardware.d.ts +2 -0
  31. package/dist/tools/propose_hardware.js +38 -2
  32. package/dist/tools/propose_hardware.js.map +1 -1
  33. package/dist/tools/simulate_assembly.d.ts +315 -0
  34. package/dist/tools/simulate_assembly.js +145 -0
  35. package/dist/tools/simulate_assembly.js.map +1 -0
  36. package/package.json +4 -1
  37. package/platforms.json +448 -0
  38. package/tags.md +1 -0
@@ -2,6 +2,135 @@ 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
3
  export declare const Provenance: z.ZodEnum<["founder-verified", "community-reported", "llm-inferred"]>;
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;
@@ -14,6 +143,140 @@ export declare const DeviceEntry: z.ZodObject<{
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
+ image_url: z.ZodOptional<z.ZodString>;
149
+ est_setup_hours_min: z.ZodOptional<z.ZodNumber>;
150
+ est_setup_hours_max: z.ZodOptional<z.ZodNumber>;
151
+ physical: z.ZodOptional<z.ZodEffects<z.ZodObject<{
152
+ orientation: z.ZodEnum<["upright", "flat"]>;
153
+ shape: z.ZodEnum<["board", "box", "round"]>;
154
+ size_mm: z.ZodObject<{
155
+ w: z.ZodNumber;
156
+ h: z.ZodNumber;
157
+ t: z.ZodNullable<z.ZodNumber>;
158
+ }, "strip", z.ZodTypeAny, {
159
+ w: number;
160
+ h: number;
161
+ t: number | null;
162
+ }, {
163
+ w: number;
164
+ h: number;
165
+ t: number | null;
166
+ }>;
167
+ size_confidence: z.ZodEnum<["published", "drawing", "approximate", "conflicting"]>;
168
+ size_note: z.ZodOptional<z.ZodString>;
169
+ corner_radius_mm: z.ZodOptional<z.ZodNumber>;
170
+ comes_in_case: z.ZodBoolean;
171
+ mass_g: z.ZodNullable<z.ZodNumber>;
172
+ usb: z.ZodNullable<z.ZodObject<{
173
+ type: z.ZodString;
174
+ count: z.ZodNumber;
175
+ faces: z.ZodArray<z.ZodEnum<["front", "back", "top", "bottom", "left", "right"]>, "many">;
176
+ note: z.ZodOptional<z.ZodString>;
177
+ }, "strip", z.ZodTypeAny, {
178
+ type: string;
179
+ count: number;
180
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
181
+ note?: string | undefined;
182
+ }, {
183
+ type: string;
184
+ count: number;
185
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
186
+ note?: string | undefined;
187
+ }>>;
188
+ mounting: z.ZodNullable<z.ZodString>;
189
+ printables: z.ZodDefault<z.ZodArray<z.ZodEnum<["desk-stand", "enclosure"]>, "many">>;
190
+ source_url: z.ZodString;
191
+ }, "strip", z.ZodTypeAny, {
192
+ orientation: "flat" | "upright";
193
+ shape: "board" | "box" | "round";
194
+ size_mm: {
195
+ w: number;
196
+ h: number;
197
+ t: number | null;
198
+ };
199
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
200
+ comes_in_case: boolean;
201
+ mass_g: number | null;
202
+ usb: {
203
+ type: string;
204
+ count: number;
205
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
206
+ note?: string | undefined;
207
+ } | null;
208
+ mounting: string | null;
209
+ printables: ("desk-stand" | "enclosure")[];
210
+ source_url: string;
211
+ size_note?: string | undefined;
212
+ corner_radius_mm?: number | undefined;
213
+ }, {
214
+ orientation: "flat" | "upright";
215
+ shape: "board" | "box" | "round";
216
+ size_mm: {
217
+ w: number;
218
+ h: number;
219
+ t: number | null;
220
+ };
221
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
222
+ comes_in_case: boolean;
223
+ mass_g: number | null;
224
+ usb: {
225
+ type: string;
226
+ count: number;
227
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
228
+ note?: string | undefined;
229
+ } | null;
230
+ mounting: string | null;
231
+ source_url: string;
232
+ size_note?: string | undefined;
233
+ corner_radius_mm?: number | undefined;
234
+ printables?: ("desk-stand" | "enclosure")[] | undefined;
235
+ }>, {
236
+ orientation: "flat" | "upright";
237
+ shape: "board" | "box" | "round";
238
+ size_mm: {
239
+ w: number;
240
+ h: number;
241
+ t: number | null;
242
+ };
243
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
244
+ comes_in_case: boolean;
245
+ mass_g: number | null;
246
+ usb: {
247
+ type: string;
248
+ count: number;
249
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
250
+ note?: string | undefined;
251
+ } | null;
252
+ mounting: string | null;
253
+ printables: ("desk-stand" | "enclosure")[];
254
+ source_url: string;
255
+ size_note?: string | undefined;
256
+ corner_radius_mm?: number | undefined;
257
+ }, {
258
+ orientation: "flat" | "upright";
259
+ shape: "board" | "box" | "round";
260
+ size_mm: {
261
+ w: number;
262
+ h: number;
263
+ t: number | null;
264
+ };
265
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
266
+ comes_in_case: boolean;
267
+ mass_g: number | null;
268
+ usb: {
269
+ type: string;
270
+ count: number;
271
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
272
+ note?: string | undefined;
273
+ } | null;
274
+ mounting: string | null;
275
+ source_url: string;
276
+ size_note?: string | undefined;
277
+ corner_radius_mm?: number | undefined;
278
+ printables?: ("desk-stand" | "enclosure")[] | undefined;
279
+ }>>;
17
280
  }, "strip", z.ZodTypeAny, {
18
281
  id: string;
19
282
  name: string;
@@ -26,6 +289,34 @@ export declare const DeviceEntry: z.ZodObject<{
26
289
  firmware_links: string[];
27
290
  community_size_bucket: "tiny" | "small" | "active" | "thriving";
28
291
  notes: string;
292
+ est_used_price_usd_min?: number | undefined;
293
+ est_used_price_usd_max?: number | undefined;
294
+ image_url?: string | undefined;
295
+ est_setup_hours_min?: number | undefined;
296
+ est_setup_hours_max?: number | undefined;
297
+ physical?: {
298
+ orientation: "flat" | "upright";
299
+ shape: "board" | "box" | "round";
300
+ size_mm: {
301
+ w: number;
302
+ h: number;
303
+ t: number | null;
304
+ };
305
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
306
+ comes_in_case: boolean;
307
+ mass_g: number | null;
308
+ usb: {
309
+ type: string;
310
+ count: number;
311
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
312
+ note?: string | undefined;
313
+ } | null;
314
+ mounting: string | null;
315
+ printables: ("desk-stand" | "enclosure")[];
316
+ source_url: string;
317
+ size_note?: string | undefined;
318
+ corner_radius_mm?: number | undefined;
319
+ } | undefined;
29
320
  }, {
30
321
  id: string;
31
322
  name: string;
@@ -38,10 +329,39 @@ export declare const DeviceEntry: z.ZodObject<{
38
329
  community_size_bucket: "tiny" | "small" | "active" | "thriving";
39
330
  notes: string;
40
331
  firmware_links?: string[] | undefined;
332
+ est_used_price_usd_min?: number | undefined;
333
+ est_used_price_usd_max?: number | undefined;
334
+ image_url?: string | undefined;
335
+ est_setup_hours_min?: number | undefined;
336
+ est_setup_hours_max?: number | undefined;
337
+ physical?: {
338
+ orientation: "flat" | "upright";
339
+ shape: "board" | "box" | "round";
340
+ size_mm: {
341
+ w: number;
342
+ h: number;
343
+ t: number | null;
344
+ };
345
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
346
+ comes_in_case: boolean;
347
+ mass_g: number | null;
348
+ usb: {
349
+ type: string;
350
+ count: number;
351
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
352
+ note?: string | undefined;
353
+ } | null;
354
+ mounting: string | null;
355
+ source_url: string;
356
+ size_note?: string | undefined;
357
+ corner_radius_mm?: number | undefined;
358
+ printables?: ("desk-stand" | "enclosure")[] | undefined;
359
+ } | undefined;
41
360
  }>;
42
361
  export type DeviceEntry = z.infer<typeof DeviceEntry>;
43
362
  export type Category = z.infer<typeof Category>;
44
363
  export type Provenance = z.infer<typeof Provenance>;
364
+ export type Physical = z.infer<typeof Physical>;
45
365
  export declare const Catalog: z.ZodArray<z.ZodObject<{
46
366
  id: z.ZodString;
47
367
  name: z.ZodString;
@@ -54,6 +374,140 @@ export declare const Catalog: z.ZodArray<z.ZodObject<{
54
374
  firmware_links: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
55
375
  community_size_bucket: z.ZodEnum<["tiny", "small", "active", "thriving"]>;
56
376
  notes: z.ZodString;
377
+ est_used_price_usd_min: z.ZodOptional<z.ZodNumber>;
378
+ est_used_price_usd_max: z.ZodOptional<z.ZodNumber>;
379
+ image_url: z.ZodOptional<z.ZodString>;
380
+ est_setup_hours_min: z.ZodOptional<z.ZodNumber>;
381
+ est_setup_hours_max: z.ZodOptional<z.ZodNumber>;
382
+ physical: z.ZodOptional<z.ZodEffects<z.ZodObject<{
383
+ orientation: z.ZodEnum<["upright", "flat"]>;
384
+ shape: z.ZodEnum<["board", "box", "round"]>;
385
+ size_mm: z.ZodObject<{
386
+ w: z.ZodNumber;
387
+ h: z.ZodNumber;
388
+ t: z.ZodNullable<z.ZodNumber>;
389
+ }, "strip", z.ZodTypeAny, {
390
+ w: number;
391
+ h: number;
392
+ t: number | null;
393
+ }, {
394
+ w: number;
395
+ h: number;
396
+ t: number | null;
397
+ }>;
398
+ size_confidence: z.ZodEnum<["published", "drawing", "approximate", "conflicting"]>;
399
+ size_note: z.ZodOptional<z.ZodString>;
400
+ corner_radius_mm: z.ZodOptional<z.ZodNumber>;
401
+ comes_in_case: z.ZodBoolean;
402
+ mass_g: z.ZodNullable<z.ZodNumber>;
403
+ usb: z.ZodNullable<z.ZodObject<{
404
+ type: z.ZodString;
405
+ count: z.ZodNumber;
406
+ faces: z.ZodArray<z.ZodEnum<["front", "back", "top", "bottom", "left", "right"]>, "many">;
407
+ note: z.ZodOptional<z.ZodString>;
408
+ }, "strip", z.ZodTypeAny, {
409
+ type: string;
410
+ count: number;
411
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
412
+ note?: string | undefined;
413
+ }, {
414
+ type: string;
415
+ count: number;
416
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
417
+ note?: string | undefined;
418
+ }>>;
419
+ mounting: z.ZodNullable<z.ZodString>;
420
+ printables: z.ZodDefault<z.ZodArray<z.ZodEnum<["desk-stand", "enclosure"]>, "many">>;
421
+ source_url: z.ZodString;
422
+ }, "strip", z.ZodTypeAny, {
423
+ orientation: "flat" | "upright";
424
+ shape: "board" | "box" | "round";
425
+ size_mm: {
426
+ w: number;
427
+ h: number;
428
+ t: number | null;
429
+ };
430
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
431
+ comes_in_case: boolean;
432
+ mass_g: number | null;
433
+ usb: {
434
+ type: string;
435
+ count: number;
436
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
437
+ note?: string | undefined;
438
+ } | null;
439
+ mounting: string | null;
440
+ printables: ("desk-stand" | "enclosure")[];
441
+ source_url: string;
442
+ size_note?: string | undefined;
443
+ corner_radius_mm?: number | undefined;
444
+ }, {
445
+ orientation: "flat" | "upright";
446
+ shape: "board" | "box" | "round";
447
+ size_mm: {
448
+ w: number;
449
+ h: number;
450
+ t: number | null;
451
+ };
452
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
453
+ comes_in_case: boolean;
454
+ mass_g: number | null;
455
+ usb: {
456
+ type: string;
457
+ count: number;
458
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
459
+ note?: string | undefined;
460
+ } | null;
461
+ mounting: string | null;
462
+ source_url: string;
463
+ size_note?: string | undefined;
464
+ corner_radius_mm?: number | undefined;
465
+ printables?: ("desk-stand" | "enclosure")[] | undefined;
466
+ }>, {
467
+ orientation: "flat" | "upright";
468
+ shape: "board" | "box" | "round";
469
+ size_mm: {
470
+ w: number;
471
+ h: number;
472
+ t: number | null;
473
+ };
474
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
475
+ comes_in_case: boolean;
476
+ mass_g: number | null;
477
+ usb: {
478
+ type: string;
479
+ count: number;
480
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
481
+ note?: string | undefined;
482
+ } | null;
483
+ mounting: string | null;
484
+ printables: ("desk-stand" | "enclosure")[];
485
+ source_url: string;
486
+ size_note?: string | undefined;
487
+ corner_radius_mm?: number | undefined;
488
+ }, {
489
+ orientation: "flat" | "upright";
490
+ shape: "board" | "box" | "round";
491
+ size_mm: {
492
+ w: number;
493
+ h: number;
494
+ t: number | null;
495
+ };
496
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
497
+ comes_in_case: boolean;
498
+ mass_g: number | null;
499
+ usb: {
500
+ type: string;
501
+ count: number;
502
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
503
+ note?: string | undefined;
504
+ } | null;
505
+ mounting: string | null;
506
+ source_url: string;
507
+ size_note?: string | undefined;
508
+ corner_radius_mm?: number | undefined;
509
+ printables?: ("desk-stand" | "enclosure")[] | undefined;
510
+ }>>;
57
511
  }, "strip", z.ZodTypeAny, {
58
512
  id: string;
59
513
  name: string;
@@ -66,6 +520,34 @@ export declare const Catalog: z.ZodArray<z.ZodObject<{
66
520
  firmware_links: string[];
67
521
  community_size_bucket: "tiny" | "small" | "active" | "thriving";
68
522
  notes: string;
523
+ est_used_price_usd_min?: number | undefined;
524
+ est_used_price_usd_max?: number | undefined;
525
+ image_url?: string | undefined;
526
+ est_setup_hours_min?: number | undefined;
527
+ est_setup_hours_max?: number | undefined;
528
+ physical?: {
529
+ orientation: "flat" | "upright";
530
+ shape: "board" | "box" | "round";
531
+ size_mm: {
532
+ w: number;
533
+ h: number;
534
+ t: number | null;
535
+ };
536
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
537
+ comes_in_case: boolean;
538
+ mass_g: number | null;
539
+ usb: {
540
+ type: string;
541
+ count: number;
542
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
543
+ note?: string | undefined;
544
+ } | null;
545
+ mounting: string | null;
546
+ printables: ("desk-stand" | "enclosure")[];
547
+ source_url: string;
548
+ size_note?: string | undefined;
549
+ corner_radius_mm?: number | undefined;
550
+ } | undefined;
69
551
  }, {
70
552
  id: string;
71
553
  name: string;
@@ -78,6 +560,34 @@ export declare const Catalog: z.ZodArray<z.ZodObject<{
78
560
  community_size_bucket: "tiny" | "small" | "active" | "thriving";
79
561
  notes: string;
80
562
  firmware_links?: string[] | undefined;
563
+ est_used_price_usd_min?: number | undefined;
564
+ est_used_price_usd_max?: number | undefined;
565
+ image_url?: string | undefined;
566
+ est_setup_hours_min?: number | undefined;
567
+ est_setup_hours_max?: number | undefined;
568
+ physical?: {
569
+ orientation: "flat" | "upright";
570
+ shape: "board" | "box" | "round";
571
+ size_mm: {
572
+ w: number;
573
+ h: number;
574
+ t: number | null;
575
+ };
576
+ size_confidence: "published" | "drawing" | "approximate" | "conflicting";
577
+ comes_in_case: boolean;
578
+ mass_g: number | null;
579
+ usb: {
580
+ type: string;
581
+ count: number;
582
+ faces: ("front" | "back" | "top" | "bottom" | "left" | "right")[];
583
+ note?: string | undefined;
584
+ } | null;
585
+ mounting: string | null;
586
+ source_url: string;
587
+ size_note?: string | undefined;
588
+ corner_radius_mm?: number | undefined;
589
+ printables?: ("desk-stand" | "enclosure")[] | undefined;
590
+ } | undefined;
81
591
  }>, "many">;
82
592
  export type Catalog = z.infer<typeof Catalog>;
83
593
  export declare const UNRECOVERABLE_BRICK_CATEGORIES: ReadonlySet<Category>;
@@ -18,6 +18,47 @@ export const Provenance = z.enum([
18
18
  "llm-inferred",
19
19
  ]);
20
20
  export const CommunitySize = z.enum(["tiny", "small", "active", "thriving"]);
21
+ const UsbFace = z.enum(["front", "back", "top", "bottom", "left", "right"]);
22
+ export const Physical = z.object({
23
+ orientation: z.enum(["upright", "flat"]),
24
+ shape: z.enum(["board", "box", "round"]),
25
+ size_mm: z.object({
26
+ w: z.number().positive(),
27
+ h: z.number().positive(),
28
+ t: z.number().positive().nullable(),
29
+ }),
30
+ size_confidence: z.enum(["published", "drawing", "approximate", "conflicting"]),
31
+ size_note: z.string().optional(),
32
+ corner_radius_mm: z.number().min(0).optional(),
33
+ comes_in_case: z.boolean(),
34
+ mass_g: z.number().positive().nullable(),
35
+ usb: z.object({
36
+ type: z.string().min(1),
37
+ count: z.number().int().min(0),
38
+ faces: z.array(UsbFace),
39
+ note: z.string().optional(),
40
+ }).nullable(),
41
+ mounting: z.string().nullable(),
42
+ printables: z.array(z.enum(["desk-stand", "enclosure"])).default([]),
43
+ source_url: z.string().url(),
44
+ }).superRefine((physical, ctx) => {
45
+ if (physical.printables.length === 0)
46
+ return;
47
+ if (physical.size_mm.t === null) {
48
+ ctx.addIssue({
49
+ code: z.ZodIssueCode.custom,
50
+ path: ["size_mm", "t"],
51
+ message: "printable parts require a numeric thickness",
52
+ });
53
+ }
54
+ if (!["published", "drawing"].includes(physical.size_confidence)) {
55
+ ctx.addIssue({
56
+ code: z.ZodIssueCode.custom,
57
+ path: ["size_confidence"],
58
+ message: "printable parts require published or drawing dimensions",
59
+ });
60
+ }
61
+ });
21
62
  export const DeviceEntry = z.object({
22
63
  id: z.string().min(1).regex(/^[a-z0-9-]+$/, "id must be lowercase-kebab-case"),
23
64
  name: z.string().min(1),
@@ -30,6 +71,12 @@ export const DeviceEntry = z.object({
30
71
  firmware_links: z.array(z.string().url()).default([]),
31
72
  community_size_bucket: CommunitySize,
32
73
  notes: z.string().max(500, "notes capped at 500 chars to discourage dumping"),
74
+ est_used_price_usd_min: z.number().int().nonnegative().optional(),
75
+ est_used_price_usd_max: z.number().int().nonnegative().optional(),
76
+ image_url: z.string().url().optional(),
77
+ est_setup_hours_min: z.number().nonnegative().optional(),
78
+ est_setup_hours_max: z.number().nonnegative().optional(),
79
+ physical: Physical.optional(),
33
80
  });
34
81
  export const Catalog = z.array(DeviceEntry).min(1);
35
82
  // 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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"}
@@ -0,0 +1,26 @@
1
+ import type { DeviceEntry } from "../catalog/schema.js";
2
+ import type { Platform } from "./schema.js";
3
+ export interface AgentPlatform {
4
+ platform_id: string;
5
+ platform_name: string;
6
+ support: "official" | "possible";
7
+ tier: string;
8
+ tier_label: string;
9
+ kind: string;
10
+ build: string;
11
+ eol?: boolean;
12
+ features: Record<string, boolean | string | number | null>;
13
+ note: string;
14
+ }
15
+ export interface Printable {
16
+ part: "desk-stand" | "enclosure";
17
+ title: string;
18
+ stl_url: string;
19
+ step_url: string;
20
+ svg_url: string;
21
+ fab_url: string;
22
+ }
23
+ export declare function setLoadedPlatforms(platforms: Platform[]): void;
24
+ export declare function getLoadedPlatforms(): Platform[];
25
+ export declare function agentPlatformsFor(deviceId: string): AgentPlatform[];
26
+ export declare function printablesFor(device: DeviceEntry): Printable[];