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.
- package/README.md +34 -34
- package/catalog.json +55 -41
- package/dist/build-plan/index.d.ts +10 -0
- package/dist/build-plan/index.js +550 -0
- package/dist/build-plan/index.js.map +1 -0
- package/dist/build-plan/types.d.ts +153 -0
- package/dist/build-plan/types.js +2 -0
- package/dist/build-plan/types.js.map +1 -0
- package/dist/catalog/schema.d.ts +13 -7
- package/dist/catalog/schema.js +2 -0
- package/dist/catalog/schema.js.map +1 -1
- package/dist/core/assess.d.ts +36 -0
- package/dist/core/assess.js +100 -0
- package/dist/core/assess.js.map +1 -0
- package/dist/core/errors.d.ts +2 -0
- package/dist/core/errors.js +70 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/links.d.ts +3 -0
- package/dist/core/links.js +19 -0
- package/dist/core/links.js.map +1 -0
- package/dist/core/plan-gadget.d.ts +85 -0
- package/dist/core/plan-gadget.js +619 -0
- package/dist/core/plan-gadget.js.map +1 -0
- package/dist/core/resources.d.ts +37 -0
- package/dist/core/resources.js +143 -0
- package/dist/core/resources.js.map +1 -0
- package/dist/core/safety.d.ts +7 -0
- package/dist/core/safety.js +28 -0
- package/dist/core/safety.js.map +1 -0
- package/dist/core/tools.d.ts +247 -0
- package/dist/core/tools.js +164 -0
- package/dist/core/tools.js.map +1 -0
- package/dist/core/types.d.ts +163 -0
- package/dist/core/types.js +17 -0
- package/dist/core/types.js.map +1 -0
- package/dist/platforms/index.d.ts +1 -1
- package/dist/platforms/index.js +3 -2
- package/dist/platforms/index.js.map +1 -1
- package/dist/platforms/schema.d.ts +204 -0
- package/dist/platforms/schema.js +11 -0
- package/dist/platforms/schema.js.map +1 -1
- package/dist/sampling.d.ts +1 -0
- package/dist/sampling.js +28 -3
- package/dist/sampling.js.map +1 -1
- package/dist/server.d.ts +14 -1
- package/dist/server.js +97 -85
- package/dist/server.js.map +1 -1
- package/dist/site-url.d.ts +1 -0
- package/dist/site-url.js +4 -0
- package/dist/site-url.js.map +1 -0
- package/dist/tools/assess_hackability.d.ts +2 -33
- package/dist/tools/assess_hackability.js +11 -83
- package/dist/tools/assess_hackability.js.map +1 -1
- package/dist/tools/get_build_plan.d.ts +6 -0
- package/dist/tools/get_build_plan.js +16 -0
- package/dist/tools/get_build_plan.js.map +1 -0
- package/dist/tools/plan_gadget.d.ts +2 -64
- package/dist/tools/plan_gadget.js +9 -401
- package/dist/tools/plan_gadget.js.map +1 -1
- package/dist/tools/propose_hardware.d.ts +3 -0
- package/dist/tools/propose_hardware.js +23 -10
- package/dist/tools/propose_hardware.js.map +1 -1
- package/package.json +1 -1
- package/platforms.json +352 -21
|
@@ -1,406 +1,14 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
1
|
import { getLoadedPlatforms, printablesFor } from "../platforms/index.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
"images",
|
|
7
|
-
"touch",
|
|
8
|
-
"camera",
|
|
9
|
-
"air-sensors",
|
|
10
|
-
"e-ink",
|
|
11
|
-
"battery",
|
|
12
|
-
"round",
|
|
13
|
-
"home-tunnel",
|
|
14
|
-
"big-screen",
|
|
15
|
-
"compute",
|
|
16
|
-
"linux",
|
|
17
|
-
];
|
|
18
|
-
const Need = z.enum(NEED_VALUES);
|
|
19
|
-
export const planGadgetInput = z.object({
|
|
20
|
-
idea: z.string().min(3).max(2000),
|
|
21
|
-
platform: z.enum(["muse-esp32", "muse-linux", "any"]).default("any"),
|
|
22
|
-
budget_usd: z.number().positive().max(100000).optional(),
|
|
23
|
-
owned_device_ids: z.array(z.string().min(1)).max(50).optional(),
|
|
24
|
-
needs: z.array(Need).optional(),
|
|
25
|
-
limit: z.number().int().min(1).max(5).default(3),
|
|
26
|
-
});
|
|
27
|
-
const NEED_ORDER = [...NEED_VALUES];
|
|
28
|
-
const HARD_NEEDS = new Set(["voice", "camera", "air-sensors", "e-ink", "linux"]);
|
|
29
|
-
const NEED_KEYWORDS = {
|
|
30
|
-
voice: [
|
|
31
|
-
"talk",
|
|
32
|
-
"talks",
|
|
33
|
-
"speak",
|
|
34
|
-
"speaks",
|
|
35
|
-
"voice",
|
|
36
|
-
"push-to-talk",
|
|
37
|
-
"ptt",
|
|
38
|
-
"ask",
|
|
39
|
-
"conversation",
|
|
40
|
-
"chat",
|
|
41
|
-
"mic",
|
|
42
|
-
"microphone",
|
|
43
|
-
"listen",
|
|
44
|
-
"companion",
|
|
45
|
-
],
|
|
46
|
-
screen: ["screen", "display", "show", "shows", "showing", "face", "avatar", "dashboard", "status"],
|
|
47
|
-
images: ["image", "images", "photo", "photos", "picture", "pictures", "art", "album"],
|
|
48
|
-
touch: ["touch", "touchscreen", "tap", "swipe"],
|
|
49
|
-
camera: ["camera", "see", "look", "looks", "watch", "watches", "vision"],
|
|
50
|
-
"air-sensors": ["air", "co2", "air quality", "tvoc", "humidity", "temperature"],
|
|
51
|
-
"e-ink": ["e-ink", "eink", "e-paper", "epaper"],
|
|
52
|
-
battery: ["battery", "portable", "pocket", "carry", "wearable", "keychain"],
|
|
53
|
-
round: ["round", "circle", "circular", "orb", "puck"],
|
|
54
|
-
"home-tunnel": ["home network", "lan", "smart home", "lights", "sonos", "hue", "tv"],
|
|
55
|
-
"big-screen": ["calendar", "wall", "fridge", "kitchen", "frame", "poster", "big screen", "large screen"],
|
|
56
|
-
compute: ["server", "home assistant", "homelab", "nas", "docker", "media server", "plex"],
|
|
57
|
-
linux: [
|
|
58
|
-
"shell",
|
|
59
|
-
"server",
|
|
60
|
-
"sysadmin",
|
|
61
|
-
"home assistant",
|
|
62
|
-
"homelab",
|
|
63
|
-
"raspberry pi",
|
|
64
|
-
"thin client",
|
|
65
|
-
"mini pc",
|
|
66
|
-
"nas",
|
|
67
|
-
"linux",
|
|
68
|
-
],
|
|
69
|
-
};
|
|
70
|
-
const CHEAP_KEYWORDS = ["cheap", "cheapest", "inexpensive", "budget", "low-cost", "affordable"];
|
|
2
|
+
import { siteUrlFromEnv } from "../site-url.js";
|
|
3
|
+
import { NEED_VALUES, planGadget as planGadgetCore, planGadgetInput, } from "../core/plan-gadget.js";
|
|
4
|
+
export { NEED_VALUES, planGadgetInput };
|
|
71
5
|
export function planGadget(input, catalog) {
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
for (const platform of 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
|
-
}));
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
candidates.sort((a, b) => {
|
|
99
|
-
if (b.score !== a.score)
|
|
100
|
-
return b.score - a.score;
|
|
101
|
-
const priceA = a.device.est_used_price_usd_min ?? Number.POSITIVE_INFINITY;
|
|
102
|
-
const priceB = b.device.est_used_price_usd_min ?? Number.POSITIVE_INFINITY;
|
|
103
|
-
if (priceA !== priceB)
|
|
104
|
-
return priceA - priceB;
|
|
105
|
-
return a.device.id.localeCompare(b.device.id);
|
|
6
|
+
const siteUrl = siteUrlFromEnv();
|
|
7
|
+
return planGadgetCore(input, {
|
|
8
|
+
catalog,
|
|
9
|
+
platforms: getLoadedPlatforms(),
|
|
10
|
+
printablesFor: (device, baseUrl) => printablesFor(device, baseUrl),
|
|
11
|
+
siteUrl,
|
|
106
12
|
});
|
|
107
|
-
const picks = candidates.slice(0, input.limit).map((candidate) => ({
|
|
108
|
-
device_id: candidate.device.id,
|
|
109
|
-
name: candidate.device.name,
|
|
110
|
-
platform_id: candidate.platform.id,
|
|
111
|
-
platform_name: candidate.platform.name,
|
|
112
|
-
support: candidate.board.support,
|
|
113
|
-
tier: candidate.board.tier,
|
|
114
|
-
tier_label: candidate.tierLabel,
|
|
115
|
-
score: candidate.score,
|
|
116
|
-
why: buildWhy(candidate),
|
|
117
|
-
gaps: candidate.gaps,
|
|
118
|
-
price_label: priceLabel(candidate.device),
|
|
119
|
-
links: candidate.device.firmware_links,
|
|
120
|
-
build_command: candidate.board.build,
|
|
121
|
-
setup_steps: candidate.platform.setup_steps,
|
|
122
|
-
caveats: caveatsFor(candidate.platform, candidate.board),
|
|
123
|
-
fabrication: {
|
|
124
|
-
printables: printablesFor(candidate.device),
|
|
125
|
-
note: fabricationNote(candidate.device),
|
|
126
|
-
},
|
|
127
|
-
}));
|
|
128
|
-
const pickedPlatforms = new Map();
|
|
129
|
-
for (const pick of picks) {
|
|
130
|
-
const platform = platforms.find((candidate) => candidate.id === pick.platform_id);
|
|
131
|
-
if (platform)
|
|
132
|
-
pickedPlatforms.set(platform.id, platform);
|
|
133
|
-
}
|
|
134
|
-
return {
|
|
135
|
-
inferred_needs: needs,
|
|
136
|
-
inferred_preferences: inferredPreferences,
|
|
137
|
-
picks,
|
|
138
|
-
terms: [...pickedPlatforms.values()].map((platform) => ({
|
|
139
|
-
platform_id: platform.id,
|
|
140
|
-
summary: platform.terms.summary,
|
|
141
|
-
url: platform.terms.url,
|
|
142
|
-
max_devices_per_token: platform.terms.max_devices_per_token,
|
|
143
|
-
selling_allowed: platform.terms.selling_allowed,
|
|
144
|
-
})),
|
|
145
|
-
next_steps: nextSteps(picks),
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
export function inferNeeds(idea) {
|
|
149
|
-
const found = new Set();
|
|
150
|
-
for (const need of NEED_ORDER) {
|
|
151
|
-
if (NEED_KEYWORDS[need].some((keyword) => wordBoundaryMatch(idea, keyword))) {
|
|
152
|
-
found.add(need);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
return [...found];
|
|
156
|
-
}
|
|
157
|
-
function inferPreferences(idea) {
|
|
158
|
-
return CHEAP_KEYWORDS.some((keyword) => wordBoundaryMatch(idea, keyword)) ? ["cheap"] : [];
|
|
159
|
-
}
|
|
160
|
-
function orderNeeds(needs) {
|
|
161
|
-
const given = new Set(needs);
|
|
162
|
-
return NEED_ORDER.filter((need) => given.has(need));
|
|
163
|
-
}
|
|
164
|
-
function wordBoundaryMatch(text, keyword) {
|
|
165
|
-
const escaped = keyword
|
|
166
|
-
.toLowerCase()
|
|
167
|
-
.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
|
|
168
|
-
.replace(/\s+/g, "\\s+");
|
|
169
|
-
return new RegExp(`(^|[^a-z0-9])${escaped}([^a-z0-9]|$)`, "i").test(text);
|
|
170
|
-
}
|
|
171
|
-
function scoreBoard(args) {
|
|
172
|
-
let score = 0;
|
|
173
|
-
const satisfied = [];
|
|
174
|
-
const gaps = [];
|
|
175
|
-
for (const need of args.needs) {
|
|
176
|
-
const result = satisfiesNeed(need, args.board, args.platform);
|
|
177
|
-
if (result.satisfied) {
|
|
178
|
-
score += 3;
|
|
179
|
-
satisfied.push(need);
|
|
180
|
-
}
|
|
181
|
-
else {
|
|
182
|
-
score += HARD_NEEDS.has(need) ? -4 : -1;
|
|
183
|
-
gaps.push(result.gap);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
if (args.board.tier === "full-ui")
|
|
187
|
-
score += 1;
|
|
188
|
-
if (args.board.support === "official")
|
|
189
|
-
score += 1;
|
|
190
|
-
if (args.board.eol) {
|
|
191
|
-
score -= 2;
|
|
192
|
-
gaps.push("End of life at the vendor");
|
|
193
|
-
}
|
|
194
|
-
if (args.owned)
|
|
195
|
-
score += 5;
|
|
196
|
-
if (args.cheapPreference) {
|
|
197
|
-
const minPrice = args.device.est_used_price_usd_min;
|
|
198
|
-
score -= minPrice === undefined ? 3 : Math.floor(minPrice / 20);
|
|
199
|
-
}
|
|
200
|
-
if (args.budgetUsd !== undefined &&
|
|
201
|
-
args.device.est_used_price_usd_min !== undefined &&
|
|
202
|
-
args.device.est_used_price_usd_min > args.budgetUsd) {
|
|
203
|
-
score -= 3;
|
|
204
|
-
gaps.push("over budget");
|
|
205
|
-
}
|
|
206
|
-
const needsLinux = args.needs.includes("linux");
|
|
207
|
-
if (args.platform.sdk_path === "linux") {
|
|
208
|
-
if (!needsLinux && !args.owned)
|
|
209
|
-
score -= 3;
|
|
210
|
-
if (args.board.features.ble_builtin === false)
|
|
211
|
-
score -= 1;
|
|
212
|
-
if (args.board.features.ble_builtin === true)
|
|
213
|
-
score += 1;
|
|
214
|
-
}
|
|
215
|
-
return {
|
|
216
|
-
device: args.device,
|
|
217
|
-
platform: args.platform,
|
|
218
|
-
board: args.board,
|
|
219
|
-
tierLabel: args.tierLabel,
|
|
220
|
-
score,
|
|
221
|
-
satisfied,
|
|
222
|
-
gaps,
|
|
223
|
-
};
|
|
224
|
-
}
|
|
225
|
-
function satisfiesNeed(need, board, platform) {
|
|
226
|
-
switch (need) {
|
|
227
|
-
case "voice": {
|
|
228
|
-
const pushToTalk = board.features.push_to_talk;
|
|
229
|
-
const audio = board.features.audio;
|
|
230
|
-
if (pushToTalk === "voice" && audio === "speaker-mic")
|
|
231
|
-
return { satisfied: true };
|
|
232
|
-
if (pushToTalk === "text")
|
|
233
|
-
return { satisfied: false, gap: "voice: text replies only" };
|
|
234
|
-
if (audio === "buzzer-mic") {
|
|
235
|
-
return { satisfied: false, gap: "voice: no speaker (buzzer only)" };
|
|
236
|
-
}
|
|
237
|
-
return { satisfied: false, gap: "voice: no push-to-talk with spoken replies" };
|
|
238
|
-
}
|
|
239
|
-
case "screen":
|
|
240
|
-
return board.tier === "full-ui" || ["status-screen", "e-paper"].includes(board.kind)
|
|
241
|
-
? { satisfied: true }
|
|
242
|
-
: { satisfied: false, gap: "screen: no display UI" };
|
|
243
|
-
case "images":
|
|
244
|
-
return typeof board.features.images === "string" && board.features.images !== "none"
|
|
245
|
-
? { satisfied: true }
|
|
246
|
-
: { satisfied: false, gap: "images: no image display" };
|
|
247
|
-
case "touch":
|
|
248
|
-
return board.features.touch === true
|
|
249
|
-
? { satisfied: true }
|
|
250
|
-
: { satisfied: false, gap: "touch: no touch input" };
|
|
251
|
-
case "camera":
|
|
252
|
-
return board.features.camera === true
|
|
253
|
-
? { satisfied: true }
|
|
254
|
-
: { satisfied: false, gap: "camera: no camera" };
|
|
255
|
-
case "air-sensors":
|
|
256
|
-
return board.features.air_sensors === true
|
|
257
|
-
? { satisfied: true }
|
|
258
|
-
: { satisfied: false, gap: "air sensors: no air-quality sensors" };
|
|
259
|
-
case "e-ink":
|
|
260
|
-
return board.kind === "e-paper"
|
|
261
|
-
? { satisfied: true }
|
|
262
|
-
: { satisfied: false, gap: "e-ink: not an e-paper board" };
|
|
263
|
-
case "battery":
|
|
264
|
-
return board.features.battery === "yes" || board.features.battery === "optional"
|
|
265
|
-
? { satisfied: true }
|
|
266
|
-
: { satisfied: false, gap: "battery: no portable power option" };
|
|
267
|
-
case "round":
|
|
268
|
-
return board.features.round_display === true
|
|
269
|
-
? { satisfied: true }
|
|
270
|
-
: { satisfied: false, gap: "round: not a round display" };
|
|
271
|
-
case "home-tunnel":
|
|
272
|
-
return board.features.home_tunnel === true
|
|
273
|
-
? { satisfied: true }
|
|
274
|
-
: { satisfied: false, gap: "home network: no Muse home-network tunnel" };
|
|
275
|
-
case "big-screen":
|
|
276
|
-
return featureNumber(board, "display_in") >= 3.5
|
|
277
|
-
? { satisfied: true }
|
|
278
|
-
: { satisfied: false, gap: "big screen: display under 3.5 inches" };
|
|
279
|
-
case "compute":
|
|
280
|
-
return ["standard", "desktop"].includes(featureString(board, "compute") ?? "")
|
|
281
|
-
? { satisfied: true }
|
|
282
|
-
: { satisfied: false, gap: "compute: too light for server workloads" };
|
|
283
|
-
case "linux":
|
|
284
|
-
return platform.sdk_path === "linux"
|
|
285
|
-
? { satisfied: true }
|
|
286
|
-
: { satisfied: false, gap: "linux: not a Linux gadget" };
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
function featureNumber(board, key) {
|
|
290
|
-
const value = board.features[key];
|
|
291
|
-
return typeof value === "number" ? value : Number.NEGATIVE_INFINITY;
|
|
292
|
-
}
|
|
293
|
-
function featureString(board, key) {
|
|
294
|
-
const value = board.features[key];
|
|
295
|
-
return typeof value === "string" ? value : null;
|
|
296
|
-
}
|
|
297
|
-
function buildWhy(candidate) {
|
|
298
|
-
const fragments = candidate.satisfied.map((need) => satisfiedPhrase(need, candidate.board));
|
|
299
|
-
const prefix = fragments.length > 0
|
|
300
|
-
? sentenceList(fragments)
|
|
301
|
-
: "Best available Muse gadget match";
|
|
302
|
-
return `${capitalize(prefix)}. ${candidate.board.note}`;
|
|
303
|
-
}
|
|
304
|
-
function satisfiedPhrase(need, board) {
|
|
305
|
-
switch (need) {
|
|
306
|
-
case "voice":
|
|
307
|
-
return "push-to-talk with spoken replies";
|
|
308
|
-
case "screen":
|
|
309
|
-
return board.tier === "full-ui" ? "full UI display" : "status display";
|
|
310
|
-
case "images":
|
|
311
|
-
return "images from Muse";
|
|
312
|
-
case "touch":
|
|
313
|
-
return "touch input";
|
|
314
|
-
case "camera":
|
|
315
|
-
return "camera capture";
|
|
316
|
-
case "air-sensors":
|
|
317
|
-
return "air-sensor readings";
|
|
318
|
-
case "e-ink":
|
|
319
|
-
return "e-paper status display";
|
|
320
|
-
case "battery":
|
|
321
|
-
return "battery-capable hardware";
|
|
322
|
-
case "round":
|
|
323
|
-
return "round display";
|
|
324
|
-
case "home-tunnel":
|
|
325
|
-
return "home-network tunnel";
|
|
326
|
-
case "big-screen":
|
|
327
|
-
return "a large display";
|
|
328
|
-
case "compute":
|
|
329
|
-
return "enough compute for server workloads";
|
|
330
|
-
case "linux":
|
|
331
|
-
return "Linux shell and file commands";
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
function sentenceList(parts) {
|
|
335
|
-
if (parts.length <= 1)
|
|
336
|
-
return parts[0] ?? "";
|
|
337
|
-
if (parts.length === 2)
|
|
338
|
-
return `${parts[0]} and ${parts[1]}`;
|
|
339
|
-
return `${parts.slice(0, -1).join(", ")} and ${parts[parts.length - 1]}`;
|
|
340
|
-
}
|
|
341
|
-
function capitalize(text) {
|
|
342
|
-
return text.length === 0 ? text : `${text[0]?.toUpperCase()}${text.slice(1)}`;
|
|
343
|
-
}
|
|
344
|
-
function priceLabel(device) {
|
|
345
|
-
const min = device.est_used_price_usd_min;
|
|
346
|
-
const max = device.est_used_price_usd_max;
|
|
347
|
-
if (min === undefined && max === undefined)
|
|
348
|
-
return null;
|
|
349
|
-
if (min !== undefined && max !== undefined && min !== max)
|
|
350
|
-
return `$${min}-${max}`;
|
|
351
|
-
return `~$${min ?? max}`;
|
|
352
|
-
}
|
|
353
|
-
function caveatsFor(platform, board) {
|
|
354
|
-
const homeTunnel = board.features.home_tunnel;
|
|
355
|
-
const caveats = platform.caveats.filter((caveat) => {
|
|
356
|
-
const lower = caveat.toLowerCase();
|
|
357
|
-
const psramNoTunnel = lower.includes("without psram") || lower.includes("without the home-network tunnel");
|
|
358
|
-
const tunnelFoothold = lower.includes("home-network tunnel lets") || lower.includes("foothold on your network");
|
|
359
|
-
if (psramNoTunnel)
|
|
360
|
-
return homeTunnel === false;
|
|
361
|
-
if (tunnelFoothold)
|
|
362
|
-
return homeTunnel === true;
|
|
363
|
-
return true;
|
|
364
|
-
});
|
|
365
|
-
if (board.eol)
|
|
366
|
-
caveats.push("End of life at the vendor");
|
|
367
|
-
if (board.support === "possible")
|
|
368
|
-
caveats.push(board.note);
|
|
369
|
-
return caveats;
|
|
370
|
-
}
|
|
371
|
-
function fabricationNote(device) {
|
|
372
|
-
const physical = device.physical;
|
|
373
|
-
const printables = printablesFor(device);
|
|
374
|
-
if (printables.length > 0 && physical) {
|
|
375
|
-
return `Print the stand: STL/STEP links above. Dimensions are from a ${physical.size_confidence} source; print once and check the fit.`;
|
|
376
|
-
}
|
|
377
|
-
if (!physical)
|
|
378
|
-
return "Use the vendor case.";
|
|
379
|
-
const needsMeasure = physical.size_mm.t === null ||
|
|
380
|
-
["approximate", "conflicting"].includes(physical.size_confidence);
|
|
381
|
-
if (needsMeasure) {
|
|
382
|
-
const note = physical.size_note ?? "dimensions are incomplete or uncertain";
|
|
383
|
-
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/.`;
|
|
384
|
-
}
|
|
385
|
-
const mount = physical.mounting ?? "it ships in a finished case";
|
|
386
|
-
return `No printed part needed: it ships with its own stand or mount (${mount}).`;
|
|
387
|
-
}
|
|
388
|
-
function nextSteps(picks) {
|
|
389
|
-
const first = picks[0];
|
|
390
|
-
const steps = ["Get a Muse SDK token from gadgets.muse.ai (keep it private)."];
|
|
391
|
-
if (first?.platform_id === "muse-linux") {
|
|
392
|
-
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.");
|
|
393
|
-
}
|
|
394
|
-
else if (first) {
|
|
395
|
-
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).");
|
|
396
|
-
}
|
|
397
|
-
else {
|
|
398
|
-
steps.push("Pick a supported board, then build and pair it from the Muse app.");
|
|
399
|
-
}
|
|
400
|
-
if (first && first.fabrication.printables.length > 0) {
|
|
401
|
-
steps.push("Print the desk stand (STL/STEP linked above) and check the fit.");
|
|
402
|
-
}
|
|
403
|
-
steps.push("Keep it personal and non-commercial: at most 50 devices per token, no selling.");
|
|
404
|
-
return steps;
|
|
405
13
|
}
|
|
406
14
|
//# sourceMappingURL=plan_gadget.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan_gadget.js","sourceRoot":"","sources":["../../src/tools/plan_gadget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAkB,MAAM,uBAAuB,CAAC;AAG1F,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,aAAa;IACb,OAAO;IACP,SAAS;IACT,OAAO;IACP,aAAa;IACb,YAAY;IACZ,SAAS;IACT,OAAO;CACC,CAAC;AAEX,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAKjC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;IACjC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IACpE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;IACxD,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC/D,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;IAC/B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;CACjD,CAAC,CAAC;AAsCH,MAAM,UAAU,GAAW,CAAC,GAAG,WAAW,CAAC,CAAC;AAE5C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAEvF,MAAM,aAAa,GAA2B;IAC5C,KAAK,EAAE;QACL,MAAM;QACN,OAAO;QACP,OAAO;QACP,QAAQ;QACR,OAAO;QACP,cAAc;QACd,KAAK;QACL,KAAK;QACL,cAAc;QACd,MAAM;QACN,KAAK;QACL,YAAY;QACZ,QAAQ;QACR,WAAW;KACZ;IACD,MAAM,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC;IAClG,MAAM,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC;IACrF,KAAK,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,CAAC;IAC/C,MAAM,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;IACxE,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,CAAC;IAC/E,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC;IAC/C,OAAO,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC;IAC3E,KAAK,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC;IACrD,aAAa,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;IACpF,YAAY,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,CAAC;IACxG,OAAO,EAAE,CAAC,QAAQ,EAAE,gBAAgB,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,CAAC;IACzF,KAAK,EAAE;QACL,OAAO;QACP,QAAQ;QACR,UAAU;QACV,gBAAgB;QAChB,SAAS;QACT,cAAc;QACd,aAAa;QACb,SAAS;QACT,KAAK;QACL,OAAO;KACR;CACF,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;AAYhG,MAAM,UAAU,UAAU,CACxB,KAAsB,EACtB,OAAsB;IAEtB,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1E,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7E,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,UAAU,GAAkB,EAAE,CAAC;IAErC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,CAAC,QAAQ;YAAE,SAAS;QACzE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChF,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAChD,IAAI,CAAC,MAAM;gBAAE,SAAS;YACtB,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;gBACzB,MAAM;gBACN,QAAQ;gBACR,KAAK;gBACL,SAAS,EAAE,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI;gBACnD,KAAK;gBACL,SAAS,EAAE,KAAK,CAAC,UAAU;gBAC3B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3B,eAAe,EAAE,mBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC;aACvD,CAAC,CAAC,CAAC;QACN,CAAC;IACH,CAAC;IAED,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACvB,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK;YAAE,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;QAClD,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,sBAAsB,IAAI,MAAM,CAAC,iBAAiB,CAAC;QAC3E,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,sBAAsB,IAAI,MAAM,CAAC,iBAAiB,CAAC;QAC3E,IAAI,MAAM,KAAK,MAAM;YAAE,OAAO,MAAM,GAAG,MAAM,CAAC;QAC9C,OAAO,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACjE,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE;QAC9B,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI;QAC3B,WAAW,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;QAClC,aAAa,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI;QACtC,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,OAAO;QAChC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI;QAC1B,UAAU,EAAE,SAAS,CAAC,SAAS;QAC/B,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC;QACxB,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,WAAW,EAAE,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC;QACzC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,cAAc;QACtC,aAAa,EAAE,SAAS,CAAC,KAAK,CAAC,KAAK;QACpC,WAAW,EAAE,SAAS,CAAC,QAAQ,CAAC,WAAW;QAC3C,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAC;QACxD,WAAW,EAAE;YACX,UAAU,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC;YAC3C,IAAI,EAAE,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC;SACxC;KACF,CAAC,CAAC,CAAC;IAEJ,MAAM,eAAe,GAAG,IAAI,GAAG,EAAoB,CAAC;IACpD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC,WAAW,CAAC,CAAC;QAClF,IAAI,QAAQ;YAAE,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO;QACL,cAAc,EAAE,KAAK;QACrB,oBAAoB,EAAE,mBAAmB;QACzC,KAAK;QACL,KAAK,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACtD,WAAW,EAAE,QAAQ,CAAC,EAAE;YACxB,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO;YAC/B,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG;YACvB,qBAAqB,EAAE,QAAQ,CAAC,KAAK,CAAC,qBAAqB;YAC3D,eAAe,EAAE,QAAQ,CAAC,KAAK,CAAC,eAAe;SAChD,CAAC,CAAC;QACH,UAAU,EAAE,SAAS,CAAC,KAAK,CAAC;KAC7B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAQ,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;YAC5E,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7F,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,OAAe;IACtD,MAAM,OAAO,GAAG,OAAO;SACpB,WAAW,EAAE;SACb,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC;SACtC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,OAAO,IAAI,MAAM,CAAC,gBAAgB,OAAO,eAAe,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,UAAU,CAAC,IASnB;IACC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,SAAS,GAAW,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAa,EAAE,CAAC;IAE1B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9D,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,KAAK,IAAI,CAAC,CAAC;YACX,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,KAAK,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS;QAAE,KAAK,IAAI,CAAC,CAAC;IAC9C,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,UAAU;QAAE,KAAK,IAAI,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QACnB,KAAK,IAAI,CAAC,CAAC;QACX,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,IAAI,CAAC,KAAK;QAAE,KAAK,IAAI,CAAC,CAAC;IAE3B,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC;QACpD,KAAK,IAAI,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,IACE,IAAI,CAAC,SAAS,KAAK,SAAS;QAC5B,IAAI,CAAC,MAAM,CAAC,sBAAsB,KAAK,SAAS;QAChD,IAAI,CAAC,MAAM,CAAC,sBAAsB,GAAG,IAAI,CAAC,SAAS,EACnD,CAAC;QACD,KAAK,IAAI,CAAC,CAAC;QACX,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACvC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,KAAK,IAAI,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,KAAK,KAAK;YAAE,KAAK,IAAI,CAAC,CAAC;QAC1D,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,KAAK,IAAI;YAAE,KAAK,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,KAAK;QACL,SAAS;QACT,IAAI;KACL,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,IAAU,EACV,KAAoB,EACpB,QAAkB;IAElB,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;YACnC,IAAI,UAAU,KAAK,OAAO,IAAI,KAAK,KAAK,aAAa;gBAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YAClF,IAAI,UAAU,KAAK,MAAM;gBAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,0BAA0B,EAAE,CAAC;YACxF,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;gBAC3B,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,iCAAiC,EAAE,CAAC;YACtE,CAAC;YACD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,4CAA4C,EAAE,CAAC;QACjF,CAAC;QACD,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;gBAClF,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;gBACrB,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,uBAAuB,EAAE,CAAC;QACzD,KAAK,QAAQ;YACX,OAAO,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,MAAM;gBAClF,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;gBACrB,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,0BAA0B,EAAE,CAAC;QAC5D,KAAK,OAAO;YACV,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,KAAK,IAAI;gBAClC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;gBACrB,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,uBAAuB,EAAE,CAAC;QACzD,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,IAAI;gBACnC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;gBACrB,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,mBAAmB,EAAE,CAAC;QACrD,KAAK,aAAa;YAChB,OAAO,KAAK,CAAC,QAAQ,CAAC,WAAW,KAAK,IAAI;gBACxC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;gBACrB,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,qCAAqC,EAAE,CAAC;QACvE,KAAK,OAAO;YACV,OAAO,KAAK,CAAC,IAAI,KAAK,SAAS;gBAC7B,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;gBACrB,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,6BAA6B,EAAE,CAAC;QAC/D,KAAK,SAAS;YACZ,OAAO,KAAK,CAAC,QAAQ,CAAC,OAAO,KAAK,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,KAAK,UAAU;gBAC9E,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;gBACrB,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,mCAAmC,EAAE,CAAC;QACrE,KAAK,OAAO;YACV,OAAO,KAAK,CAAC,QAAQ,CAAC,aAAa,KAAK,IAAI;gBAC1C,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;gBACrB,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,4BAA4B,EAAE,CAAC;QAC9D,KAAK,aAAa;YAChB,OAAO,KAAK,CAAC,QAAQ,CAAC,WAAW,KAAK,IAAI;gBACxC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;gBACrB,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,2CAA2C,EAAE,CAAC;QAC7E,KAAK,YAAY;YACf,OAAO,aAAa,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,GAAG;gBAC9C,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;gBACrB,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,sCAAsC,EAAE,CAAC;QACxE,KAAK,SAAS;YACZ,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;gBAC5E,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;gBACrB,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,yCAAyC,EAAE,CAAC;QAC3E,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,QAAQ,KAAK,OAAO;gBAClC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;gBACrB,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,2BAA2B,EAAE,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,KAAoB,EAAE,GAAW;IACtD,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAClC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC;AACtE,CAAC;AAED,SAAS,aAAa,CAAC,KAAoB,EAAE,GAAW;IACtD,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAClC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC;AAED,SAAS,QAAQ,CAAC,SAAsB;IACtC,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5F,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC;QACjC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC;QACzB,CAAC,CAAC,kCAAkC,CAAC;IACvC,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;AAC1D,CAAC;AAED,SAAS,eAAe,CAAC,IAAU,EAAE,KAAoB;IACvD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO;YACV,OAAO,kCAAkC,CAAC;QAC5C,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,gBAAgB,CAAC;QACzE,KAAK,QAAQ;YACX,OAAO,kBAAkB,CAAC;QAC5B,KAAK,OAAO;YACV,OAAO,aAAa,CAAC;QACvB,KAAK,QAAQ;YACX,OAAO,gBAAgB,CAAC;QAC1B,KAAK,aAAa;YAChB,OAAO,qBAAqB,CAAC;QAC/B,KAAK,OAAO;YACV,OAAO,wBAAwB,CAAC;QAClC,KAAK,SAAS;YACZ,OAAO,0BAA0B,CAAC;QACpC,KAAK,OAAO;YACV,OAAO,eAAe,CAAC;QACzB,KAAK,aAAa;YAChB,OAAO,qBAAqB,CAAC;QAC/B,KAAK,YAAY;YACf,OAAO,iBAAiB,CAAC;QAC3B,KAAK,SAAS;YACZ,OAAO,qCAAqC,CAAC;QAC/C,KAAK,OAAO;YACV,OAAO,+BAA+B,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAe;IACnC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;AAC3E,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAChF,CAAC;AAED,SAAS,UAAU,CAAC,MAAmB;IACrC,MAAM,GAAG,GAAG,MAAM,CAAC,sBAAsB,CAAC;IAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,sBAAsB,CAAC;IAC1C,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACxD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,GAAG;QAAE,OAAO,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;IACnF,OAAO,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,UAAU,CAAC,QAAkB,EAAE,KAAoB;IAC1D,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;IAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;QACjD,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,iCAAiC,CAAC,CAAC;QAC3G,MAAM,cAAc,GAAG,KAAK,CAAC,QAAQ,CAAC,0BAA0B,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC;QAChH,IAAI,aAAa;YAAE,OAAO,UAAU,KAAK,KAAK,CAAC;QAC/C,IAAI,cAAc;YAAE,OAAO,UAAU,KAAK,IAAI,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,GAAG;QAAE,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACzD,IAAI,KAAK,CAAC,OAAO,KAAK,UAAU;QAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3D,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,eAAe,CAAC,MAAmB;IAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,EAAE,CAAC;QACtC,OAAO,gEAAgE,QAAQ,CAAC,eAAe,wCAAwC,CAAC;IAC1I,CAAC;IACD,IAAI,CAAC,QAAQ;QAAE,OAAO,sBAAsB,CAAC;IAE7C,MAAM,YAAY,GAChB,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI;QAC3B,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IACpE,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,IAAI,wCAAwC,CAAC;QAC5E,OAAO,0BAA0B,IAAI,iFAAiF,MAAM,CAAC,EAAE,iDAAiD,CAAC;IACnL,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,IAAI,6BAA6B,CAAC;IACjE,OAAO,iEAAiE,KAAK,IAAI,CAAC;AACpF,CAAC;AAED,SAAS,SAAS,CAAC,KAAgC;IACjD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,KAAK,GAAG,CAAC,8DAA8D,CAAC,CAAC;IAE/E,IAAI,KAAK,EAAE,WAAW,KAAK,YAAY,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CACR,mJAAmJ,EACnJ,2CAA2C,CAC5C,CAAC;IACJ,CAAC;SAAM,IAAI,KAAK,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CACR,YAAY,KAAK,CAAC,aAAa,mDAAmD,EAClF,6EAA6E,CAC9E,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;IAClF,CAAC;IAED,IAAI,KAAK,IAAI,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;IAChF,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,gFAAgF,CAAC,CAAC;IAC7F,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
1
|
+
{"version":3,"file":"plan_gadget.js","sourceRoot":"","sources":["../../src/tools/plan_gadget.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE1E,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EACL,WAAW,EACX,UAAU,IAAI,cAAc,EAC5B,eAAe,GAKhB,MAAM,wBAAwB,CAAC;AAMhC,OAAO,EAAE,WAAW,EAAE,eAAe,EAAqE,CAAC;AAK3G,MAAM,UAAU,UAAU,CACxB,KAAsB,EACtB,OAAsB;IAEtB,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IACjC,OAAO,cAAc,CAAC,KAAK,EAAE;QAC3B,OAAO;QACP,SAAS,EAAE,kBAAkB,EAAE;QAC/B,aAAa,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC,MAAqB,EAAE,OAAO,CAAC;QACjF,OAAO;KACR,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -38,6 +38,9 @@ export interface ProposeOutput {
|
|
|
38
38
|
reasoning: string;
|
|
39
39
|
degraded: boolean;
|
|
40
40
|
message?: string;
|
|
41
|
+
note?: string;
|
|
42
|
+
reasoning_unavailable?: boolean;
|
|
43
|
+
try_instead?: "plan_gadget";
|
|
41
44
|
}
|
|
42
45
|
export declare function shortlistCandidates(catalog: DeviceEntry[], idea: string): DeviceEntry[];
|
|
43
46
|
export declare function proposeHardware(input: ProposeInput, catalog: DeviceEntry[], server: Server): Promise<ProposeOutput>;
|
|
@@ -97,6 +97,11 @@ export async function proposeHardware(input, catalog, server) {
|
|
|
97
97
|
degraded: true,
|
|
98
98
|
};
|
|
99
99
|
}
|
|
100
|
+
const hostAdvertisesSampling = Boolean(server.getClientCapabilities?.()?.sampling);
|
|
101
|
+
const hasApiKey = Boolean(process.env.ANTHROPIC_API_KEY);
|
|
102
|
+
if (!hostAdvertisesSampling && !hasApiKey) {
|
|
103
|
+
return degradedCatalogMatches(input, catalog, "Your MCP host doesn't support sampling and no ANTHROPIC_API_KEY is set, so these are catalog matches without AI reasoning. For Muse gadgets, call plan_gadget (instant, no key needed).");
|
|
104
|
+
}
|
|
100
105
|
// Pass the FULL catalog to sampling when small; lets the LLM weigh all
|
|
101
106
|
// options. Shortlist only as the degraded-mode fallback.
|
|
102
107
|
const fullCatalog = catalog.length <= 100 ? catalog : shortlistCandidates(catalog, input.idea);
|
|
@@ -117,27 +122,19 @@ export async function proposeHardware(input, catalog, server) {
|
|
|
117
122
|
userPrompt,
|
|
118
123
|
maxTokens: 1500,
|
|
119
124
|
diagnostics,
|
|
125
|
+
hostSamplingTimeoutMs: 45_000,
|
|
120
126
|
});
|
|
121
127
|
// Degraded path: every reasoning attempt failed (host sampling + retry +
|
|
122
128
|
// optional Anthropic API fallback). Use the alias-aware shortlist as the
|
|
123
129
|
// best available approximation. Honest about the degradation.
|
|
124
130
|
if (!sampled || !Array.isArray(sampled.picks)) {
|
|
125
|
-
const shortlisted = shortlistCandidates(catalog, input.idea);
|
|
126
|
-
const fallback = shortlisted.slice(0, 5).map((d) => buildProposal(d, "Reasoning unavailable; matched against catalog tags only."));
|
|
127
131
|
// If a key WAS present but the API fallback threw (e.g. retired model id),
|
|
128
132
|
// surface that specific reason instead of the misleading "no fallback was
|
|
129
133
|
// configured" message — otherwise the failure is invisible (stderr only).
|
|
130
134
|
const reasoning = diagnostics.apiFallbackError
|
|
131
135
|
? `Reasoning unavailable. ${diagnostics.apiFallbackError} Returning catalog matches by tag overlap.`
|
|
132
136
|
: "Reasoning unavailable. The host LLM failed and no Anthropic API fallback was configured. Returning catalog matches by tag overlap. Set ANTHROPIC_API_KEY in the MCP server's env config to enable reasoning even on hosts without sampling/createMessage support.";
|
|
133
|
-
return
|
|
134
|
-
proposals: fallback,
|
|
135
|
-
reasoning,
|
|
136
|
-
degraded: true,
|
|
137
|
-
...(diagnostics.apiFallbackError
|
|
138
|
-
? { message: diagnostics.apiFallbackError }
|
|
139
|
-
: {}),
|
|
140
|
-
};
|
|
137
|
+
return degradedCatalogMatches(input, catalog, reasoning, diagnostics.apiFallbackError);
|
|
141
138
|
}
|
|
142
139
|
const proposals = [];
|
|
143
140
|
for (const pick of sampled.picks.slice(0, 5)) {
|
|
@@ -160,6 +157,22 @@ export async function proposeHardware(input, catalog, server) {
|
|
|
160
157
|
degraded: false,
|
|
161
158
|
};
|
|
162
159
|
}
|
|
160
|
+
function degradedCatalogMatches(input, catalog, note, message) {
|
|
161
|
+
const shortlisted = shortlistCandidates(catalog, input.idea);
|
|
162
|
+
const fallback = shortlisted.slice(0, 5).map((d) => buildProposal(d, "Reasoning unavailable; matched against catalog tags only."));
|
|
163
|
+
return {
|
|
164
|
+
proposals: fallback,
|
|
165
|
+
reasoning: note,
|
|
166
|
+
degraded: true,
|
|
167
|
+
reasoning_unavailable: true,
|
|
168
|
+
note,
|
|
169
|
+
...(message ? { message } : {}),
|
|
170
|
+
...(mentionsMuseAgent(input.idea) ? { try_instead: "plan_gadget" } : {}),
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
function mentionsMuseAgent(idea) {
|
|
174
|
+
return /\b(muse|agent gadget|agent body|physical body|body for you|ai body)\b/i.test(idea);
|
|
175
|
+
}
|
|
163
176
|
function buildProposal(device, whyThisFits) {
|
|
164
177
|
const safety = applyBrickRiskSafety(device);
|
|
165
178
|
const links = buildLinks(device);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"propose_hardware.js","sourceRoot":"","sources":["../../src/tools/propose_hardware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,UAAU,EAA4B,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAoB,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAsB,MAAM,uBAAuB,CAAC;AAE9E,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAC1E,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;IACxD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;CAC5C,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"propose_hardware.js","sourceRoot":"","sources":["../../src/tools/propose_hardware.ts"],"names":[],"mappings":"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"}
|