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
@@ -0,0 +1,619 @@
1
+ import { z } from "zod";
2
+ import { buildPlan } from "../build-plan/index.js";
3
+ import { NEED_VALUES, } from "./types.js";
4
+ export { NEED_VALUES };
5
+ const NeedSchema = z.enum(NEED_VALUES);
6
+ const SizeSchema = z.enum(["pocket", "desk", "wall", "any"]);
7
+ export const planGadgetInput = z.object({
8
+ idea: z.string().min(3).max(2000),
9
+ platform: z.enum(["muse-esp32", "muse-linux", "any"]).default("any"),
10
+ budget_usd: z.number().positive().max(100000).optional(),
11
+ owned_device_ids: z.array(z.string().min(1)).max(50).optional(),
12
+ needs: z.array(NeedSchema).optional(),
13
+ size: SizeSchema.default("any"),
14
+ limit: z.number().int().min(1).max(5).default(3),
15
+ });
16
+ const NEED_ORDER = [...NEED_VALUES];
17
+ const HARD_NEEDS = new Set(["voice", "camera", "air-sensors", "e-ink", "linux"]);
18
+ const NEED_KEYWORDS = {
19
+ voice: [
20
+ "talk",
21
+ "talks",
22
+ "speak",
23
+ "speaks",
24
+ "voice",
25
+ "push-to-talk",
26
+ "ptt",
27
+ "ask",
28
+ "conversation",
29
+ "chat",
30
+ "mic",
31
+ "microphone",
32
+ "listen",
33
+ "companion",
34
+ ],
35
+ screen: ["screen", "display", "show", "shows", "showing", "face", "avatar", "dashboard", "status"],
36
+ images: ["image", "images", "photo", "photos", "picture", "pictures", "art", "album"],
37
+ touch: ["touch", "touchscreen", "tap", "swipe"],
38
+ camera: ["camera", "see", "look", "looks", "watch", "watches", "vision"],
39
+ "air-sensors": ["air", "co2", "air quality", "tvoc", "humidity", "temperature"],
40
+ "e-ink": ["e-ink", "eink", "e-paper", "epaper"],
41
+ battery: ["battery", "portable", "pocket", "carry", "wearable", "keychain"],
42
+ round: ["round", "circle", "circular", "orb", "puck"],
43
+ "home-tunnel": ["home network", "lan", "smart home", "lights", "sonos", "hue", "tv"],
44
+ "big-screen": ["calendar", "wall", "fridge", "kitchen", "frame", "poster", "big screen", "large screen"],
45
+ compute: ["server", "home assistant", "homelab", "nas", "docker", "media server", "plex"],
46
+ linux: [
47
+ "shell",
48
+ "server",
49
+ "sysadmin",
50
+ "home assistant",
51
+ "homelab",
52
+ "raspberry pi",
53
+ "thin client",
54
+ "mini pc",
55
+ "nas",
56
+ "linux",
57
+ ],
58
+ };
59
+ const CHEAP_KEYWORDS = ["cheap", "cheapest", "inexpensive", "budget", "low-cost", "affordable"];
60
+ const SIZE_WORDS = ["pocket", "desk", "desktop", "table", "wall", "fridge", "hidden", "portable", "wearable", "keychain"];
61
+ const NON_MUSE_ASSISTANTS = [
62
+ [/\b(alexa|echo)\b/i, "Alexa"],
63
+ [/\b(google assistant|google home|nest hub)\b/i, "Google Assistant"],
64
+ [/\b(siri|homepod)\b/i, "Siri"],
65
+ [/\bcortana\b/i, "Cortana"],
66
+ [/\bbixby\b/i, "Bixby"],
67
+ ];
68
+ export function planGadget(input, ctx) {
69
+ const catalogById = new Map(ctx.catalog.map((device) => [device.id, device]));
70
+ const needs = input.needs ? orderNeeds(input.needs) : inferNeeds(input.idea);
71
+ const inferredPreferences = inferPreferences(input.idea);
72
+ const warnings = [
73
+ ...unknownOwnedDeviceWarnings(input.owned_device_ids ?? [], catalogById),
74
+ ...nonMuseAssistantWarnings(input.idea),
75
+ ];
76
+ const owned = new Set((input.owned_device_ids ?? []).filter((id) => catalogById.has(id)));
77
+ const candidates = [];
78
+ for (const platform of ctx.platforms) {
79
+ if (input.platform !== "any" && platform.id !== input.platform)
80
+ continue;
81
+ const tierLabels = new Map(platform.tiers.map((tier) => [tier.id, tier.label]));
82
+ for (const board of platform.boards) {
83
+ const device = catalogById.get(board.device_id);
84
+ if (!device)
85
+ continue;
86
+ candidates.push(scoreBoard({
87
+ device,
88
+ platform,
89
+ board,
90
+ tierLabel: tierLabels.get(board.tier) ?? board.tier,
91
+ needs,
92
+ budgetUsd: input.budget_usd,
93
+ owned: owned.has(device.id),
94
+ cheapPreference: inferredPreferences.includes("cheap"),
95
+ size: input.size,
96
+ }));
97
+ }
98
+ }
99
+ candidates.sort(candidateSort(input.budget_usd));
100
+ const budgeted = input.budget_usd !== undefined;
101
+ const anyWithinBudget = !budgeted || candidates.some((candidate) => candidate.withinBudget);
102
+ const ranked = budgeted && !anyWithinBudget
103
+ ? [...candidates].sort((a, b) => {
104
+ if (b.satisfied.length !== a.satisfied.length)
105
+ return b.satisfied.length - a.satisfied.length;
106
+ const priceA = priceFor(a.device);
107
+ const priceB = priceFor(b.device);
108
+ if (priceA !== priceB)
109
+ return priceA - priceB;
110
+ return a.device.id.localeCompare(b.device.id);
111
+ })
112
+ : candidates;
113
+ const selected = ensureNeedCoverage(ranked, input.limit, needs, input.budget_usd);
114
+ const picks = selected.map((candidate) => {
115
+ const printables = ctx.printablesFor(candidate.device, ctx.siteUrl);
116
+ const plan = buildPlan({
117
+ device: candidate.device,
118
+ platform: candidate.platform,
119
+ board: candidate.board,
120
+ printables,
121
+ siteUrl: ctx.siteUrl,
122
+ });
123
+ return {
124
+ device_id: candidate.device.id,
125
+ name: candidate.device.name,
126
+ platform_id: candidate.platform.id,
127
+ platform_name: candidate.platform.name,
128
+ support: candidate.board.support,
129
+ tier: candidate.board.tier,
130
+ tier_label: candidate.tierLabel,
131
+ score: candidate.score,
132
+ why: buildWhy(candidate),
133
+ gaps: candidate.gaps,
134
+ needs_met: candidate.satisfied,
135
+ within_budget: candidate.withinBudget,
136
+ price_label: priceLabel(candidate.device),
137
+ build_page_url: plan.urls.build_page,
138
+ agent_brief_url: plan.urls.build_md,
139
+ links: candidate.device.firmware_links,
140
+ build_command: candidate.board.build,
141
+ setup_steps: candidate.platform.setup_steps,
142
+ caveats: plan.caveats,
143
+ fabrication: {
144
+ printables,
145
+ note: fabricationNote(candidate.device, printables),
146
+ },
147
+ };
148
+ });
149
+ const notes = buildNotes({
150
+ needs,
151
+ candidates,
152
+ picks: selected,
153
+ budgetUsd: input.budget_usd,
154
+ anyWithinBudget,
155
+ });
156
+ const fit = computeFit(needs, selected[0], input.budget_usd, anyWithinBudget);
157
+ const pickedPlatforms = new Map();
158
+ for (const pick of picks) {
159
+ const platform = ctx.platforms.find((candidate) => candidate.id === pick.platform_id);
160
+ if (platform)
161
+ pickedPlatforms.set(platform.id, platform);
162
+ }
163
+ return {
164
+ inferred_needs: needs,
165
+ inferred_preferences: inferredPreferences,
166
+ fit,
167
+ notes,
168
+ warnings,
169
+ questions: intakeQuestions(input, needs),
170
+ picks,
171
+ terms: [...pickedPlatforms.values()].map((platform) => ({
172
+ platform_id: platform.id,
173
+ summary: platform.terms.summary,
174
+ url: platform.terms.url,
175
+ max_devices_per_token: platform.terms.max_devices_per_token,
176
+ selling_allowed: platform.terms.selling_allowed,
177
+ })),
178
+ next_steps: nextSteps(picks),
179
+ };
180
+ }
181
+ export function inferNeeds(idea) {
182
+ const found = new Set();
183
+ for (const need of NEED_ORDER) {
184
+ if (NEED_KEYWORDS[need].some((keyword) => wordBoundaryMatch(idea, keyword))) {
185
+ found.add(need);
186
+ }
187
+ }
188
+ return [...found];
189
+ }
190
+ function inferPreferences(idea) {
191
+ return CHEAP_KEYWORDS.some((keyword) => wordBoundaryMatch(idea, keyword)) ? ["cheap"] : [];
192
+ }
193
+ function orderNeeds(needs) {
194
+ const given = new Set(needs);
195
+ return NEED_ORDER.filter((need) => given.has(need));
196
+ }
197
+ function wordBoundaryMatch(text, keyword) {
198
+ const escaped = keyword
199
+ .toLowerCase()
200
+ .replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
201
+ .replace(/\s+/g, "\\s+");
202
+ return new RegExp(`(^|[^a-z0-9])${escaped}([^a-z0-9]|$)`, "i").test(text);
203
+ }
204
+ function scoreBoard(args) {
205
+ let score = 0;
206
+ const satisfied = [];
207
+ const gaps = [];
208
+ for (const need of args.needs) {
209
+ const result = satisfiesNeed(need, args.board, args.platform);
210
+ if (result.satisfied) {
211
+ score += 3;
212
+ satisfied.push(need);
213
+ }
214
+ else {
215
+ score += HARD_NEEDS.has(need) ? -4 : -1;
216
+ gaps.push(result.gap);
217
+ }
218
+ }
219
+ if (args.board.tier === "full-ui")
220
+ score += 1;
221
+ if (args.board.support === "official")
222
+ score += 1;
223
+ if (args.board.eol) {
224
+ score -= 2;
225
+ gaps.push("End of life at the vendor");
226
+ }
227
+ if (args.owned)
228
+ score += 5;
229
+ if (args.cheapPreference) {
230
+ const minPrice = args.device.est_used_price_usd_min;
231
+ score -= minPrice === undefined ? 3 : Math.floor(minPrice / 20);
232
+ }
233
+ const withinBudget = args.budgetUsd === undefined
234
+ ? null
235
+ : args.device.est_used_price_usd_min !== undefined &&
236
+ args.device.est_used_price_usd_min <= args.budgetUsd;
237
+ if (withinBudget === false) {
238
+ score -= 3;
239
+ gaps.push("over budget");
240
+ }
241
+ if (args.size === "pocket") {
242
+ const longest = longestSide(args.device);
243
+ if ((args.board.features.battery === "yes" || args.board.features.battery === "optional") &&
244
+ longest !== null &&
245
+ longest <= 70) {
246
+ score += 3;
247
+ }
248
+ else {
249
+ score -= 1;
250
+ }
251
+ }
252
+ else if (args.size === "wall") {
253
+ if (featureNumber(args.board, "display_in") >= 3.5)
254
+ score += 3;
255
+ else
256
+ score -= 1;
257
+ }
258
+ const needsLinux = args.needs.includes("linux");
259
+ if (args.platform.sdk_path === "linux") {
260
+ if (!needsLinux && !args.owned)
261
+ score -= 3;
262
+ if (args.board.features.ble_builtin === false)
263
+ score -= 1;
264
+ if (args.board.features.ble_builtin === true)
265
+ score += 1;
266
+ }
267
+ return {
268
+ device: args.device,
269
+ platform: args.platform,
270
+ board: args.board,
271
+ tierLabel: args.tierLabel,
272
+ score,
273
+ satisfied,
274
+ gaps,
275
+ withinBudget,
276
+ };
277
+ }
278
+ function satisfiesNeed(need, board, platform) {
279
+ switch (need) {
280
+ case "voice": {
281
+ const pushToTalk = board.features.push_to_talk;
282
+ const audio = board.features.audio;
283
+ if (pushToTalk === "voice" && audio === "speaker-mic")
284
+ return { satisfied: true };
285
+ if (pushToTalk === "text")
286
+ return { satisfied: false, gap: "voice: text replies only" };
287
+ if (audio === "buzzer-mic") {
288
+ return { satisfied: false, gap: "voice: no speaker (buzzer only)" };
289
+ }
290
+ return { satisfied: false, gap: "voice: no push-to-talk with spoken replies" };
291
+ }
292
+ case "screen":
293
+ return board.tier === "full-ui" || ["status-screen", "e-paper"].includes(board.kind)
294
+ ? { satisfied: true }
295
+ : { satisfied: false, gap: "screen: no display UI" };
296
+ case "images":
297
+ return typeof board.features.images === "string" && board.features.images !== "none"
298
+ ? { satisfied: true }
299
+ : { satisfied: false, gap: "images: no image display" };
300
+ case "touch":
301
+ return board.features.touch === true
302
+ ? { satisfied: true }
303
+ : { satisfied: false, gap: "touch: no touch input" };
304
+ case "camera":
305
+ return board.features.camera === true
306
+ ? { satisfied: true }
307
+ : { satisfied: false, gap: "camera: no camera" };
308
+ case "air-sensors":
309
+ return board.features.air_sensors === true
310
+ ? { satisfied: true }
311
+ : { satisfied: false, gap: "air sensors: no air-quality sensors" };
312
+ case "e-ink":
313
+ return board.kind === "e-paper"
314
+ ? { satisfied: true }
315
+ : { satisfied: false, gap: "e-ink: not an e-paper board" };
316
+ case "battery":
317
+ return board.features.battery === "yes" || board.features.battery === "optional"
318
+ ? { satisfied: true }
319
+ : { satisfied: false, gap: "battery: no portable power option" };
320
+ case "round":
321
+ return board.features.round_display === true
322
+ ? { satisfied: true }
323
+ : { satisfied: false, gap: "round: not a round display" };
324
+ case "home-tunnel":
325
+ return board.features.home_tunnel === true
326
+ ? { satisfied: true }
327
+ : { satisfied: false, gap: "home network: no Muse home-network tunnel" };
328
+ case "big-screen":
329
+ return featureNumber(board, "display_in") >= 3.5
330
+ ? { satisfied: true }
331
+ : { satisfied: false, gap: "big screen: display under 3.5 inches" };
332
+ case "compute":
333
+ return ["standard", "desktop"].includes(featureString(board, "compute") ?? "")
334
+ ? { satisfied: true }
335
+ : { satisfied: false, gap: "compute: too light for server workloads" };
336
+ case "linux":
337
+ return platform.sdk_path === "linux"
338
+ ? { satisfied: true }
339
+ : { satisfied: false, gap: "linux: not a Linux gadget" };
340
+ }
341
+ }
342
+ function featureNumber(board, key) {
343
+ const value = board.features[key];
344
+ return typeof value === "number" ? value : Number.NEGATIVE_INFINITY;
345
+ }
346
+ function featureString(board, key) {
347
+ const value = board.features[key];
348
+ return typeof value === "string" ? value : null;
349
+ }
350
+ function candidateSort(budgetUsd) {
351
+ return (a, b) => {
352
+ if (budgetUsd !== undefined && a.withinBudget !== b.withinBudget) {
353
+ if (a.withinBudget === true)
354
+ return -1;
355
+ if (b.withinBudget === true)
356
+ return 1;
357
+ }
358
+ if (b.satisfied.length !== a.satisfied.length)
359
+ return b.satisfied.length - a.satisfied.length;
360
+ if (b.score !== a.score)
361
+ return b.score - a.score;
362
+ const priceA = priceFor(a.device);
363
+ const priceB = priceFor(b.device);
364
+ if (priceA !== priceB)
365
+ return priceA - priceB;
366
+ return a.device.id.localeCompare(b.device.id);
367
+ };
368
+ }
369
+ function ensureNeedCoverage(candidates, limit, needs, budgetUsd) {
370
+ const picks = candidates.slice(0, limit);
371
+ for (const need of needs) {
372
+ if (picks.some((pick) => pick.satisfied.includes(need)))
373
+ continue;
374
+ const replacement = candidates.find((candidate) => candidate.satisfied.includes(need));
375
+ if (!replacement || picks.includes(replacement))
376
+ continue;
377
+ const replaceIndex = replacementIndexFor(picks, needs);
378
+ if (replaceIndex >= 0)
379
+ picks[replaceIndex] = replacement;
380
+ }
381
+ return picks.sort(candidateSort(budgetUsd));
382
+ }
383
+ function replacementIndexFor(picks, needs) {
384
+ const coverage = new Map();
385
+ for (const need of needs) {
386
+ coverage.set(need, picks.filter((pick) => pick.satisfied.includes(need)).length);
387
+ }
388
+ let chosen = -1;
389
+ for (let index = picks.length - 1; index >= 0; index -= 1) {
390
+ const pick = picks[index];
391
+ if (!pick)
392
+ continue;
393
+ const contributesUnique = pick.satisfied.some((need) => coverage.get(need) === 1);
394
+ if (!contributesUnique) {
395
+ chosen = index;
396
+ break;
397
+ }
398
+ }
399
+ return chosen === -1 ? picks.length - 1 : chosen;
400
+ }
401
+ function computeFit(needs, first, budgetUsd, anyWithinBudget) {
402
+ if (!first)
403
+ return "none";
404
+ if (budgetUsd !== undefined && !anyWithinBudget)
405
+ return "none";
406
+ const meetsAllNeeds = needs.every((need) => first.satisfied.includes(need));
407
+ const meetsBudget = budgetUsd === undefined || first.withinBudget === true;
408
+ if (meetsAllNeeds && meetsBudget)
409
+ return "all";
410
+ return "partial";
411
+ }
412
+ function buildNotes(args) {
413
+ const notes = [];
414
+ if (args.budgetUsd !== undefined && !args.anyWithinBudget) {
415
+ // "Does what you asked" means the board meets the most stated needs any
416
+ // board can meet; among those, name the cheapest.
417
+ const bestCoverage = Math.max(0, ...args.candidates.map((candidate) => candidate.satisfied.length));
418
+ const cheapest = [...args.candidates]
419
+ .filter((candidate) => candidate.satisfied.length === bestCoverage)
420
+ .sort((a, b) => priceFor(a.device) - priceFor(b.device))[0];
421
+ if (cheapest) {
422
+ const what = args.needs.length > 0 ? "does what you asked" : "runs Muse";
423
+ notes.push(`Nothing on the Muse list fits a $${args.budgetUsd} budget. The cheapest board that ${what} is ${cheapest.device.name} at ${priceLabel(cheapest.device) ?? "an unknown price"}.`);
424
+ }
425
+ }
426
+ if (args.needs.length > 1 &&
427
+ args.candidates.length > 0 &&
428
+ !args.candidates.some((candidate) => args.needs.every((need) => candidate.satisfied.includes(need)))) {
429
+ const clauses = args.needs
430
+ .map((need) => {
431
+ const best = args.candidates.find((candidate) => candidate.satisfied.includes(need));
432
+ return best ? `${best.device.name} covers ${needLabel(need)}` : null;
433
+ })
434
+ .filter(Boolean);
435
+ if (clauses.length > 0) {
436
+ notes.push(`No single board has ${args.needs.map(needLabel).join(" and ")}. ${clauses.join("; ")}.`);
437
+ }
438
+ }
439
+ return notes;
440
+ }
441
+ function buildWhy(candidate) {
442
+ const fragments = candidate.satisfied.map((need) => satisfiedPhrase(need, candidate.board));
443
+ const prefix = fragments.length > 0
444
+ ? sentenceList(fragments)
445
+ : "Best available Muse gadget match";
446
+ return `${capitalize(prefix)}. ${candidate.board.note}`;
447
+ }
448
+ function satisfiedPhrase(need, board) {
449
+ switch (need) {
450
+ case "voice":
451
+ return "push-to-talk with spoken replies";
452
+ case "screen":
453
+ return board.tier === "full-ui" ? "full UI display" : "status display";
454
+ case "images":
455
+ return "images from Muse";
456
+ case "touch":
457
+ return "touch input";
458
+ case "camera":
459
+ return "camera capture";
460
+ case "air-sensors":
461
+ return "air-sensor readings";
462
+ case "e-ink":
463
+ return "e-paper status display";
464
+ case "battery":
465
+ return "battery-capable hardware";
466
+ case "round":
467
+ return "round display";
468
+ case "home-tunnel":
469
+ return "home-network tunnel";
470
+ case "big-screen":
471
+ return "a large display";
472
+ case "compute":
473
+ return "enough compute for server workloads";
474
+ case "linux":
475
+ return "Linux shell and file commands";
476
+ }
477
+ }
478
+ function needLabel(need) {
479
+ switch (need) {
480
+ case "air-sensors":
481
+ return "air sensors";
482
+ case "home-tunnel":
483
+ return "a home-network tunnel";
484
+ case "big-screen":
485
+ return "a big screen";
486
+ case "e-ink":
487
+ return "e-ink";
488
+ default:
489
+ return need;
490
+ }
491
+ }
492
+ function sentenceList(parts) {
493
+ if (parts.length <= 1)
494
+ return parts[0] ?? "";
495
+ if (parts.length === 2)
496
+ return `${parts[0]} and ${parts[1]}`;
497
+ return `${parts.slice(0, -1).join(", ")} and ${parts[parts.length - 1]}`;
498
+ }
499
+ function capitalize(text) {
500
+ return text.length === 0 ? text : `${text[0]?.toUpperCase()}${text.slice(1)}`;
501
+ }
502
+ function priceLabel(device) {
503
+ const min = device.est_used_price_usd_min;
504
+ const max = device.est_used_price_usd_max;
505
+ if (min === undefined && max === undefined)
506
+ return null;
507
+ if (min !== undefined && max !== undefined && min !== max)
508
+ return `$${min}-${max}`;
509
+ return `~$${min ?? max}`;
510
+ }
511
+ function priceFor(device) {
512
+ return device.est_used_price_usd_min ?? Number.POSITIVE_INFINITY;
513
+ }
514
+ function fabricationNote(device, printables) {
515
+ const physical = device.physical;
516
+ if (printables.length > 0 && physical) {
517
+ return `Print the stand: STL/STEP links above. Dimensions are from a ${physical.size_confidence} source; print once and check the fit.`;
518
+ }
519
+ if (!physical)
520
+ return "Use the vendor case.";
521
+ const needsMeasure = physical.size_mm.t === null ||
522
+ ["approximate", "conflicting"].includes(physical.size_confidence);
523
+ if (needsMeasure) {
524
+ const note = physical.size_note ?? "dimensions are incomplete or uncertain";
525
+ return `No printable part yet: ${note}. Measure the device, then run \`python -m hackshop_sim.cad.generate --device ${device.id} --part desk-stand --t <mm>\` from sim-worker/.`;
526
+ }
527
+ const mount = physical.mounting ?? "it ships in a finished case";
528
+ return `No printed part needed: it ships with its own stand or mount (${mount}).`;
529
+ }
530
+ function nextSteps(picks) {
531
+ const first = picks[0];
532
+ const steps = first
533
+ ? [`Start a build at ${first.build_page_url} to save the parts list, checklist and agent brief to My builds.`]
534
+ : ["Pick a supported board, then start a build to save the parts list, checklist and agent brief to My builds."];
535
+ steps.push("Get a Muse SDK token from gadgets.muse.ai (keep it private).");
536
+ if (first?.platform_id === "muse-linux") {
537
+ steps.push("On the machine: download install.sh, read it, then run `bash install.sh --sdk-token mgst_...` (use --run-as with a dedicated low-privilege user).", "Pair from the Muse app within 10 minutes.");
538
+ }
539
+ else if (first) {
540
+ steps.push(`Build: \`${first.build_command}\`, then flash with idf.py -p PORT flash monitor.`, "Pair it in the Muse app (Settings > Devices > Developer mode > Add Device).");
541
+ }
542
+ if (first && first.fabrication.printables.length > 0) {
543
+ steps.push("Print the desk stand (STL/STEP linked above) and check the fit.");
544
+ }
545
+ steps.push("Keep it personal and non-commercial: at most 50 devices per token, no selling.");
546
+ return steps;
547
+ }
548
+ function unknownOwnedDeviceWarnings(ids, catalogById) {
549
+ return ids
550
+ .filter((id) => !catalogById.has(id))
551
+ .map((id) => `Unknown device id "${id}" (not in the catalog); ignored.`);
552
+ }
553
+ function nonMuseAssistantWarnings(idea) {
554
+ const warnings = [];
555
+ for (const [pattern, name] of NON_MUSE_ASSISTANTS) {
556
+ if (pattern.test(idea)) {
557
+ warnings.push(`These boards run Meta's Muse agent. They won't work as an ${name} speaker.`);
558
+ }
559
+ }
560
+ return warnings;
561
+ }
562
+ function intakeQuestions(input, needs) {
563
+ const words = input.idea.trim().split(/\s+/).filter(Boolean);
564
+ const hasSizeWord = SIZE_WORDS.some((word) => wordBoundaryMatch(input.idea, word));
565
+ const vague = needs.length === 0 || words.length < 5 || !hasSizeWord;
566
+ if (!vague)
567
+ return [];
568
+ return [
569
+ {
570
+ id: "size",
571
+ question: "Where should this body live?",
572
+ why: "Size and placement decide whether a pocket remote, desk object, wall display, or hidden no-screen board fits.",
573
+ options: [
574
+ { label: "Pocket", value: "pocket", needs: ["battery"], size: "pocket" },
575
+ { label: "Desk", value: "desk", size: "desk" },
576
+ { label: "Wall or fridge", value: "wall", needs: ["big-screen"], size: "wall" },
577
+ { label: "Hidden, no screen", value: "hidden", needs: ["home-tunnel"], size: "any" },
578
+ ],
579
+ },
580
+ {
581
+ id: "interaction",
582
+ question: "How should you interact with it?",
583
+ why: "Muse boards split between spoken replies, touch screens, and simple light/button status.",
584
+ options: [
585
+ { label: "Talk to it", value: "voice", needs: ["voice"] },
586
+ { label: "Touch screen", value: "touch", needs: ["screen", "touch"] },
587
+ { label: "Light and button", value: "light-button", needs: ["home-tunnel"] },
588
+ ],
589
+ },
590
+ {
591
+ id: "sensing",
592
+ question: "Should it sense the room?",
593
+ why: "Camera and air-quality boards are specialized, so choosing this early prevents a mismatched build.",
594
+ options: [
595
+ { label: "Camera", value: "camera", needs: ["camera"] },
596
+ { label: "Air quality", value: "air-quality", needs: ["air-sensors"] },
597
+ { label: "None", value: "none" },
598
+ ],
599
+ },
600
+ {
601
+ id: "budget",
602
+ question: "What budget should I plan around?",
603
+ why: "The planner can keep over-budget boards from outranking cheaper workable choices.",
604
+ options: [
605
+ { label: "Under $25", value: "under-25", budget_usd: 25 },
606
+ { label: "Under $50", value: "under-50", budget_usd: 50 },
607
+ { label: "Under $100", value: "under-100", budget_usd: 100 },
608
+ { label: "No limit", value: "no-limit" },
609
+ ],
610
+ },
611
+ ];
612
+ }
613
+ function longestSide(device) {
614
+ const size = device.physical?.size_mm;
615
+ if (!size)
616
+ return null;
617
+ return Math.max(size.w, size.h, size.t ?? 0);
618
+ }
619
+ //# sourceMappingURL=plan-gadget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-gadget.js","sourceRoot":"","sources":["../../src/core/plan-gadget.ts"],"names":[],"mappings":"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"}